<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>RandomThink.net</title>
    <link>http://new.randomthink.net/</link>
    <description>Recent content on RandomThink.net</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Tue, 31 Dec 2013 00:00:00 +0000</lastBuildDate>
    <atom:link href="http://new.randomthink.net/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
      <title>2013 in review</title>
      <link>http://new.randomthink.net/blog/2013/12/2013-in-review/</link>
      <pubDate>Tue, 31 Dec 2013 00:00:00 +0000</pubDate>
      
      <guid>http://new.randomthink.net/blog/2013/12/2013-in-review/</guid>
      <description>

&lt;p&gt;Inspired by several similar sorts of posts (and the realization that this will be only my second post this year), it feels like a good time to look at 2013, as well as to look forward a bit at some things I&amp;rsquo;d like to change next year.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;h2 id=&#34;good-things-in-2013:6952050b9e1420a71eb0f6251c95742e&#34;&gt;Good Things in 2013&lt;/h2&gt;

&lt;p&gt;There were several things that went well this year.&lt;/p&gt;

&lt;h3 id=&#34;logan-s-first-calendar-year:6952050b9e1420a71eb0f6251c95742e&#34;&gt;Logan&amp;rsquo;s first calendar year&lt;/h3&gt;

&lt;p&gt;This year was the first year that I was a dad from start to finish. Logan aged from seven months to nineteen months, and getting to watch his growth and development during 2013 was nothing short of amazing. I wish I could find words for how it feels to watch him grow and learn. Each and every day still has new things, and watching my baby grow into a toddler has been the highlight of the year.&lt;/p&gt;

&lt;h3 id=&#34;professional-growth:6952050b9e1420a71eb0f6251c95742e&#34;&gt;Professional Growth&lt;/h3&gt;

&lt;p&gt;Back in July, I started a new job with &lt;a href=&#34;http://www.bazaarvoice.com&#34;&gt;Bazaarvoice&lt;/a&gt;, which has been a great experience so far. It&amp;rsquo;s a completely different stack of technology than anything I&amp;rsquo;ve worked with before, at an amazing scale (over half a billion people load BV content each month).&lt;/p&gt;

&lt;p&gt;I do miss my training travel to various spots all over the US, but if I had to pick one city to be my primary travel target, Austin is a pretty great choice.&lt;/p&gt;

&lt;p&gt;Additionally, I got to talk at a couple of national-level events, which was pretty awesome. I was one of the first speakers in the new Trainer Track at &lt;a href=&#34;http://2013.jsconf.us/&#34;&gt;JSConf 2013&lt;/a&gt;, and I gave a talk on Debugging at &lt;a href=&#34;http://events.jquery.org/2013/austin/&#34;&gt;jQuery Conference Austin&lt;/a&gt;. (I&amp;rsquo;ll be giving an updated version of the Debugging talk at &lt;a href=&#34;http://events.jquery.org/2014/san-diego/&#34;&gt;jQuery Conference San Diego&lt;/a&gt; in February!)&lt;/p&gt;

&lt;h3 id=&#34;travel:6952050b9e1420a71eb0f6251c95742e&#34;&gt;Travel&lt;/h3&gt;

&lt;p&gt;It was another fun year for travel. In the first half of the year, I got to visit some places I hadn&amp;rsquo;t been before. I really enjoyed Atlanta, and visiting Amelia Island for JSConf was pretty amazing. Logan also had his first out-of-state trips, including road trips to Arizona and Colorado (both for weddings) and a flight to Austin for my orientation week.&lt;/p&gt;

&lt;p&gt;Also travel-related, but not &lt;em&gt;my&lt;/em&gt; travel, my good friend [Mark Z][] came to visit in October for the [Albuquerque International Balloon Fiesta][], after several years of discussing it. It was a great visit, and definitely one of the highlights of the year.&lt;/p&gt;

&lt;h2 id=&#34;not-as-good-things-in-2013:6952050b9e1420a71eb0f6251c95742e&#34;&gt;Not-as-good Things in 2013&lt;/h2&gt;

&lt;p&gt;I&amp;rsquo;m not normally one to dwell on the negatives, but in assessing the year, I think it&amp;rsquo;s important to at least look a &lt;em&gt;little&lt;/em&gt; bit at some of the things that weren&amp;rsquo;t as good.&lt;/p&gt;

&lt;h3 id=&#34;weight-and-diet:6952050b9e1420a71eb0f6251c95742e&#34;&gt;Weight and Diet&lt;/h3&gt;

&lt;p&gt;Back in early 2010, I was able to find some willpower and made some changes that resulted in the best weight loss I&amp;rsquo;d had in my adult life. I made it down to 217 at my low point (which was the lowest I&amp;rsquo;d been since high school). Shortly after that, I started a work-from-home job and became quite sedentary. Over the course of the past few years, I&amp;rsquo;ve completely undone all of that loss, to the point that as of this year, I&amp;rsquo;m very near to my highest weight ever.&lt;/p&gt;

&lt;h3 id=&#34;communication:6952050b9e1420a71eb0f6251c95742e&#34;&gt;Communication&lt;/h3&gt;

&lt;p&gt;I feel like I&amp;rsquo;ve done a really poor job of keeping in touch with my friends and family. I know communication is a two-way street, and it&amp;rsquo;s not all on me, but I&amp;rsquo;ve been less available, both in-person and online, and it&amp;rsquo;s definitely something I could work on.&lt;/p&gt;

&lt;h2 id=&#34;looking-forward:6952050b9e1420a71eb0f6251c95742e&#34;&gt;Looking Forward&lt;/h2&gt;

&lt;p&gt;A few days ago, I read an article on &lt;a href=&#34;http://www.entrepreneur.com/article/230333&#34;&gt;developing systems instead of goals&lt;/a&gt;, and it really resonated with me. I feel that I can greatly attribute my career successes to date (which I&amp;rsquo;m fairly proud of) on the fact that I didn&amp;rsquo;t really set specific goals, so much as that I had systems to develop myself professionally. Keeping that in mind, there&amp;rsquo;s a few things I&amp;rsquo;d like to work on in the upcoming years (not just 2014).&lt;/p&gt;

&lt;h3 id=&#34;be-more-active:6952050b9e1420a71eb0f6251c95742e&#34;&gt;Be More Active&lt;/h3&gt;

&lt;p&gt;During the last week of 2013, we were all pretty sick with some stomach bug. In an effort to feel better, we took a walk on a couple of days, and it really reminded me how much I used to enjoy trying to walk (and even run) a few years ago. I wound up pushing myself a bit even, and in this past week, I&amp;rsquo;ve walked over eight miles (most of those while pushing Logan in a stroller). I plan to simply take a bit of time each week to get out and move more.&lt;/p&gt;

&lt;h3 id=&#34;get-back-to-writing:6952050b9e1420a71eb0f6251c95742e&#34;&gt;Get Back to Writing&lt;/h3&gt;

&lt;p&gt;I have all these things I want to write about. I like the idea of small personal asides as well as larger technical writeups, and I plan to do more of both. In particular, I&amp;rsquo;ve developed a passion for knowing as much as I can about DevTools in Chrome and Firefox, and I&amp;rsquo;d like to share some of the more useful tidbits and ideas.&lt;/p&gt;

&lt;h3 id=&#34;personal-hobbies:6952050b9e1420a71eb0f6251c95742e&#34;&gt;Personal Hobbies&lt;/h3&gt;

&lt;p&gt;I haven&amp;rsquo;t really spent all that much time on personal hobbies in the past year or two. While I did acquire several new board games in 2013, I didn&amp;rsquo;t spend tons of time actually playing them. There&amp;rsquo;s a challenge on BoardGameGeek to &lt;a href=&#34;http://boardgamegeek.com/geeklist/166160/2014-challenge-play-10-games-10-times-each&#34;&gt;play 10 games 10 times each&lt;/a&gt; that I&amp;rsquo;d like to complete. Too often, I&amp;rsquo;d purchase a game, find one chance to play it, and move on. I need to really take time to enjoy the things I have, rather than constantly looking for new things.&lt;/p&gt;

&lt;p&gt;I&amp;rsquo;ve also not read many books for almost two years. I&amp;rsquo;m fairly sure March 2012 was the last time I read something other than a technical book.&lt;/p&gt;

&lt;h2 id=&#34;thanks:6952050b9e1420a71eb0f6251c95742e&#34;&gt;Thanks&lt;/h2&gt;

&lt;p&gt;While not perfect, 2013 was a pretty solid year. Here&amp;rsquo;s looking forward to 2014!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Board Gaming Nights</title>
      <link>http://new.randomthink.net/blog/2013/06/board-gaming-nights/</link>
      <pubDate>Sun, 09 Jun 2013 00:00:00 +0000</pubDate>
      
      <guid>http://new.randomthink.net/blog/2013/06/board-gaming-nights/</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Board games are fun. If you live in ABQ, we should play more. I have an idea on how to do that. If you don&amp;rsquo;t live in ABQ and/or aren&amp;rsquo;t interested in board games, you should probably skip this post.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;While I was off and away at the amazing &lt;a href=&#34;http://2013.jsconf.us/&#34;&gt;JSConf 2013&lt;/a&gt;, my latest board game acquisition (&lt;a href=&#34;http://playtmg.com/products/belfort&#34;&gt;Belfort&lt;/a&gt;, from a Kickstarter) was delivered. I decided that I&amp;rsquo;d use Logan&amp;rsquo;s nap today to set it up. It amounted to having to apply 144 stickers (gross) to little wooden blocks along with popping of several chits for money and whatnot.&lt;/p&gt;

&lt;p&gt;This afternoon, while he napped some more, I remembered that another board game I own (&lt;a href=&#34;http://www.kickstarter.com/projects/michaelmindes/ground-floor-a-business-building-board-game&#34;&gt;Ground Floor&lt;/a&gt;, also from a Kickstarter) hadn&amp;rsquo;t been set up either, and so I popped out pieces from 13 boards worth of game pieces for money and building improvements and whatnot.&lt;/p&gt;

&lt;p&gt;I looked at these games as I set them up, and found myself thinking about the hobby. While I enjoy the process of setting up board games to be played, I really enjoy actually playing them too. I got to play a decent bit of games on my trip (which I should also blog about at some point soon), but it got me thinking about ways to play more games.&lt;/p&gt;

&lt;p&gt;I still plan on doing my annual birthday party gaming event, but trying to do that more than once a year isn&amp;rsquo;t something that I could pull off before we had Logan, and it&amp;rsquo;s definitely not something we can pull now. Even with friends who do the occasional gaming day, the reality is that attending a day of gaming is simply not feasible for the time being.&lt;/p&gt;

&lt;p&gt;In recent months, I&amp;rsquo;ve managed to occasionally get in a board game during lunch with friends, but that&amp;rsquo;s been hard to set up as well, and the time pressures of squeezing in a game over lunch means we have to play something with a 60 minute or less timeframe, and honestly, playing a 60 minute game at lunch means lunch is running too long anyways.&lt;/p&gt;

&lt;p&gt;On my last night in Boston, I went to the &lt;a href=&#34;http://loft.bocoup.com/&#34;&gt;Bocoup Loft&lt;/a&gt; to play games. I was feeling nervous because I didn&amp;rsquo;t get there until like 8pm, and I was thinking about my 8am flight the next day and thinking I was going to be sacrificing some sleep in order to really get some games going.&lt;/p&gt;

&lt;p&gt;Instead, we played one really good seven person round of 7 Wonders, then a couple of rounds of a little very light game, and that was it. I was there maybe two hours. However, I still had a lot of fun. It had the joy of getting some gaming going, without feeling like this weighty commitment.&lt;/p&gt;

&lt;p&gt;So, all that being said, what I think I&amp;rsquo;d like to try now is to organize a few gaming nights here and there at my home, but different from the gaming days in some important ways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Just a couple of hours. While I can&amp;rsquo;t put together a long lunch or a full day very easily, Logan is very consistently in bed and asleep by 7:30pm, meaning 8-10pm would work well for me, and I suspect/hope for most people.&lt;/li&gt;
&lt;li&gt;Just one game. Pick something and play it as many times as we can in the two hours. This likely means just one playthrough, but that&amp;rsquo;s okay. We can then talk and reflect and move on.&lt;/li&gt;
&lt;li&gt;Just a few people. No need to have a dozen or more people over. Enough to play. Most games only really work well with 3-6 people anyways. Not that I don&amp;rsquo;t love the parties, but it&amp;rsquo;d mess with the first couple of goals.&lt;/li&gt;
&lt;li&gt;Keep it light. People often feel like the party is an obligation or a big commitment, and I want this to be a casual thing that people can do without feeling like it&amp;rsquo;s an obligation or burden to attend.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I&amp;rsquo;m thinking of trying this out near the end of the month, probably on a Tuesday. I&amp;rsquo;d like to run Belfort, which claims to be 90-120 minutes of play. Normally that&amp;rsquo;d mean it&amp;rsquo;s going to take more like 2-3 hours, but if people are willing to invest a little time beforehand, there&amp;rsquo;s a fantastic series on &lt;a href=&#34;http://www.youtube.com/user/WatchItPlayed&#34;&gt;Watch It Played&lt;/a&gt; that covers &lt;a href=&#34;http://www.youtube.com/playlist?list=PLHvfN_pNBj_F-_E5NwUceptFLZ0eSj0OH&#34;&gt;how to play Belfort&lt;/a&gt; in pretty thorough detail. The first video shows game setup and describes turns, and the rest are a detailed playthrough.&lt;/p&gt;

&lt;p&gt;Thoughts? Any interest?&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Breakpoint Actions in JavaScript</title>
      <link>http://new.randomthink.net/blog/2012/11/breakpoint-actions-in-javascript/</link>
      <pubDate>Wed, 28 Nov 2012 00:00:00 +0000</pubDate>
      
      <guid>http://new.randomthink.net/blog/2012/11/breakpoint-actions-in-javascript/</guid>
      <description>&lt;p&gt;Earlier today, I filled out the &lt;a href=&#34;https://docs.google.com/forms/d/1hhZwGQmtNeiRhPwxLurPaVElB0h_E6h_qjnzpxAXdtI/viewform&#34;&gt;Chrome DevTools Survey &amp;amp; Feedback&lt;/a&gt;
(which you should too, if you&amp;rsquo;re a web developer), and near the bottom of the
survey, there was a question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Are there any tools or features you think are missing that would better help
you develop your webapps?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;My initial answer was No, there wasn&amp;rsquo;t anything I felt was missing. DevTools are
awesome, and there hasn&amp;rsquo;t really been anything I&amp;rsquo;ve felt like I needed.&lt;/p&gt;

&lt;p&gt;Later in the day, I ran into a very common scenario: I was debugging something
where I wanted to observe a value at a particular line of code. There are
a couple of ways to approach it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Drop in a &lt;code&gt;debugger&lt;/code&gt; statement or set a breakpoint to stop execution and use
the console and/or watch statements to observe the value&lt;/li&gt;
&lt;li&gt;Inject some &lt;code&gt;console.log&lt;/code&gt; statements to write the value out to the console&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this case, the &lt;code&gt;console.log&lt;/code&gt; approach would be ideal. However, I didn&amp;rsquo;t have
access to modify the code directly, and while I could have used the live
editing features, it was also minified code, meaning that live edit was an ugly
option.&lt;/p&gt;

&lt;p&gt;Thinking back to the survey question, I now had an answer: Wouldn&amp;rsquo;t it be nice
if there was some way to have some sort of action kicked off, breakpoint-style,
where I&amp;rsquo;m not editing the code directly?&lt;/p&gt;

&lt;p&gt;I asked some friends, and it turns out, other development environments have a
similar concept. Xcode has &lt;a href=&#34;http://useyourloaf.com/blog/2011/02/21/xcode-breakpoint-actions.html&#34;&gt;Breakpoint Actions&lt;/a&gt; (as do some other IDEs) which
look to be exactly what I wanted. While bouncing this idea around, I realized
that I could actually fake it in the browser, right now.&lt;/p&gt;

&lt;p&gt;Chrome supports conditional breakpoints. Adding them is easy. First, find the
line you want to set a breakpoint on, and click the line number to apply a
breakpoint like normal:&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://new.randomthink.net/img/blog/2012-11-28-breakpoint-actions/breakpoints-1.png&#34; alt=&#34;Set a breakpoint&#34; /&gt;
&lt;/p&gt;

&lt;p&gt;Then you right-click on it, and select &amp;ldquo;Edit Breakpoint&amp;rdquo;:&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://new.randomthink.net/img/blog/2012-11-28-breakpoint-actions/breakpoints-2.png&#34; alt=&#34;Edit Breakpoint&#34; /&gt;
&lt;/p&gt;

&lt;p&gt;You&amp;rsquo;re presented with your cursor in a field like so, where you can define an
expression. If the expression evaluates to a truthy value, execution will break
here.&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://new.randomthink.net/img/blog/2012-11-28-breakpoint-actions/breakpoints-3.png&#34; alt=&#34;Set Condition&#34; /&gt;
&lt;/p&gt;

&lt;p&gt;It&amp;rsquo;s not uncommon to set simple expressions like &lt;code&gt;someObj.id === &#39;1&#39;&lt;/code&gt;, but I
realized that &lt;em&gt;any&lt;/em&gt; valid JS expression would be evaluated any time this line
was hit &amp;ndash; including the &lt;code&gt;console.log&lt;/code&gt; statement I wanted to add!&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://new.randomthink.net/img/blog/2012-11-28-breakpoint-actions/breakpoints-4.png&#34; alt=&#34;console.log dirtiness&#34; /&gt;
&lt;/p&gt;

&lt;p&gt;This approach works quite well. Looking over at the console after moving my
mouse around a bit on this page (which happens to be the &lt;a href=&#34;https://developers.google.com/chrome-developer-tools/docs/scripts-breakpoints&#34;&gt;Chrome DevTools
Breakpoints page&lt;/a&gt;), you can clearly see the added
&lt;code&gt;console.log&lt;/code&gt; firing:&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://new.randomthink.net/img/blog/2012-11-28-breakpoint-actions/breakpoints-5.png&#34; alt=&#34;console.log is working!&#34; /&gt;
&lt;/p&gt;

&lt;p&gt;Since &lt;code&gt;console.log&lt;/code&gt; doesn&amp;rsquo;t have a meaningful return value, the &lt;code&gt;undefined&lt;/code&gt;
means the conditional breakpoint won&amp;rsquo;t pause execution, and the code moves on.
It&amp;rsquo;s just like a coded &lt;code&gt;console.log&lt;/code&gt; statement, without having to actually
modify the code.&lt;/p&gt;

&lt;p&gt;Using a conditional breakpoint like this feels horribly hacky, and yet, I love
this idea. It achieves the exact goal that I wanted. It&amp;rsquo;s not elegant, it&amp;rsquo;s not
by design, but it gets the job done, like so many other things in web
development.&lt;/p&gt;

&lt;p&gt;As an added note, Firebug supports conditional breakpoints in much the same
way, and this approach totally works there as well. In both cases, it&amp;rsquo;s working
simply because you&amp;rsquo;re just evaluating the expression, and only pausing
execution if it evaluates to a truthy value.&lt;/p&gt;

&lt;p&gt;Hopefully you&amp;rsquo;ll find this useful at some point! I already have.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Callbacks and Promises</title>
      <link>http://new.randomthink.net/blog/2012/10/callbacks-and-promises/</link>
      <pubDate>Thu, 18 Oct 2012 00:00:00 +0000</pubDate>
      
      <guid>http://new.randomthink.net/blog/2012/10/callbacks-and-promises/</guid>
      <description>&lt;p&gt;Anyone who&amp;rsquo;s written even a little bit of JavaScript is likely familiar with the
callback pattern. Even if you don&amp;rsquo;t know it by that name, you&amp;rsquo;ve probably
written code using it. When calling a function, we&amp;rsquo;ll pass it another function
as an argument, which will be used to let us know that something has happened.
In particular, callbacks are frequently used for responding to things that
happen asynchronously.&lt;/p&gt;

&lt;p&gt;For example, event handling is based on this pattern. We take a DOM node and
provide it with a callback function so that when the associated event occurs on
that node, it has a way of letting us know what&amp;rsquo;s going on.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;``` javascript Simple document-based click handler
document.addEventListener(&amp;ldquo;click&amp;rdquo;, function(e){
  console.log(&amp;ldquo;Document was clicked!&amp;rdquo;);
}, false);&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
This sort of code is very commonplace, and is one of the more powerful features
of JavaScript. When using code that accepts callbacks, we don&#39;t usually think
too much of it.

As we create richer applications, we&#39;ll often need to create functions that pass
information back to our users. If the information we&#39;re passing back comes from
asynchronous sources, it may be beneficial to create functions that that accept
callbacks. Because JavaScript functions are [first-class objects][1], you can
receive them as arguments, and then simply invoke them.

I prefer [Dojo][] these days, but for simplicity&#39;s sake, I&#39;ll show an example
using [jQuery][], as I suspect that will be more familiar to most people.

``` javascript Simple function that accepts a callback
function getManagers(callback){
  // Kick off our Ajax request for information.
  $.ajax({
    url: &amp;quot;/company/allEmployees.json&amp;quot;,
    dataType: &amp;quot;json&amp;quot;,
    success: function(data) {
      // Using our callback, provide manager data to our user.
      if (data.managers &amp;amp;&amp;amp; typeof callback == &amp;quot;function&amp;quot;) {
        callback(data.managers);
      }
    }
  });
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Notice that in this case, I&amp;rsquo;m not returning anything from the &lt;code&gt;getManagers&lt;/code&gt;
function. I&amp;rsquo;m communicating with my user by invoking the callback they&amp;rsquo;ve
provided to me. This approach is very effective, and people are generally
comfortable with using callback-driven functions, so it&amp;rsquo;s a solid and perfectly
valid way to write code. It could also be extended to handle not just a callback
for success states, but another one for errors.&lt;/p&gt;

&lt;p&gt;``` javascript Improved version with callback/errback support
function getManagers(callback, errback){
  // Kick off our Ajax request for information
  $.ajax({
    url: &amp;ldquo;/company/allEmployees.json&amp;rdquo;,
    dataType: &amp;ldquo;json&amp;rdquo;,
    success: function(data) {
      // We&amp;rsquo;re breaking the logic to check just for managers first,
      // in order to better facilitate error handling.
      if (data.managers) {
        // We have our data, so invoke our callback.
        if (typeof callback == &amp;ldquo;function&amp;rdquo;) {
          callback(data.managers);
        }
      } else if (typeof errback == &amp;ldquo;function&amp;rdquo;) {
        // We have no manager data, so if we have an errback,
        // give it something meaningful to indicate failure.
        errback(new Error(&amp;ldquo;No managers found&amp;rdquo;));
      }
    },
    error: function(jqXHR, textStatus, errorThrown) {
      // If we have the errback, just give it the error we got.
      if (typeof errback == &amp;ldquo;function&amp;rdquo;) {
        errback(errorThrown);
      }
    }
  });
}&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
Using this function is actually quite easy:

``` javascript Using getManagers
// Simply call it and provide your callback.
// In this case, I&#39;m not going to worry about errors.
getManagers(function(managers){
  for (var i = 0, l = managers.length; i &amp;lt; l; i++) {
    // Do something with each manager here
  }
});
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Writing code that accepts callbacks and uses them is really simple. That being
said, callbacks can lead to tightly coupled code. It means that I have to know
how I want to process my information at the point of retrieving it. It makes it
more difficult to write reusable abstractions of the process used to request
data.&lt;/p&gt;

&lt;p&gt;Fortunately, there is another approach available to us. Modern JavaScript
libraries and toolkits offer us implementations of a concept known as promises.
In general terms, a promise is simply an object that represents the value of an
asynchronous action. It&amp;rsquo;s kind of like an IOU for information. It also happens
to fit the above scenario quite well.&lt;/p&gt;

&lt;p&gt;If you&amp;rsquo;re using Dojo or jQuery, you already have promises available to you. You
can create a Deferred object, which is the mechanism for creating and managing
promises.&lt;/p&gt;

&lt;p&gt;Working with Deferreds is quite easy. You simply create an instance of the
Deferred constructor, and then when your value is ready, you &lt;code&gt;resolve&lt;/code&gt; the
instance with the value that it represents. If you hit an error state, you can
&lt;code&gt;reject&lt;/code&gt; the instance. Let&amp;rsquo;s take the above example and rework it to be using
promises instead of callbacks.&lt;/p&gt;

&lt;p&gt;``` javascript Getting managers via Deferreds / promises
function getManagers(){
  // Create our Deferred instance
  var deferred = new $.Deferred();&lt;/p&gt;

&lt;p&gt;// Then, we&amp;rsquo;ll perform our Ajax request like before.
  $.ajax({
    url: &amp;ldquo;/company/allEmployees.json&amp;rdquo;,
    dataType: &amp;ldquo;json&amp;rdquo;,
    success: function(data) {
      // This time though, we&amp;rsquo;ll simply resolve or reject
      // our Deferred instances.
      if (data.managers) {
        deferred.resolve(data.managers);
      } else {
        deferred.reject(new Error(&amp;ldquo;No managers found&amp;rdquo;));
      }
    },
    error: function(jqXHR, textStatus, errorThrown) {
      deferred.reject(errorThrown);
    }
  });&lt;/p&gt;

&lt;p&gt;// Give our user the promise object that represents
  // our managers.
  return deferred.promise();
}&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
One key difference above is that we&#39;re actively providing a return value now,
whereas in the callback-based version, we didn&#39;t. This object that we&#39;re
returning is the promise that we&#39;re giving to our user, and it provides them
with the ability to get the information we&#39;re promising, once that data is
available.

The Deferred is the mechanism by which I manage the promise. It gives me the
ability to create a promise that I provide to my end user, as well as the
ability to then fulfill that promise in a meaningful way.

This approach almost feels synchronous. I create an object at the top of my
function, and I return it at the bottom. The user doesn&#39;t give me a callback,
but I give the user a meaningful object.

The promise object gives your user a `then` method, which they can then use to
attach a callback and get access to the value, like so:

``` javascript Using the return value from getManagers as a promise
getManagers().then(function(managers){
  for (var i = 0, l = managers.length; i &amp;lt; l; i++) {
    // Do something with each manager here,
    // such as render a list item.
  }
});
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;There is still a callback in action here, but now it&amp;rsquo;s being managed in the code
that is consuming the information, rather than in the code that is providing it.
We&amp;rsquo;ve effectively decoupled the process of retrieving information from the
process of consuming it, which is a huge win for creating reusable code.&lt;/p&gt;

&lt;p&gt;There&amp;rsquo;s also something to be said about reading promise-based code. It feels
very natural. I take this action, &lt;code&gt;then&lt;/code&gt; I take this other action. It can reduce
excessive amounts of indentation, especially when doing a lot of Ajax work at
once.&lt;/p&gt;

&lt;p&gt;In fact, this approach is so powerful that both jQuery and Dojo already provide
a promise as the return value of their Ajax systems. Dojo 1.8&amp;rsquo;s new
&lt;code&gt;dojo/request&lt;/code&gt; module is explicitly promise-driven, so requests look like this:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;javascript Using dojo/request to perform a request
require([&amp;quot;dojo/request&amp;quot;], function(request){
  request.get(&amp;quot;/company/allEmployees.json&amp;quot;, {
    handleAs: &amp;quot;json&amp;quot;
  }).then(function(data){
    // Work with your data here
  });
});
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;When creating your own modules of code to abstract away the process of data
retrieval from data consumption, both callbacks and promises are valid &amp;ndash;
there&amp;rsquo;s not one right way to do it. However, using a promise means that you&amp;rsquo;re
giving your users back a meaningful object, and how they deal with the
information is up to them. It leads to loosely coupled code, which in turn leads
to better reuse and modularization.&lt;/p&gt;

&lt;p&gt;Hopefully you&amp;rsquo;ll consider using promises in your next application! I&amp;rsquo;ve barely
scratched the surface of what makes them awesome. Check out the links below for
much more information on promises and Deferreds. Thanks for reading!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dojo:

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://dojotoolkit.org/documentation/tutorials/1.8/deferreds/&#34;&gt;Getting Started with Deferreds&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://dojotoolkit.org/documentation/tutorials/1.8/promises/&#34;&gt;Dojo Deferreds and Promises&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;jQuery:

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://api.jquery.com/category/deferred-object/&#34;&gt;Deferred Object&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://wiki.commonjs.org/wiki/Promises/A&#34;&gt;Promises/A specification&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Full Reboot</title>
      <link>http://new.randomthink.net/blog/2012/10/full-reboot/</link>
      <pubDate>Sat, 13 Oct 2012 00:00:00 +0000</pubDate>
      
      <guid>http://new.randomthink.net/blog/2012/10/full-reboot/</guid>
      <description>&lt;p&gt;So, I said that I was going to be using &lt;a href=&#34;http://www.wordpress.org/&#34;&gt;WordPress&lt;/a&gt; and not using
&lt;a href=&#34;http://www.octopress.org/&#34;&gt;OctoPress&lt;/a&gt; but after I got things all set up back in WP, I found the
experience of writing to be kind of frustrating. I&amp;rsquo;d written some post drafts in
Markdown, and have really been enjoying that format. I also don&amp;rsquo;t like not
having version control in play. I was able to use Markdown for my WP posts, but
having to edit in Vim and then copy/paste over and preview, it got kind of
annoying.&lt;/p&gt;

&lt;p&gt;While OctoPress is definitely a bit more manual than something like WP, it turns
out that I&amp;rsquo;m okay with that. I&amp;rsquo;ve taken a little time in the evenings after my
brain is burnt out on other things and used it to poke and prod OctoPress into
doing what I want. This new site is the end result.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;Additionally, I figured out how to adjust my nginx settings such that any
missing files are now going to redirect to a mirror of my old site, so I&amp;rsquo;m
basically making a clean break. For the first time in over a decade, the folder
that houses RandomThink.net is basically clean. Feels good, if a little scary
for some reason.&lt;/p&gt;

&lt;p&gt;To provide a bit more detail, I&amp;rsquo;m using the 2.1 branch of Octopress. After some
discussions on Twitter, it sounds like 2.1 was basically good to go except for
migrations from 2.0. Since I&amp;rsquo;m not reusing the brianarn@github experiment, no
issues there.&lt;/p&gt;

&lt;p&gt;I&amp;rsquo;ve found that OctoPress 2.1 offered some nice things, like the &amp;ldquo;Respectfully
Social&amp;rdquo; setting, wherein the Tweet / FB / G+ links at the bottom of each post
are really just basic links and not the full awful weight of their various APIs.
It also felt way easier to specify a few things, such as having a landing page
that isn&amp;rsquo;t just the blog posts.&lt;/p&gt;

&lt;p&gt;It was also fairly easy to set up where my feeds
and all should exist, and as such, the main links to individual blog posts, the
main blog page, and the RSS should all &lt;em&gt;just work&lt;/em&gt;. I think.&lt;/p&gt;

&lt;p&gt;While I&amp;rsquo;m still very obviously using the OctoPress theme, I&amp;rsquo;ve made some
customizations. I&amp;rsquo;ve taken the gradient out of the link bar above, and I really
like how clean that looks. I&amp;rsquo;ve shrunk the sidebar a bit. I&amp;rsquo;ve also completely
reset &lt;a href=&#34;http://www.google.com/webfonts#UsePlace:use/Collection:Source+Code+Pro|Andada|Varela+Round&#34;&gt;my font choices&lt;/a&gt; (while still using the Google webfont service).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Monospace: Source Code Pro. I&amp;rsquo;ve been using it in Vim and iTerm 2 for awhile,
and I&amp;rsquo;m really quite a fan.&lt;/li&gt;
&lt;li&gt;Sans-serif: Varela Round. There was just something about it that I liked.&lt;/li&gt;
&lt;li&gt;Serif: Andada. Honestly, I picked this one because Google webfonts suggested
it as a pairing with Varela Round. I tried some others, and this one was the
best.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I ran the fonts by &lt;a href=&#34;http://twitter.com/futuraprime&#34;&gt;Evan&lt;/a&gt; and he seemed to approve, and he&amp;rsquo;s my font
authority, so I trust that it looks okay.&lt;/p&gt;

&lt;p&gt;I&amp;rsquo;ve also brought my old &lt;a href=&#34;http://www.randomthink.net/&#34;&gt;landing page&lt;/a&gt; over because I&amp;rsquo;m kind of attached to
that stupid mockup image now.&lt;/p&gt;

&lt;p&gt;I&amp;rsquo;m now doing all my blogging through Vim and using git to version control it
all, and pushing &lt;a href=&#34;https://github.com/brianarn/randomthink.net&#34;&gt;the full site source&lt;/a&gt; up to &lt;a href=&#34;http://github.com/&#34;&gt;GitHub&lt;/a&gt; as well. That means that all my everything for
the full site is going to be in source control. Feels good, man.&lt;/p&gt;

&lt;p&gt;Now to finally finish that &amp;ldquo;Callbacks vs. Promises&amp;rdquo; post that I&amp;rsquo;ve been stewing
on for a month.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Git Flow Solo</title>
      <link>http://new.randomthink.net/blog/2012/10/git-flow-solo/</link>
      <pubDate>Tue, 02 Oct 2012 00:00:00 +0000</pubDate>
      
      <guid>http://new.randomthink.net/blog/2012/10/git-flow-solo/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;http://new.randomthink.net/images/blog/2012-10-02-git-flow-solo-graph.png&#34; alt=&#34;Git Log with Graph&#34; /&gt;
&lt;/p&gt;

&lt;p&gt;The other day on Twitter, I was discussing workflow with my friend &lt;a href=&#34;http://geoffpetrie.com/&#34;&gt;Geoff&lt;/a&gt;,
and I mentioned that I use &lt;a href=&#34;http://nvie.com/posts/a-successful-git-branching-model/&#34;&gt;Git Flow&lt;/a&gt; for some of the work that I do. He
mentioned that he&amp;rsquo;s a solo developer on most of his projects, and so he&amp;rsquo;s more
of a &lt;a href=&#34;http://scottchacon.com/2011/08/31/github-flow.html&#34;&gt;GitHub Flow&lt;/a&gt; kind of guy. I&amp;rsquo;ve read Scott Chacon&amp;rsquo;s post on GitHub Flow
in the past, and it&amp;rsquo;s a nice and light system. However, I find that Git Flow
gives me some great power, and it seems worth discussing how it helps me as a
solo developer.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;I work for &lt;a href=&#34;http://www.sitepen.com/&#34;&gt;SitePen&lt;/a&gt; by day, but in the evenings and on weekends I have a
side project for &lt;a href=&#34;http://coe.unm.edu/&#34;&gt;UNM&amp;rsquo;s College of Education&lt;/a&gt;. While I do have a project
lead who does most of the styling work and sets direction for the project, I&amp;rsquo;m
doing the full stack of development. It&amp;rsquo;s a pretty straight-forward LAMP stack
application that, over the past four years, has moved from being a basic
forms-driven site to a very rich and powerful application. It&amp;rsquo;s built up using
&lt;a href=&#34;http://jquery.com/&#34;&gt;jQuery&lt;/a&gt; and a couple of plugins for things like validation and grids and
whatnot, and while I prefer &lt;a href=&#34;http://www.dojotoolkit.org/&#34;&gt;Dojo&lt;/a&gt; these days, it&amp;rsquo;s not an option here due
to legacy. Anyhow, I manage this application&amp;rsquo;s source with &lt;a href=&#34;http://nvie.com/posts/a-successful-git-branching-model/&#34;&gt;Git Flow&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Our source code (which is not public, unfortunately) has several branches
influenced by the design of Git Flow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;master&lt;/code&gt;: This branch is production-ready. Nothing goes on &lt;code&gt;master&lt;/code&gt; without
acceptance from the project lead.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;develop&lt;/code&gt;: This branch houses code that has been accepted, but not deployed
into production just yet.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;feature/*&lt;/code&gt;: There are typically one or more branches that start with
&lt;code&gt;feature/&lt;/code&gt;, and these are where I am actively doing 80% of my work.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hotfix/&lt;/code&gt;: There is often one or two of these showing up, and it accounts
for the other 20% of work performed.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;qa&lt;/code&gt;: This is a non-Git-Flow branch that I use to track the current state of
the testing server.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We&amp;rsquo;ve used a variety of project management tools in the past (currently using
&lt;a href=&#34;https://trello.com/&#34;&gt;Trello&lt;/a&gt;) and at any one time, I typically have two to three feature
requests on my plate, and these features take anywhere from one week to one
month to implement. The workflow typically goes like so:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a branch off of &lt;code&gt;develop&lt;/code&gt;: &lt;code&gt;git flow feature start some-feature&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Cook until golden brown and flaky, committing changes both small and large
as I go&lt;/li&gt;
&lt;li&gt;Once ready for QA, merge into the &lt;code&gt;qa&lt;/code&gt; branch and deploy to the dev server&lt;/li&gt;
&lt;li&gt;Once accepted, push changes back into &lt;code&gt;develop&lt;/code&gt;: &lt;code&gt;git flow feature finish
some-feature&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aside: I&amp;rsquo;m able to use &lt;code&gt;git flow&lt;/code&gt; as a command thanks to the wonderful
&lt;a href=&#34;https://github.com/nvie/gitflow&#34;&gt;git-flow&lt;/a&gt; project, which I can install with &lt;a href=&#34;http://mxcl.github.com/homebrew/&#34;&gt;Homebrew&lt;/a&gt; very trivially:
&lt;code&gt;brew install git-flow&lt;/code&gt; &amp;ndash; Git Flow is a nice process on its own, but this
addition to command-line git makes it much, much easier to follow. There&amp;rsquo;s
even bash completion if you&amp;rsquo;re into that sort of things.&lt;/p&gt;

&lt;p&gt;Completed features don&amp;rsquo;t always necessarily get pushed into production, so
sometimes they&amp;rsquo;ll queue up a little on &lt;code&gt;develop&lt;/code&gt;. Once we&amp;rsquo;re ready to do a
deploy of a new feature, it&amp;rsquo;s as simple as &lt;code&gt;git flow release start YYYYMMDD&lt;/code&gt;
(we don&amp;rsquo;t have discrete version numbers so I&amp;rsquo;ve taken to using year, month,
day as an easy means of tracking release). At that point, I can open up my SQL
folder where I have any necessary migrations to apply to production, move the
applied productions into a &lt;code&gt;deployed&lt;/code&gt; folder, and complete the release, which
merges into &lt;code&gt;master&lt;/code&gt;. From there it&amp;rsquo;s a simple push to production.&lt;/p&gt;

&lt;p&gt;While this is all well and good, and our development cycles are relatively
fast, it&amp;rsquo;s an academic environment. For those who haven&amp;rsquo;t experienced
development in such environments, it&amp;rsquo;s not uncommon for there to be fires.
Sometimes it turns out that the feature in development needs to wait because
we need a new report or some element in the user interface is confusing to the
new person and we need to address it right now or numbers aren&amp;rsquo;t adding up
somewhere and OMG something is wrong FIX IT NOW. This is where Git Flow&amp;rsquo;s
hotfix branches are wonderful. Anything that needs a quick turnaround winds up
going in as a hotfix. That workflow is quite similar to feature development,
although the branching is a little different.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a branch off of &lt;code&gt;master&lt;/code&gt;: &lt;code&gt;git flow hotfix start report-fix&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Make adjustments as quickly as I can, introducing no new bugs of course&lt;/li&gt;
&lt;li&gt;Merge into &lt;code&gt;qa&lt;/code&gt; and deploy to dev server, and notify my project lead
immediately so he can test things&lt;/li&gt;
&lt;li&gt;Once accepted, push back into &lt;code&gt;master&lt;/code&gt;: &lt;code&gt;git flow hotfix finish report-fix&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Features for development, hotfixes for production. It&amp;rsquo;s a really nice duality
that isn&amp;rsquo;t readily visible when you review the Git Flow process the first few
times.&lt;/p&gt;

&lt;p&gt;This means that I can very easily be working on multiple features at a time
(occasionally one gets blocked by need of clearer requirements or whatnot)
while also managing the fast and furious hot requests without totally losing
my mind of what branch is what and where did I create it and did I do it from
&lt;code&gt;master&lt;/code&gt; or &lt;code&gt;develop&lt;/code&gt; etc.&lt;/p&gt;

&lt;p&gt;Git Flow does mention version numbers and whatnot, and if you have a product
with version numbers, I&amp;rsquo;m sure it&amp;rsquo;s handy, but we&amp;rsquo;re in a fairly perpetual
state of upgrade, so it&amp;rsquo;s not so relevant. Using Git Flow gives me a very
manageable process for handling a lot of requests from a variety of sources.
Given that I&amp;rsquo;m a one-man shop there, it&amp;rsquo;s nice to have a clean and easy-to-use
workflow like this. It&amp;rsquo;s really not bad, especially if you install
&lt;a href=&#34;https://github.com/nvie/gitflow&#34;&gt;git-flow&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you&amp;rsquo;re not doing &lt;em&gt;anything&lt;/em&gt; for branch management, try out one of the
flow-type processes I&amp;rsquo;ve linked. It&amp;rsquo;s really been a significant change to how
I work, much for the better.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Clearing the cobwebs</title>
      <link>http://new.randomthink.net/blog/2012/10/clearing-the-cobwebs/</link>
      <pubDate>Mon, 01 Oct 2012 00:00:00 +0000</pubDate>
      
      <guid>http://new.randomthink.net/blog/2012/10/clearing-the-cobwebs/</guid>
      <description>&lt;p&gt;I really appreciate the feedback on my &lt;a href=&#34;http://www.randomthink.net/blog/2012/09/split-personality/&#34;&gt;Split Personality&lt;/a&gt; post. I got some
good comments via a wide variety of channels, which kind of made me realize
that really, I’m way the heck overthinking it and it’s okay to have some level
of crossover.&lt;/p&gt;

&lt;p&gt;I decided as a part of the process of figuring out what to do in moving forward,
I’d look back. That’s when I read over all 688 posts I’d written on this blog.
A few things stuck out at me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I was &lt;em&gt;way&lt;/em&gt; oversharing things, especially in those first few years&lt;/li&gt;
&lt;li&gt;It was often way too wall-of-texty over mundane stuff&lt;/li&gt;
&lt;li&gt;No, seriously, overshare ahoy&lt;/li&gt;
&lt;li&gt;It’s funny to see how much tech has evolved in the ten years I’ve been running
this thing&lt;/li&gt;
&lt;li&gt;Several posts were little one-off throwaways that are now tweets or Facebook
posts&lt;/li&gt;
&lt;li&gt;There was way too much discussion about posting or lack of posting or other
meta crap that meant something to me but is relatively meaningless to everyone
else (in a sense, much like this post)&lt;/li&gt;
&lt;/ul&gt;

&lt;!-- more --&gt;

&lt;p&gt;Of those 688, I wound up hiding 584 of them. I’m causing some massive linkrot in
the process, but I tried to keep things that I felt had some sort of enduring
value. Whether they’re reflective of me in some way or discussing personal
events that still feel like there’s worth in sharing, anything publicly visible
at this point is something that I still feel holds some level of value.&lt;/p&gt;

&lt;p&gt;I also brought over three of the five posts from my brianarn@github experiment.
It was fun and I enjoyed writing the content, but for as interesting of a
concept as it is, &lt;a href=&#34;http://www.octopress.org/&#34;&gt;Octopress&lt;/a&gt; requires a bit more time and effort than I
really have to play with right now. &lt;a href=&#34;http://www.wordpress.org/&#34;&gt;WordPress&lt;/a&gt; is just kind of solid out of
the box, especially in later versions, so it works for now.&lt;/p&gt;

&lt;p&gt;For a variety of reasons, I cherish some of the overshare stuff because it’s
been of real value to reflect lately. Some things in those posts are wonderful
from a personal journaling perspective, but serve no reason to be public on the
‘net, so it’s worth closing down a little bit.&lt;/p&gt;

&lt;p&gt;All that being said, I feel like I have a better idea of how I want to move
forward. Personal and technical thoughts will be intermingled here on
RandomThink, and I’ll stick with &lt;a href=&#34;http://www.wordpress.org/&#34;&gt;WordPress&lt;/a&gt; because while &lt;a href=&#34;http://www.octopress.org/&#34;&gt;Octopress&lt;/a&gt; was
neat, it’s still a bit more fiddly than I’d like to have to mess with for
writing. I’m going to be trying to write about more technical topics because I
feel those have more value in a public form.&lt;/p&gt;

&lt;p&gt;For more ephemeral thoughts – links, memes, etc – I’ll stick with &lt;a href=&#34;http://twitter.com/brianarn&#34;&gt;Twitter&lt;/a&gt;
and &lt;a href=&#34;http://www.facebook.com/brianarn&#34;&gt;Facebook&lt;/a&gt; – in particular, as I’ve been doing lately, baby-related
things will likely wind up on Facebook, so if you’re interested in that aspect,
hit me up with a friend request.&lt;/p&gt;

&lt;p&gt;I also think I’m going to start a personal journal, so I have a place to write
all those things I’ve recently enjoyed reading but were way too personal and
oversharing.&lt;/p&gt;

&lt;p&gt;Here’s looking forward to, y’know, actually blogging about something other than
blogging.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Split Personality</title>
      <link>http://new.randomthink.net/blog/2012/09/split-personality/</link>
      <pubDate>Fri, 28 Sep 2012 00:00:00 +0000</pubDate>
      
      <guid>http://new.randomthink.net/blog/2012/09/split-personality/</guid>
      <description>&lt;p&gt;So, I haven&amp;rsquo;t written a post on this blog in nearly two years. &lt;a href=&#34;http://www.randomthink.net/blog/what-a-crazy-year/&#34; title=&#34;What a crazy year&#34;&gt;What a crazy
year&lt;/a&gt; was the last real one, and so much has changed since then that it&amp;rsquo;d be
hard to summarize. However, that&amp;rsquo;s not necessarily what this post is about.&lt;/p&gt;

&lt;p&gt;Lately I&amp;rsquo;ve had a real urge to get back into blogging. I don&amp;rsquo;t always have time
to sit and write novels, but I do find chances here and there where I can put a
few thoughts out. For example, I have three draft posts on JavaScript topics and
one on what it&amp;rsquo;s like to be a new parent (there&amp;rsquo;s something drastically
different in the time since the last post), but the thing is, the audiences for
those topics are drastically different.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;Navel gazing regarding blogging isn&amp;rsquo;t new for me. Really, my concern is crossing
the streams. I suspect I still have some family and friends who&amp;rsquo;d like to read
the personal stuff but don&amp;rsquo;t know what a closure is, while others would be
potentially interested to read my technical thoughts but could care less about
my child&amp;rsquo;s latest developmental milestone.&lt;/p&gt;

&lt;p&gt;This blog is personal and there&amp;rsquo;s a lot of old old content in it, and I&amp;rsquo;ve
considered gutting it before and am considering it again, because of the two
dozen domains I own, it&amp;rsquo;s still probably my favorite one and will always feel
like home, but I feel bad causing linkrot.&lt;/p&gt;

&lt;p&gt;I created &lt;a href=&#34;http://brianarn.github.com/&#34;&gt;brianarn@github&lt;/a&gt; the last time I got this urge, and that was a fun
experiment with Octopress, but something about having it be a subdomain of
GitHub feels a bit funny or odd. I&amp;rsquo;ve considered buying a domain or using one of
the handful of variations on my name that I already own, but then it feels like
maybe I&amp;rsquo;m fragmenting my web presence or whatever.&lt;/p&gt;

&lt;p&gt;So, I figure, I&amp;rsquo;ll reach out this time. What do people think? If you have
similar issues, how do you handle it? Separate blogs? Categories? Whoever you
are, if you know me and you&amp;rsquo;ve read this, in particular if you have some
experience in this area, please let me know. I know some people just mix it all
up, and I&amp;rsquo;d be open to that, but it feels like I really need to segregate topics
in some way and I&amp;rsquo;m just not sure how best to do that.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Moving Forward</title>
      <link>http://new.randomthink.net/blog/2011/12/moving-forward/</link>
      <pubDate>Wed, 28 Dec 2011 00:00:00 +0000</pubDate>
      
      <guid>http://new.randomthink.net/blog/2011/12/moving-forward/</guid>
      <description>&lt;p&gt;As 2011 closes, we’re excited to be taking up leadership of Webuquerque, however, there have been some recent statements made about the Webuquerque leadership transition that we feel merit a response.&lt;/p&gt;

&lt;p&gt;While all parties involved worked hard at the transition process, some things were not as smooth as they could have been. That being said, the hiccups in the transition process have not negatively impacted the presentations or events in any way.&lt;/p&gt;

&lt;p&gt;We have nothing but the utmost respect for Emily Lewis and Jason Nakai, the Webuquerque founders. They have created an absolutely amazing community that we are all incredibly honored to be a part of, and proud to help move forward and grow. Our sincere thanks goes out to Emily and Jason for their hard work and the wonderful wealth of information they passed onto us to keep things going strong. We look forward to the continued involvement of Jason and Emily in the Webuquerque community.&lt;/p&gt;

&lt;p&gt;We all love and are committed to this community. It has become something very unique and special to all who are involved, helping us improve our craft and our professional relationships. We hope that as Webuquerque moves into 2012 and beyond, the community will continue to be supportive and help Webuquerque grow in size and influence. Thank you!&lt;/p&gt;

&lt;p&gt;Signed,&lt;br /&gt;
&lt;a href=&#34;http://www.randomthink.net&#34;&gt;Brian Arnold&lt;/a&gt;, &lt;a href=&#34;http://byrnecreative.com/&#34;&gt;Ben Byrne&lt;/a&gt;, &lt;a href=&#34;http://zerekwelz.com/&#34;&gt;Zerek Welz&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>jsFiddle plugin for Octopress</title>
      <link>http://new.randomthink.net/blog/2011/08/jsfiddle-plugin-for-octopress/</link>
      <pubDate>Thu, 04 Aug 2011 00:00:00 +0000</pubDate>
      
      <guid>http://new.randomthink.net/blog/2011/08/jsfiddle-plugin-for-octopress/</guid>
      <description>

&lt;h2 id=&#34;warning:863eeceae52841638513bf7629b2bdc8&#34;&gt;Warning&lt;/h2&gt;

&lt;p&gt;This post is old and no longer functional, given that I&amp;rsquo;m not actively using
Octopress anymore. I&amp;rsquo;ve neutered the output a bit, since I&amp;rsquo;m not using the
plugins, and I don&amp;rsquo;t have plans to port them to Hugo shortcodes at this point.&lt;/p&gt;

&lt;h2 id=&#34;original-content:863eeceae52841638513bf7629b2bdc8&#34;&gt;Original Content&lt;/h2&gt;

&lt;p&gt;In my post about &lt;a href=&#34;http://brianarn.github.com/meta/2011/07/moving-into-octopress/&#34;&gt;moving into Octopress&lt;/a&gt;, I mused about how difficult
it might be to make a jsFiddle plugin. Turns out, it wasn&amp;rsquo;t that hard.&lt;/p&gt;

&lt;p&gt;I&amp;rsquo;ve created a simple &lt;a href=&#34;http://jsfiddle.net&#34;&gt;jsFiddle&lt;/a&gt; plugin for &lt;a href=&#34;http://octopress.org&#34;&gt;Octopress&lt;/a&gt;. It allows one to
easily embed a jsFiddle into their page. The syntax is pretty simple. For all of
these examples, I&amp;rsquo;ll be using a fiddle of mine that demonstrates the properties
of Dojo promises.&lt;/p&gt;

&lt;p&gt;Fiddle URL: &lt;a href=&#34;http://jsfiddle.net/brianarn/ccWP7/&#34;&gt;http://jsfiddle.net/brianarn/ccWP7/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fortunately, the username isn&amp;rsquo;t actually required in the URL when using the
jsFiddle iframe embed code. I&amp;rsquo;m referring to the portion identified as &lt;code&gt;ccWP7&lt;/code&gt;
in my URL as the fiddle shortcode. There may be a better name for that, but if
there is, I have no idea what it is.&lt;/p&gt;

&lt;p&gt;Anyhow, let&amp;rsquo;s talk about how it works.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;h2 id=&#34;general-syntax:863eeceae52841638513bf7629b2bdc8&#34;&gt;General syntax:&lt;/h2&gt;

&lt;p&gt;The general syntax for usage is pretty straightforward.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;amp;#123;% jsfiddle shorttag [tabs] [skin] [height] [width] %}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;In the case of any of the latter options, the word &amp;lsquo;default&amp;rsquo; will ensure that
the plugin fills in the default values as defined by jsFiddle at the time of
this plugin&amp;rsquo;s authoring. The defaults are as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;tabs: &lt;code&gt;js,resources,html,css,result&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;skin: &lt;code&gt;light&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;height: &lt;code&gt;300px&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;width: &lt;code&gt;100%&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;examples:863eeceae52841638513bf7629b2bdc8&#34;&gt;Examples&lt;/h2&gt;

&lt;h3 id=&#34;basic-example:863eeceae52841638513bf7629b2bdc8&#34;&gt;Basic Example&lt;/h3&gt;

&lt;p&gt;As the most basic use case, an example of a simple embed.&lt;/p&gt;

&lt;h4 id=&#34;syntax:863eeceae52841638513bf7629b2bdc8&#34;&gt;Syntax:&lt;/h4&gt;

&lt;pre&gt;&lt;code&gt;&amp;amp;#123;% jsfiddle ccWP7 %}
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;adjusting-tabs:863eeceae52841638513bf7629b2bdc8&#34;&gt;Adjusting Tabs&lt;/h3&gt;

&lt;p&gt;It&amp;rsquo;s possible to easily adjust the display order of the tabs. In this case, I&amp;rsquo;m
moving the result to be the first item shown.&lt;/p&gt;

&lt;h4 id=&#34;syntax-1:863eeceae52841638513bf7629b2bdc8&#34;&gt;Syntax:&lt;/h4&gt;

&lt;pre&gt;&lt;code&gt;&amp;amp;#123;% jsfiddle ccWP7 result,js,html,css %}
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;presentation-skin:863eeceae52841638513bf7629b2bdc8&#34;&gt;Presentation: Skin&lt;/h3&gt;

&lt;p&gt;We can easily adjust the skin. Right now, it looks like &lt;code&gt;light&lt;/code&gt; and
&lt;code&gt;presentation&lt;/code&gt; are really the only supported options, but if jsFiddle announces
new options, you can start using them immediately.&lt;/p&gt;

&lt;h4 id=&#34;syntax-2:863eeceae52841638513bf7629b2bdc8&#34;&gt;Syntax:&lt;/h4&gt;

&lt;pre&gt;&lt;code&gt;&amp;amp;#123;% jsfiddle ccWP7 default presentation %}
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;presentation-height-width:863eeceae52841638513bf7629b2bdc8&#34;&gt;Presentation: Height/width&lt;/h3&gt;

&lt;p&gt;We can also fairly easily adjust the height and width. In this case, I&amp;rsquo;ll make
it a notably taller fiddle, so that everything can be read more easily (given
that my fiddle has some write-up in the HTML with some notable output).&lt;/p&gt;

&lt;h4 id=&#34;syntax-3:863eeceae52841638513bf7629b2bdc8&#34;&gt;Syntax:&lt;/h4&gt;

&lt;pre&gt;&lt;code&gt;&amp;amp;#123;% jsfiddle ccWP7 default default 600px %}
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;multiple-options-at-once:863eeceae52841638513bf7629b2bdc8&#34;&gt;Multiple Options at once&lt;/h3&gt;

&lt;p&gt;For each prior example, I&amp;rsquo;ve been changing just one piece, but nothing prevents
me from adjusting multiple at once. For example, perhaps I want something really
large for a presentation I&amp;rsquo;m giving, and I want my Results tab first.&lt;/p&gt;

&lt;h4 id=&#34;syntax-4:863eeceae52841638513bf7629b2bdc8&#34;&gt;Syntax:&lt;/h4&gt;

&lt;pre&gt;&lt;code&gt;&amp;amp;#123;% jsfiddle ccWP7 result,js,html,css presentation 800px %}
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&#34;summary:863eeceae52841638513bf7629b2bdc8&#34;&gt;Summary&lt;/h2&gt;

&lt;p&gt;If you haven&amp;rsquo;t been using it, &lt;a href=&#34;http://jsfiddle.net&#34;&gt;jsFiddle&lt;/a&gt; really is a pretty fantastic service.
I&amp;rsquo;ve been trying to use it when I want to put up something simple and quick. I
love &lt;a href=&#34;http://github.com&#34;&gt;GitHub&lt;/a&gt; as well, and gists are neat and all, but there&amp;rsquo;s something
special about jsFiddle. This plugin should make it a lot easier to simply embed
a fiddle (not that copy/pasting the iframe was hard).&lt;/p&gt;

&lt;p&gt;I&amp;rsquo;ve submitted a pull request to the main Octopress repo, but if you want to
grab a copy before it gets accepted (if it gets accepted), you can find it in my
GitHub fork of it
&lt;a href=&#34;https://github.com/brianarn/octopress/blob/master/plugins/jsfiddle.rb&#34;&gt;here&lt;/a&gt;.
Here&amp;rsquo;s hoping you find some use for it!&lt;/p&gt;

&lt;p&gt;Update: It&amp;rsquo;s officially a part of Octopress now! Here&amp;rsquo;s the &lt;a href=&#34;http://octopress.org/docs/plugins/jsfiddle-tag/&#34;&gt;documentation&lt;/a&gt;
for it.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Conditions for Success</title>
      <link>http://new.randomthink.net/blog/2011/07/conditions-for-success/</link>
      <pubDate>Sun, 31 Jul 2011 00:00:00 +0000</pubDate>
      
      <guid>http://new.randomthink.net/blog/2011/07/conditions-for-success/</guid>
      <description>&lt;p&gt;Earlier today, my friend &lt;a href=&#34;http://twitter.com/segdeha&#34;&gt;Andrew&lt;/a&gt; tweeted the following:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Don’t create success. Create the conditions for success.&lt;/p&gt;

&lt;p&gt;— Andrew Hedges (@segdeha) &lt;a href=&#34;https://twitter.com/segdeha/status/97770601162354688&#34;&gt;July 31, 2011&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Doing some quick Googling, I’m sure it’s not exactly the most original quote
ever, but it’s one that really resonated with me. It made me think about what
I’m working on doing with my next &lt;a href=&#34;http://ignite-nm.com/&#34;&gt;Ignite NM&lt;/a&gt; talk, which I titled &amp;ldquo;Doing
what you love: Making a hobby into a career&amp;rdquo;.&lt;/p&gt;

&lt;p&gt;I owe a good deal to Andrew and a bit to dumb luck, but in a way, I’m doing
what I am these days not because I went and made my own way, so much as I made
myself ready for when the opportunities presented themselves.&lt;/p&gt;

&lt;p&gt;In my case, I wanted to work on JavaScript full-time. I could have gone and
become a contractor or consultant or something, but instead, I polished my
skills. I worked on improving. I read and studied. I spent free time
experimenting. I created the conditions for success such that when the
opportunity presented itself, I was ready for it, and I couldn’t be happier.&lt;/p&gt;

&lt;p&gt;Are you doing what you love? If you aren’t, why not?&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Moving into Octopress</title>
      <link>http://new.randomthink.net/blog/2011/07/moving-into-octopress/</link>
      <pubDate>Sat, 30 Jul 2011 00:00:00 +0000</pubDate>
      
      <guid>http://new.randomthink.net/blog/2011/07/moving-into-octopress/</guid>
      <description>&lt;p&gt;So, some months ago, I set up a new blog on &lt;a href=&#34;http://github.com&#34;&gt;GitHub&lt;/a&gt; because I wanted to play
around with &lt;a href=&#34;https://github.com/mojombo/jekyll&#34;&gt;Jekyll&lt;/a&gt;, and I spent some time making it look half decent.  It
wasn&amp;rsquo;t bad (okay, yes it was) and it worked and then I got lazy and haven&amp;rsquo;t done
much with it.&lt;/p&gt;

&lt;p&gt;Then a few days ago, &lt;a href=&#34;http://www.rebeccamurphey.com/&#34;&gt;Rebecca Murphey&lt;/a&gt; wrote up &lt;a href=&#34;http://rmurphey.com/blog/2011/07/25/switching-to-octopress/&#34;&gt;a post&lt;/a&gt;
about her recent shift to &lt;a href=&#34;http://octopress.org/&#34;&gt;Octopress&lt;/a&gt;, which is basically a nice framework for
Jekyll. It sets up some nice themes and uses &lt;a href=&#34;http://sass-lang.com/&#34;&gt;Sass&lt;/a&gt; to make it super easy to
customize the really beautiful layout.&lt;/p&gt;

&lt;p&gt;I hopped into the #octopress channel on &lt;a href=&#34;http://freenode.net/&#34;&gt;freenode&lt;/a&gt;, asked a question or two,
got immediate responses, and basically I was able to move my &lt;code&gt;_posts&lt;/code&gt; directory
from before into the Octopress setup. It&amp;rsquo;s built to deploy to GitHub Pages as
well, meaning it was ridiculously easy to get the &amp;ldquo;new&amp;rdquo; site up.&lt;/p&gt;

&lt;p&gt;Of course, I wrote all of two blog posts before, but &lt;a href=&#34;http://octopress.org/&#34;&gt;Octopress&lt;/a&gt; has a few
niceties to make blogging a bit smoother. It&amp;rsquo;s very easy to pull in code
snippets for display, including from &lt;a href=&#34;http://gist.github.com&#34;&gt;gists&lt;/a&gt;. I wonder how hard it&amp;rsquo;d be to
make a &lt;a href=&#34;http://jsfiddle.net&#34;&gt;jsFiddle&lt;/a&gt; plugin&amp;hellip;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Don&#39;t let jQuery DOMinate your thinking</title>
      <link>http://new.randomthink.net/blog/2011/04/dont-let-jquery-dominate-your-thinking/</link>
      <pubDate>Mon, 18 Apr 2011 00:00:00 +0000</pubDate>
      
      <guid>http://new.randomthink.net/blog/2011/04/dont-let-jquery-dominate-your-thinking/</guid>
      <description>

&lt;p&gt;For the past few years, I&amp;rsquo;ve been working on a side project at the &lt;a href=&#34;http://www.unm.edu/&#34;&gt;University
of New Mexico&lt;/a&gt;. There&amp;rsquo;s not a public-facing aspect to it that&amp;rsquo;s worth
highlighting, but the administrative side is a very heavy JavaScript
application, and it didn&amp;rsquo;t start that way.&lt;/p&gt;

&lt;p&gt;There are several pages to the application, each of which is dedicated to a
major piece of functionality. As our registered user base has grown, the amount
of information that needs to be managed has grown quite a bit, and some of my
earlier pages were really starting to slow down.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;When we first started building the application, we went with &lt;a href=&#34;http://jquery.com/&#34;&gt;jQuery&lt;/a&gt;. I&amp;rsquo;d
been writing &lt;acronym title=&#34;JavaScript&#34;&gt;JS&lt;/acronym&gt; since before the libraries
and toolkits were really on the scene, and remember playing with things like
&lt;a href=&#34;http://developer.yahoo.com/yui/&#34;&gt;YUI&lt;/a&gt; 1.0 and &lt;a href=&#34;http://prototypejs.org/&#34;&gt;Prototype&lt;/a&gt; in prior websites, but my coworker/team lead was
really keen on trying out this tool that was starting to get some traction.&lt;/p&gt;

&lt;p&gt;From a &lt;acronym title=&#34;Computer Science&#34;&gt;CS&lt;/acronym&gt; perspective, at first,
jQuery&amp;rsquo;s interface really bothered me. I liked that Prototype made JS feel a lot
more like C++ to me. It felt like I could build some interaction, using an
approach that felt natural and proper to me, like it was somehow &amp;ldquo;fixing&amp;rdquo; JS.
Also, let&amp;rsquo;s be honest: chaining is ugly.&lt;/p&gt;

&lt;p&gt;However, jQuery made working with the DOM &lt;em&gt;so&lt;/em&gt; much easier, and Ajax work was
just dead simple (especially when cranking out JSON on the backend), so I stuck
with it.&lt;/p&gt;

&lt;p&gt;After working in jQuery for a while, &lt;em&gt;I stopped thinking about JavaScript&lt;/em&gt;. I
let jQuery kind of take over my brain. For a while, I fell really heavily in
love with it. It felt just magical. Things just worked. Working with IE wasn&amp;rsquo;t
as awful (though still not great, of course).&lt;/p&gt;

&lt;p&gt;I was quite the fan of jQuery &amp;ndash; and in many ways, I still am. jQuery is really
a fantastic tool for doing DOM manipulation and simple Ajax work. The problem
is, my application outgrew simple Ajax work and DOM manipulation.&lt;/p&gt;

&lt;p&gt;As the application grew in functionality and codebase, performance really
started to sink. It was quite awful. However, I was fortunate enough to have
stumbled upon a relatively new podcast named &lt;a href=&#34;http://yayquery.com/&#34;&gt;yayQuery&lt;/a&gt;. Listening to the yQ
crew talk about anti-patterns and hiddenhancements and such, I really grew
interested in optimization. When jQuery 1.4 came out, I was ready to take
advantage of it, and managed to take one particular page from a load time of ~12
seconds to ~3.&lt;/p&gt;

&lt;p&gt;Over the past year, I&amp;rsquo;ve gone through and created a couple of new pages to
replace some of the worst offenders, and tried cleaning up here and there where
possible, but on the whole, I realized the major problem I&amp;rsquo;d run into was that I
stopped thinking about my data as data, and started thinking about it more as
DOM.&lt;/p&gt;

&lt;p&gt;If there is one takeaway from my entire ramble here, it is this: Don&amp;rsquo;t let
jQuery DOMinate your thinking. When all you have is a DOM hammer, everything is
a DOM node.&lt;/p&gt;

&lt;p&gt;I had been creating ridiculously complex markup with a lot of hidden elements in
order to preserve data, rather than using things like &lt;code&gt;jQuery.data&lt;/code&gt; to store JS
objects. I was also doing things like not saving my resulting jQuery objects,
running code like &lt;code&gt;$(&amp;quot;#foo&amp;quot;)&lt;/code&gt; repeatedly, not thinking about the impact of
creating several new jQuery collections. It&amp;rsquo;s almost embarassing to admit that I
was generating a bunch of &lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt; tags and actively adding them to the DOM one at
a time, for literally hundreds of list items, but I was.&lt;/p&gt;

&lt;p&gt;You&amp;rsquo;ll note that &lt;strong&gt;not&lt;/strong&gt; all of the things I was doing above are jQuery&amp;rsquo;s fault.
It&amp;rsquo;s just that with jQuery, I stopped thinking about JavaScript &amp;ndash; and, in
retrospect, that was a really bad thing.&lt;/p&gt;

&lt;p&gt;These days, I&amp;rsquo;m doing a lot with &lt;a href=&#34;http://dojotoolkit.org/&#34;&gt;Dojo&lt;/a&gt; and while it&amp;rsquo;s not the JS panacea,
it&amp;rsquo;s the first of all of the toolkits and libraries that&amp;rsquo;s felt like I&amp;rsquo;m really
writing JavaScript, and not just writing something else that doesn&amp;rsquo;t feel like
JS. I&amp;rsquo;ve grown to love JavaScript as a language for its own merits.&lt;/p&gt;

&lt;p&gt;So, whether you&amp;rsquo;re coming to this post and you&amp;rsquo;re a huge jQuery fan who hasn&amp;rsquo;t
tried other tools, or you&amp;rsquo;re a seasoned vet with the DHTML scars to prove it &amp;ndash;
I encourage you, reach out and try something else. It doesn&amp;rsquo;t matter what you go
for, so much as you&amp;rsquo;re trying something different.&lt;/p&gt;

&lt;h3 id=&#34;resources:58306a3485f3a9606075b1f1ede8aada&#34;&gt;Resources&lt;/h3&gt;

&lt;p&gt;Larger libraries/toolkits (typically cross-browser, all with rich DOM/Ajax
support, often including UI frameworks, etc):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://dojotoolkit.org/&#34;&gt;Dojo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://developer.yahoo.com/yui/&#34;&gt;YUI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://mootools.net/&#34;&gt;MooTools&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://prototypejs.org/&#34;&gt;Prototype&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Smaller libraries (focused on specific pieces of functionality):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://documentcloud.github.com/underscore/&#34;&gt;Underscore&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://documentcloud.github.com/backbone/&#34;&gt;Backbone&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://zeptojs.com/&#34;&gt;Zepto&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Other reading:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.rebeccamurphey.com/on-jquery-large-applications&#34;&gt;On jQuery &amp;amp; Large Application&lt;/a&gt; (the original impetus for this post)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://jquerysbestfriends.com/#slide1&#34;&gt;jQuery&amp;rsquo;s Best Friends&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.rebeccamurphey.com/when-youre-building-a-non-trivial-js-applicat&#34;&gt;When you&amp;rsquo;re build a non-trivial JS application&amp;hellip;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Proof of Concept: ScoreSettler</title>
      <link>http://new.randomthink.net/blog/2011/03/proof-of-concept-scoresettler/</link>
      <pubDate>Tue, 29 Mar 2011 00:00:00 +0000</pubDate>
      
      <guid>http://new.randomthink.net/blog/2011/03/proof-of-concept-scoresettler/</guid>
      <description>&lt;p&gt;When I&amp;rsquo;m playing &lt;a href=&#34;http://www.catan.com/catan-games/boardgame.html&#34;&gt;Settlers of Catan&lt;/a&gt; with friends, it &lt;em&gt;always&lt;/em&gt; seems like
either 6 or 8 is really hot, and dominates the rolls. I realize that they&amp;rsquo;re
common rolls, and that 7 is theoretically the most common roll, but it never
quite seems that way, that either 6 or 8 is dominant. It also seems like 5 or 9
is way more frequent than its statistical pairing, and I&amp;rsquo;ve wanted an easy way
to track these stats in the past.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;So, I thought, &amp;ldquo;Hey, I know how to code, it would be a simple UI in a browser,
with minimal JS needs, just make it already.&amp;rdquo; I got out my notebook and sketched
out some ideas on UI&amp;hellip; and then let it sit for quite awhile. I&amp;rsquo;m pretty sure
it&amp;rsquo;s been at least six months, if not more.&lt;/p&gt;

&lt;p&gt;It&amp;rsquo;s been kind of bothering me for awhile now, and even though we don&amp;rsquo;t play
Settlers as much these days (&lt;a href=&#34;http://www.riograndegames.com/games.html?id=278&#34;&gt;Dominion&lt;/a&gt; is amazing), I&amp;rsquo;ve &lt;em&gt;still&lt;/em&gt; wanted to
build it. Tonight, finally, I just sat down for a couple of hours and poked it
out of my head, and called it &lt;a href=&#34;http://brianarn.github.com/ScoreSettler&#34;&gt;ScoreSettler&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can now go &lt;a href=&#34;http://brianarn.github.com/ScoreSettler&#34;&gt;try it out&lt;/a&gt; or &lt;a href=&#34;http://github.com/brianarn/ScoreSettler&#34;&gt;clone/fork the source&lt;/a&gt; for yourself.
It&amp;rsquo;s all here on GitHub, right alongside this blog. I&amp;rsquo;d call it a proof of
concept at this point, which means that if I never come back to it, I can still
consider it complete, right?&lt;/p&gt;

&lt;p&gt;I make no claims as to the quality of the code. It&amp;rsquo;s fairly simple and requires
a modern browser (which means no IE &amp;lt; 9), as I&amp;rsquo;m not using any JS libraries to
do anything. It&amp;rsquo;s just plain and simple JS, using event listeners. I&amp;rsquo;m sure it&amp;rsquo;s
not perfect, that there&amp;rsquo;s spots to optimize, that it could use a better coat of
paint, but hey, it works.&lt;/p&gt;

&lt;p&gt;It even has a rolling simulator, which I was using for testing. It&amp;rsquo;s kind of fun
to just watch it roll away though.&lt;/p&gt;

&lt;p&gt;Heck, it works on the iPad, meaning I could, in theory, use it right now &amp;ndash; and
that&amp;rsquo;s awesome.&lt;/p&gt;

&lt;p&gt;So, yeah. Feel free to &lt;a href=&#34;http://brianarn.github.com/ScoreSettler&#34;&gt;go play&lt;/a&gt;, or &lt;a href=&#34;http://github.com/brianarn/ScoreSettler&#34;&gt;fork it&lt;/a&gt; and make it pretty or
something. It&amp;rsquo;s nothing that huge or exciting, but I&amp;rsquo;m glad to have it out of my
head now, and I look forward to tracking my next game of &lt;a href=&#34;http://www.catan.com/catan-games/boardgame.html&#34;&gt;Settlers&lt;/a&gt; to
see how the dice are screwing me.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>What a crazy year</title>
      <link>http://new.randomthink.net/blog/2010/11/what-a-crazy-year/</link>
      <pubDate>Tue, 30 Nov 2010 00:00:00 +0000</pubDate>
      
      <guid>http://new.randomthink.net/blog/2010/11/what-a-crazy-year/</guid>
      <description>&lt;p&gt;I remember when I used to feel a little shame in missing a post for one month. Then a few months. Now? We’re looking at nearly a year — and it’s been kind of a crazy year. It’s not over yet, but I find myself in a reflective mood tonight, so, hey.&lt;/p&gt;

&lt;p&gt;In 2009, I spent some time playing with some HTML5 APIs, as evidenced by the drum kit and my little canvas demos and such. I’d spent more and more of my free time researching and studying JavaScript more and more. A lot of my little canvas demos had pushed me into looking into optimizations and ways to stop memory leaks.&lt;/p&gt;

&lt;p&gt;I still wouldn’t call myself an optimization master, but I’d definitely picked up a number of best practices along the way, which led me to giving a couple of small talks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tuesday, March 2, 2010: &lt;a href=&#34;http://www.youtube.com/watch?v=cGvrB6K7sHY&#34;&gt;HTML5 in 5&lt;/a&gt; at &lt;a href=&#34;http://www.ignite-nm.com&#34;&gt;IgniteNM&lt;/a&gt; 5&lt;/li&gt;
&lt;li&gt;Wednesday, April 7, 2010: &lt;a href=&#34;http://webuquerque.com/News/Recap-Rasters-Vectors-Scripting.php&#34;&gt;Rasters, Vectors, and Scripting, Oh My&lt;/a&gt; at &lt;a href=&#34;http://www.webuquerque.com&#34;&gt;Webuquerque&lt;/a&gt; (I seriously regret that goofy title)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both talks were volunteer affairs – I wasn’t explicitly asked to talk, I just like to talk about things that excite me. However, the Webuquerque talk led me in an interesting direction.&lt;/p&gt;

&lt;p&gt;Long story short, I took a chance, put myself out there, and earned a spot on the &lt;a href=&#34;http://www.sitepen.com/&#34;&gt;SitePen&lt;/a&gt; team. I’ve always been fortunate to work for good companies, but I have to say, working for SitePen has been an absolute dream come true. I get to work in JavaScript in some capacity every single day. I’ve gotten to build some really awesome things, to learn leaps and bounds in an immensely short period, and I work with some of the most amazing minds in JS today. It couldn’t be better, and I look forward to being a SitePenner for years to come.&lt;/p&gt;

&lt;p&gt;Incidentally, if you’d told me ten years ago that I’d be working in JS every day and loving it, I’d have laughed at you, hard.&lt;/p&gt;

&lt;p&gt;This year hasn’t been perfect, by any means. However, it’s definitely been a life-changing one. I really feel like I’m no longer just working a job, but really developing a career. I’ve had some amazing highs and amazing lows in 2010, and even though there’s still a month left to it, I know this year is going to go down in my books as one of the most amazing on record.&lt;/p&gt;

&lt;p&gt;So, there’s that. I could say (again) that I’m going to try to post more (again), and I really do hope that’s the case. This blog’s definitely been more personal than technical in the past, but I suspect it’ll move more towards tech stuff at this point, with a rather heavy JS slant.&lt;/p&gt;

&lt;p&gt;It’s not that I’m against personal sharing, and I’ll definitely be doing so, but it’s a different world and I’m a different person, and frankly, I suspect it’d be kinda boring if I told you all that I ate lunch at &lt;a href=&#34;http://www.dionspizza.com/&#34;&gt;Dion’s&lt;/a&gt; again.&lt;/p&gt;

&lt;p&gt;Oh, also, I’m down ~30 pounds this year too, which is nice, though I’m definitely kind of hitting up against a wall — but I can’t complain. I mean, 30 pounds is awesome.&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>