<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
     xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Spifftastic</title>
    <link>http://spifftastic.net/</link>
    <atom:link href="http://spifftastic.net/feeds/rss.xml" rel="self" type="application/rss+xml" />
    <description>Personal blog of Noel Cower</description>
    <pubDate>Tue, 12 Mar 2013 02:03:16 -0600</pubDate>
    <docs>http://www.rssboard.org/rss-2-0-1</docs>
    <item>
      <title>So I Learned To Code</title>
      <link>http://spifftastic.net/post/2013/03/so-i-learned-to-code</link>
      <guid isPermaLink="true">http://spifftastic.net/post/2013/03/so-i-learned-to-code</guid>
      <pubDate>Tue, 12 Mar 2013 01:53:35 -0600</pubDate>
      <description><![CDATA[
<p>I taught myself to code. Sort of. I taught myself to code after reading a book on Perl about 11 years ago, part of a book on Perl, and not understanding it. I wanted to make games and Perl was only useful, in my eyes, for text adventures. I’m still somewhat of the opinion that Perl is only useful for text-based stuff, but not for lack of the ability to do graphical things. At any rate, after I tried to learn Perl using a book, I taught myself to code.</p>

<p>Well, no, I read other people’s code and learned how to code from that. I read books that dissected good code, but mostly I read books on things that weren’t specific to code (e.g., 3D maths used in games). I taught myself to read code and write code like the code I read. I read the Quake 1 source code,<sup id="fnref:2013_03_12_qsource"><a href="#fn:2013_03_12_qsource" rel="footnote">1</a></sup> I read the Quake 3 SDK’s source code, I read Ruby scripts, I read Lua scripts while I worked on a game that used Lua,<sup id="fnref:2013_03_12_lua"><a href="#fn:2013_03_12_lua" rel="footnote">2</a></sup> and so on.</p>

<p>I asked myself how others did it and I read how others did it to answer the question. I was curious what code written by people who really knew how to code looked like. So I learned to read code, but I still wrote bad code probably for a long time, and maybe still do, but I leave that up to others to decide. After that, I taught myself to code.</p>

<p>Except really, it’s more like I taught myself to use a debugger before I learned to really code. I couldn’t write code if I didn’t know what it did. So, I wrote code or took other folks’ code and I stepped through it and saw how it worked. I read code while it executed, and this let me know how things worked even if I didn’t and sometimes still don’t know how everything works at the lowest level. I know how conditionals work, for example, in assembly, but I couldn’t tell you why the assembly worked with the hardware.<sup id="fnref:2013_03_12_hardware"><a href="#fn:2013_03_12_hardware" rel="footnote">3</a></sup></p>

<p>I was curious about what code did and had to know how it worked before I could really code. So, I learned how it worked and what it did, and after that, I taught myself to code.</p>

<p>When I taught myself to code, I never really started small, I just started esoteric or weird, whatever prodded me just enough to raise questions that seemed out there. My idea of fun wasn’t writing blackjack for a terminal, though I wrote blackjack programs, it was always more along the lines of modifying virtual method tables at runtime or building code to automate other tasks in programming, like writing code to generate Lua bindings.<sup id="fnref:2013_03_12_bindings"><a href="#fn:2013_03_12_bindings" rel="footnote">4</a></sup> I was curious about how I could handle any given situation and what different ways I could approach it.</p>

<p>The whole key here — to how<sup id="fnref:2013_03_12_why"><a href="#fn:2013_03_12_why" rel="footnote">5</a></sup> I learned to code — is curiosity. Curiosity killed the cat, sure, but the cat had nine lives, and before it touched the capacitor in the CRT, it got a pretty good look at how things worked. Because of my curiosity, I want and need to solve problems. I see puzzles in the crevices between ideas. Programming is not a job, but a strange search for new problems, one part learning to learn, one part problem solving, and one part borderline-obsessively-curious tinkering. A self-taught programmer must necessarily have all three of those parts to survive as a programmer.</p>

<p>Without those parts, that programmer will never seek knowledge, never fix anything, and never try anything new. He or she will be the programmer you don’t want to know, self-taught or not.</p>

<p>But with them? With them, that programmer will never feel limited, never stay bored, and never grow tired. With these things, that programmer will always enjoy programming. With these things, you’ll be a great programmer.</p>

<div class="footnotes">
     <ol>
       <li id="fn:2013_03_12_qsource">

         <p>For those who have wanted to read the Quake series’ source code but haven’t had the time to sit down and do it, I do recommend reading <a href="http://fabiensanglard.net">Fabien Sanglard’s</a> fantastic code reviews. As of this writing, he’s done <a href="http://fabiensanglard.net/anotherWorld_code_review/index.php">Another World</a>, <a href="http://fabiensanglard.net/quakeSource/index.php">Quake 1</a>, <a href="http://fabiensanglard.net/quake2/index.php">Quake 2</a>, <a href="http://fabiensanglard.net/quake3/index.php">Quake 3</a>, <a href="http://fabiensanglard.net/doomIphone/doomClassicRenderer.php">Doom</a>, <a href="http://fabiensanglard.net/doom3/index.php">Doom 3</a>, <a href="http://fabiensanglard.net/duke3d/index.php">Duke Nukem 3D</a>, and others.<a href="#fnref:2013_03_12_qsource" rev="footnote">&#8617;</a></p>
       </li>
       <li id="fn:2013_03_12_lua">

         <p>Lua’s a fantastic language for programming fun little experiments in. When I first ended up learning it, I was working as an artist on a small game called Bioscythe. As far as I know, it was never released, and I went my own way after the project seemed to more or less die as everyone on the team went off to do their own things. I learned a lot from seeing how we used Lua, however, and I’ve since remained convinced that it’s the best scripting language for game development.<a href="#fnref:2013_03_12_lua" rev="footnote">&#8617;</a></p>
       </li>
       <li id="fn:2013_03_12_hardware">

         <p>That is, I know the assembly but not how the mainboard works, and given the complexity of modern computer hardware, I’m prepared to forgive myself for this for a while even if I’ll have to figure it out sometime. On the upside, knowing what a compiler might produce is pretty handy at times. I say “might” because the compiler might optimize things away and so on, so there’s no guarantee that I’d always see the input in the output.<a href="#fnref:2013_03_12_hardware" rev="footnote">&#8617;</a></p>
       </li>
       <li id="fn:2013_03_12_bindings">

         <p>Which actually ended up landing me a small contract to do exactly. I wrote some experimental code to do at-runtime bindings of Lua code, someone liked it, and gave me a contract to do it again but without the speed hit of the original experiment.<a href="#fnref:2013_03_12_bindings" rev="footnote">&#8617;</a></p>
       </li>
       <li id="fn:2013_03_12_why">

         <p>Why I learned to code is another sort of thing altogether, though from the code I read, you can probably guess what set me on the road to code, as it were. Basically, though, I started out as a game artist, and still make game art, but wanted to make a game. Mods were one avenue but it’s difficult to find a good team making one (and the mod scene is mostly dead now, at least for modern titles, due to the amount of work involved). Finding a programmer willing to follow your lead is even more difficult. So, the solution was to write code myself.</p>

         <p>This altered my career path significantly and made me an anomaly in some respects since I’m both a relatively competent artist and a programmer (debatable on the competency part there as I’m a lousy judge of my programming skills), but it made life a whole lot more fun.<a href="#fnref:2013_03_12_why" rev="footnote">&#8617;</a></p>
       </li>
     </ol>

</div>]]></description>
    </item><item>
      <title>Review: Sublime Text Starter</title>
      <link>http://spifftastic.net/post/2013/03/review-sublime-text-starter</link>
      <guid isPermaLink="true">http://spifftastic.net/post/2013/03/review-sublime-text-starter</guid>
      <pubDate>Mon, 04 Mar 2013 15:23:36 -0700</pubDate>
      <description><![CDATA[
<p><em>Full disclosure: I was asked to review this book by the publishing company, Packt Publishing, and given a free copy of the book to do the review. You can read <a href="https://gist.github.com/nilium/17fa598a4910194c13a9">the email</a> sent to me by the publisher if you like.</em></p>

<p><em><a href="http://www.packtpub.com/sublime-text-starter/book">Sublime Text Starter</a></em>, by Eric Haughee, probably isn’t what you’re looking for to get started with the now-rather-popular programmer’s text editor, <a href="http://sublimetext.com">Sublime Text 2</a>. As the title suggests, this book intends to get you started with the editor and for three quarters of the book, it really will start you at the very beginning: installation and saving a document.</p>

<p>The book’s downside is that it doesn’t seem to know quite who its audience is. It begins with basic installation instructions – the sort we take for granted and gloss over in all software manuals, especially the ones programmers ignore on a day-to-day basis because we think we know better. After installation, you’re given five pages on how to create, or open and modify, a file, and how to save the results.</p>

<p>This shows how basic the book starts at, which is fair enough for anyone not too used to these tools. However, given Sublime Text 2’s core audience is programmers, it may come across as odd at best and possibly demeaning at worst. Either way, the first 28 pages are likely not intended for programmers. So, we’ll skip past those 28 pages as redundant and get to the parts that don’t pertain to every piece of software intended for modifying some kind of file on the planet.<sup id="fnref:2013_03_04_emacs"><a href="#fn:2013_03_04_emacs" rel="footnote">1</a></sup></p>

<p>We go on to learn about the minimap, multiple cursors, distraction-free mode, vintage mode, the goto panels and the command palette. Except for the explanation of vintage mode, these are all perfectly acceptable and include helpful screenshots and relevant key-bindings. My only complaint with these is that they are more or less covered by <a href="http://sublimetext.com">Sublime’s front page</a>, as well as likely comprising the subjects of all Sublime Text 2 tutorials. For vintage mode, the book’s explanation only scratches the surface of its use and suggests only Vim users should use it, but I’m not sure a Vim user would read this book, so I’m again unsure who the book is for.</p>

<p><img src="http://www.spifftastic.net/wp-content/uploads/sub-prefs.png" width="241" height="249" style="float:right" />There is minor one downside to vintage mode’s explanation though, a bit of misinformation on the part of the book: it tells users to modify Sublime’s default preferences. This is a no-no, you never modify the default preferences. If you suggest the user modify preferences, you tell them to modify the <em>user preferences</em>, pictured to the right.</p>

<p>For most purposes, this won’t produce a noticeable difference, but it does result in a user unable to easily copy his or her settings over to new installations or versions of Sublime. This might not seem like an issue now, but it will present an issue with the coming release of Sublime Text 3. So, there is a small risk of future frustration involved.</p>

<p><em>Starter</em> also goes on to mention <a href="http://wbond.net/sublime_packages/package_control">Package Control</a>, including some perhaps frustrating installation instructions fraught with potential bit-rot. This isn’t likely to be an issue for most people, but typing seven lines of Python into the Sublime Text 2 console is not the most pleasant experience. Thankfully, the author includes a link to the Package Control site as I have above.</p>

<p>The explanation of snippets is mostly sufficient, though the formatting of the book results in some unfortunate line wrapping in the snippet that produces less than eye-catching imagery. In addition, the snippet example provided by the book is invalid and will cause Sublime to insert nothing when using it. This sort of error is par the course for tech books, so I’m inclined to forgive it even if it highlights the sorry state of tech books.</p>

<p>Finally, the book finishes up with macros (never once mentioning how to create your own plugins, but this book is a “starter” and not likely to cover anything advanced despite expecting users to know how to work with XML and JSON). Custom key-bindings are shoehorned in as a part of macros rather than their own rather expressive feature, which is disappointing and perhaps not showing users just how much they can customize their key-bindings to their liking. Either way, the discussion of macros is mostly sufficient, though likely to frustrate users when they discover the limitations of Sublime macros (like certain commands not being recorded or working in macros).</p>

<p>Ultimately, the book seems to expect some level of experience with technology but simultaneously assumes none from the start, so the first chunk of the book might be well-suited for those who don’t know how to install software, but they would be lost in later sections. For those experienced enough to breeze past installation and those who know how to save a document, the rest of the book might work for them, but its brevity leaves something to be desired — again, a byproduct of the book’s attempt to get readers started with Sublime, but never seeming to try to imbue them with the skills needed for further use.</p>

<p>Rather than purchasing the book, either $4.24 for a digital copy or the much more expensive print copy at $19.99 (effectively $20, which is far beyond what anyone ought to pay for 46 pages, 28 of which cover installing an application), I’d recommend waiting for another edition — if you still want to consider this book. Wait for one that cleans up the few errors in the book and goes into enough depth to leave you with the feeling of knowledge gained.</p>

<p>As it is, though the book might be of use to someone, I’m not sure either I or the book know where to find that someone. The audience for the book would have to be someone who doesn’t program, doesn’t know how to install software, and possibly uses Internet Explorer 6. Instead, do as the end of the book suggests and take a gander at <a href="https://tutsplus.com/course/improve-workflow-in-sublime-text-2/">Jeffrey Way’s Sublime Text videos</a>, read over the <a href="http://docs.sublimetext.info/en/latest/index.html">unofficial documentation</a> and for anything else, join the <a href="http://www.sublimetext.com/forum/">Sublime forums</a>.<sup id="fnref:2013_03_04_irc"><a href="#fn:2013_03_04_irc" rel="footnote">2</a></sup></p>

<div class="footnotes">
     <ol>
       <li id="fn:2013_03_04_emacs">
         <p>Except for Emacs, which routinely forgoes the use of conventional key-bindings in favor of more esoteric ones, such as <code>⌃x⌃s</code> (<code>C-x C-s</code>) for save.<a href="#fnref:2013_03_04_emacs" rev="footnote">&#8617;</a></p>
       </li>
       <li id="fn:2013_03_04_irc">
         <p>For those who practice the necromantic art of IRC, you can also find many Sublime Text users, which includes myself, in <code>#sublimetext</code> on Freenode.<a href="#fnref:2013_03_04_irc" rev="footnote">&#8617;</a></p>
       </li>
     </ol>

</div>]]></description>
    </item><item>
      <title>Nexus 7: First Impressions</title>
      <link>http://spifftastic.net/post/2012/12/nexus-7-first-impressions</link>
      <guid isPermaLink="true">http://spifftastic.net/post/2012/12/nexus-7-first-impressions</guid>
      <pubDate>Fri, 07 Dec 2012 11:31:03 -0700</pubDate>
      <description><![CDATA[
<p>First impressions of the Nexus 7 after a week using it. This won’t include a lot of references to iOS and such except where there’s an odd discrepancy, like with email, or things seem about equivalent between platforms (like Flipboard sucking). Cue bullet-points because I’m lazy:</p>

<ul>
  <li>Android still has an obsession with wasting large amounts of home screen real estate with enormous clocks. Why all the large clocks? You already have a clock in the corner of your screen, it’s in the status bar. The analog clock sucks as well since it’s very lousy at telling time.</li>
  <li>Scrolling is mostly smooth for the first time in Android’s history. It’s still not great, but the input lag is mostly gone, though it regularly seems to skip rendering stuff just to keep up with the input, which looks ugly. Still, it’s an improvement.</li>
  <li>Scrolling inertia feels very strange. I flick and it doesn’t seem to do a whole lot, but I flick again and it’s like I’ve broken the speed of light. Very inconsistent and very weird.</li>
  <li>Screen resolution is acceptable but the way the UI is designed makes it a rather poor decision. You’ve got two mandatory bars on the top and bottom of the screen at all times, so in landscape orientation, your vertical space is limited by a lot. Further, if you try to use the keyboard in landscape, you’re given a tiny sliver of an area to work with — even less if the field pops up the predictive text bar too. This obsession with widescreen aspect ratios really needs to end if tablet manufacturers want to continue making tablets designed for both orientations.</li>
  <li>The onscreen keyboard in portrait is excellent, especially with Android 4.2’s addition of swipe-typing (basically ripping off whoever came up with it first, doesn’t really matter, though I expect Swype is slightly miffed). In landscape, typing out things with my thumbs is easy enough. Typing any other way, including swiping, is tedious and better off done in portrait.</li>
  <li>Google Currents, which was pre-installed, is excellent. Beats the everloving hell out of Flipboard, which really, really sucks (both on iOS and Android these days).</li>
  <li>App selection is still garbage. There are no good apps for writing aside from — amazingly — Google Docs, which is actually completely usable via the Google Drive app now. It’s very good, though limited (which is fine for me — I don’t want a full-featured word processor, just something to write in).</li>
  <li>The bezel is too small in portrait. I’m frankly not sure how you’re suppose to hold the thing like this without accidentally tapping the screen.</li>
  <li>The Gmail app is worse than I remember it. No unified inbox and no pull to refresh and so on. Seems unusually limited. I seem to remember the Gmail app being better, but I guess iOS just improved a lot over time.</li>
  <li>Also, really, we’re still using two separate apps for Gmail and regular mail? Give me one app and let me have my inboxes all in the same damn place.</li>
  <li>The official Twitter app is shit. End o’ story there.</li>
  <li>The Google+ app is far worse than its iOS equivalent. It really sucks in comparison, which is strange considering one would expect Google to make Google+ more compelling (I hate that word) on Android.</li>
  <li>People call this thing “pocketable,” and while I can fit it in a pocket, I think the sheer goofiness of having a tablet in your pocket and the shame that comes from that is enough to make it un-pocketable. Also, the power button is too easily pressed, so putting it in your pocket will probably result in it being frequently woken from sleep.</li>
  <li>Holding this thing in the palm of your hand, with a thumb on one side and your remaining fingers on the other, is stupid and uncomfortable too. I don’t know why this attribute is considered positive.</li>
  <li>Notifications as usual are best in class.</li>
  <li>AndChat is still free and it’s still a great IRC client. Also, thanks to the way Android handles multitasking, I never lose my connection to a server.</li>
  <li>Chrome is an acceptable improvement over Android’s original browser, though it pales in comparison to every other mobile browser and Google should be ashamed of themselves for shipping such a lackluster piece of crap. Hell, it’s on a tablet and it doesn’t even have a bookmarks bar, so I can’t use any of my nice Javascript bookmarks.</li>
  <li>On the topic of bookmarks, there is no good way to access them. I either have to replace my current tab with Chrome’s bookmarks UI or go back to the home screen and put a widget down to see my bookmarks. Why can’t I just browse them via a popover? Also, small icons with tiny captions are not the best format for bookmarks. Give me a list so I can actually see the titles of my bookmarks.</li>
  <li>The Kindle app works fine. Google Books is still garbage and a usability nightmare.</li>
  <li>Google Maps beats Apple Maps, but you knew that already. They’re about on par around here, though, so it makes little difference.</li>
  <li>The 1Password app on Android sucks. It’s basically an attempt to clone the iOS UI, and you can guess how well that went.</li>
  <li>Google Music is very, very strange. I try to upload a playlist and it kills random songs from it even though the songs have been uploaded. The app itself is a confusing mess. For some reason I can only see how many songs a playlist has in landscape. Overall, it sucks, but at least it’s not Winamp.</li>
  <li>Google Music’s icon is the ugliest thing on this OS.</li>
  <li>Google Calendar has the most schizophrenic and useless user interface ever. I like that I can scale the week view, though.</li>
  <li>Kevin Coppock’s <a href="https://play.google.com/store/apps/details?id=com.kcoppock.holoku">Holoku</a> is still the best sudoku app for Android.</li>
  <li>I shouldn’t have to tap a button seven times to enable the developer settings. Really, that’s stupid.</li>
  <li>Voice search is about the same as Siri — good for setting alarms and reminders. Unfortunately, Google just creates a calendar entry for a reminder, so it’s a bit annoying that there’s no difference in priority between a calendar entry and a reminder.</li>
  <li>Dropbox sucks on here.</li>
  <li>Viewing PDFs in either the PDF viewer that’s built in or Acrobat is slow as all heck and I don’t know why.</li>
  <li>Updating one or more apps causes the OS to become rather unstable and not register touches. The Play Store app is nigh unusable while any apps are updating as it will constantly attempt to refresh its UI and generally ignore whatever you’re doing.</li>
  <li>The speaker can get very loud but sounds very shitty no matter what volume you use. Use headphones.</li>
  <li>Setting the wallpaper is much easier now and the UI for doing so is very well designed. That said, why when pressing the back button after I’ve selected an image am I taken back to the home screen and not the view for selecting an image? What if I just decided a different image was better? I don’t want to have to long-press somewhere on the home screen just to get back to my pictures and select a wallpaper image again. This is retarded.</li>
  <li>Speaking of retarded, the back button’s fairly inconsistent about where it’ll take you. This is especially obvious if you get taken to the browser, whereupon the back button seems to just be the browser’s back button.</li>
</ul>
]]></description>
    </item><item>
      <title>Spifftastic on OakTree</title>
      <link>http://spifftastic.net/post/2012/08/spifftastic-on-oaktree</link>
      <guid isPermaLink="true">http://spifftastic.net/post/2012/08/spifftastic-on-oaktree</guid>
      <pubDate>Thu, 09 Aug 2012 18:59:53 -0600</pubDate>
      <description><![CDATA[
<p>As of today, Spifftastic now uses <a href="https://github.com/nilium/oaktree">OakTree</a> instead of WordPress. This post is fairly short because there’s not a lot to say, but I’ll try to talk about the transition a bit.</p>

<p>Most of the WordPress theme ported over cleanly. The stylesheet is the same, save for a few changes to accomodate the Google +1 button and to remove any vestigial traces of WordPress. The theme previously made use of a sidebar, which meant bits of the default WordPress widgets were themed. All of that’s gone now, so it’s surprisingly clean. The theme’s overall structure is still something of a mess from accumulated cruft over the years, but otherwise it works as expected.</p>

<p>The feed was my main concern. First, I’d previously never looked into generating RSS feeds, so I expected a great deal of pain and suffering to get it working. Turns out I was wrong: RSS feeds are dead simple. I suppose it lives up to its name in that regard – it’s a very, very pleasant format to work with.</p>

<p>Second, the RSS feed location changed. As you can see in the previous post, I created a FeedBurner URL for the feed, but this turned out to be more or less unnecessary. mod_rewrite took care of most of the URL-changing pains (previous permalinks were <code>year/month/post-slug</code>, whereas they now have a <code>post/</code> prefix). As a result, the feed issue is mostly gone. The FeedBurner URL will remain active because I’m a jackass and didn’t consider the options at the time, but it won’t harm anyone to switch.</p>

<p>So, Spifftastic now uses OakTree. About damn time.</p>

]]></description>
    </item><item>
      <title>Spifftastic RSS Feed</title>
      <link>http://spifftastic.net/post/2012/08/spifftastic-rss-feed</link>
      <guid isPermaLink="true">http://spifftastic.net/post/2012/08/spifftastic-rss-feed</guid>
      <pubDate>Thu, 09 Aug 2012 02:04:29 -0600</pubDate>
      <description><![CDATA[
<p>Hey, turns out the RSS feed changery is unnecessary. The FeedBurner URL will continue to work, of course, but mod_rewrite appears to have taken care of most issues with the change-over (all permalinks still work and whatnot).</p>

<p class="strike">If you’re currently reading this via an RSS reader, you should probably update your feed URL to the new <a href="http://feeds.feedburner.com/Spifftastic">FeedBurner URL</a> at <a href="http://feeds.feedburner.com/Spifftastic">http://feeds.feedburner.com/Spifftastic</a>. Ordinarily, I would like to avoid changing the feed location, but I’ll be moving Spifftastic over to <a href="https://github.com/nilium/oaktree">OakTree</a> shortly, and given my infrequent updates, would at least like to give folks a chance to switch over before I pull the plug on the old feed (which will be replaced with a new feed that FeedBurner can automatically move you to).</p>

<p>There will be a few more changes to Spifftastic, including the addition of a Google +1 button (until I decide I hate them) and the removal of the site’s search function (because it’ll be static HTML). I hope these changes won’t affect anything drastically, as the button is fairly small and part of the post meta and the search function never really got any use anyway.</p>

<p class="strike">So, update your feeds and you’ll be good to go when I finally plant OakTree.</p>

]]></description>
    </item><item>
      <title>bork: Shell to Ruby</title>
      <link>http://spifftastic.net/post/2012/07/bork-shell-to-ruby</link>
      <guid isPermaLink="true">http://spifftastic.net/post/2012/07/bork-shell-to-ruby</guid>
      <pubDate>Fri, 27 Jul 2012 09:40:15 -0600</pubDate>
      <description><![CDATA[
<p><a href="https://github.com/nilium/bork">bork</a> is my tiny file-tagging utility that essentially maps files to hashes and hashes to tags and so on using the filesystem. It could also probably use a regular db like sqlite, but it doesn’t. This post is mostly discussing one of the important changes that happened while building bork: the transition from shell script to Ruby.</p>

<p>bork initially started out as a series of shell scripts with a fairly simple structure inspired by git (whether git is actually structured this way, I do not know, I’m simply going off appearances): a main jumppad sort of script that calls into other scripts that actually do what I want. This ultimately led to a structure that basically looks like this:</p>

<pre><code>|++ bin
    |- bork
    |++ bork-exec
        |- bork-add
        |- bork-relative-path-to
        |- bork-rm
        |- bork-station
        |- bork-update
        |- ... and so on
</code></pre>

<p>This sort of structure actually lends itself fairly well to the particular idea I was going for, where you can work with bork in two different ways:</p>

<ol>
  <li>By using the jumppad script: <code>bork add ...</code></li>
  <li>By using the scripts directly: <code>bork-add ...</code></li>
</ol>

<p>The reason this worked well is that each bork command depended on other bork commands. Most bork commands depended on bork-station to get an absolute path to the nearest bork station, the directory containing all hashed files and tags and so on that allow bork to work. It works in a fashion similar to git as well (and likely Subversion and other tools like them) in that it searches the current working directory (CWD) and all directories above the CWD for a station. Almost all commands required a bork station, so they’d run bork-station to get a path (if there was one) and do their thing. Some others depended on bork-update, such as bork-rm and bork-find, both of which modified the station and therefore depended on it being up-to-date.</p>

<p>A second upside is that this potentially allows me to replace various commands down the road with new implementations. Ideally, I should be able to pull out an old shell script, replace it with something written in C, and call it good. Shell script isn’t particularly fast, so I was expecting this to become an issue fairly quickly, and I was right.</p>

<p>What I was wrong about was the ease with which I can replace commands with new implementations. To do a new implementation that doesn’t simply go out, run a new process to do something, and return some results back to the calling command means rewriting most of bork in the new language. Having two separate implementations of a particular aspect of bork isn’t really the best idea, so the way I saw it was fairly simple: rewrite the whole thing and ditch the original structure or put up with the less than pleasant idea of dealing with reading/writing from pipes to other processes. Not too difficult, but also not fun. The latter is unpleasant enough to do a complete rewrite, so rewrite I did.<sup id="fnref:2012_07_27_1"><a href="#fn:2012_07_27_1" rel="footnote">1</a></sup></p>

<p>I was more or less settled on using Ruby for the project, so that was the target language. bork’s predecessor, a series of Ruby scripts to do roughly the same thing,<sup id="fnref:2012_07_27_2"><a href="#fn:2012_07_27_2" rel="footnote">2</a></sup> had proven that Ruby was good for the job, so it wasn’t about to change. Next step: gemification (this was the branch name). bork was originally a tool to generate Makefiles, so I had a gemspec sitting around for it and recycled that. The directory structure was mostly there already, though at the time you wouldn’t have known it by looking at the git repo.</p>

<p>I kept the jumppad script, which had always been written in Ruby for convenience (its <code>Kernel#exec</code> provided an easy way to jump from <code>bork</code> to the command script). It was heavily refactored, but for the most part you can see a lot of the same code in the same places. I moved command scripts into individual Ruby files under a <code>Commands</code> module, each registering itself with the default <code>Bork::Hub</code> instance, which collected command classes for the jumppad and allowed commands to run other commands (provided they’d been loaded).</p>

<p>The <code>Bork::Station</code> class ended up becoming the most important class, containing all methods for accessing data contained in any given station and manipulation those stations. I’d ordinarily feel bad about this, but stations are so small in their functionality that the class never becomes too big. If anything, some of the methods could use refactoring into smaller methods, but otherwise the conversion went fairly well. The important point of this, however, is that the <code>Bork::Station</code> class is effectively bork – everything that makes bork bork resides in it. The hub is only there for the jumppad’s sake and the command classes simply get to a station and do stuff with it.</p>

<p>So this means that there is an opportunity to build other projects around bork’s stations. It’s entirely possible that one could subclass a station and add new functionality to it, new metadata, and so on. So, there’s a lot of potential there, provided I refactor the hell out of some of the functions. Eventually, it would be nice to split up the station into the interface and a backend. Either that or simply define a base class for stations to implement and let them go from there. Who knows what maddening things I could do there.</p>

<p>So, that’s bork’s shell to Ruby conversion in short. I have to say, it was a lot of fun writing bork, so I’m glad Ruby makes this stuff so pleasant.</p>

<div class="footnotes">
     <ol>
       <li id="fn:2012_07_27_1">
         <p>There were probably other options I didn’t consider or ignored, but these were the biggest ones on the table. I treat the shell script version of bork as a prototype that got the idea working and the station structure set up, while the Ruby implementation is the current end goal (until Ruby is too slow).<a href="#fnref:2012_07_27_1" rev="footnote">&#8617;</a></p>
       </li>
       <li id="fn:2012_07_27_2">
         <p>Long lost to accidental deletion. This was when I didn’t use version control (git wasn’t terribly accessible yet and Subversion was a huge pain in the ass to set up) and keep all my neat toys in some project directory. These days, I’m a little more careful, though I admit to sometimes using <code>rm -rf</code> to wipe out entire directories without thinking.<a href="#fnref:2012_07_27_2" rev="footnote">&#8617;</a></p>
       </li>
     </ol>

</div>]]></description>
    </item><item>
      <title>I Left Facebook</title>
      <link>http://spifftastic.net/post/2012/06/i-left-facebook</link>
      <guid isPermaLink="true">http://spifftastic.net/post/2012/06/i-left-facebook</guid>
      <pubDate>Tue, 26 Jun 2012 11:21:50 -0600</pubDate>
      <description><![CDATA[
<p>I expected I would close my Facebook account for a long time now, but I finally dropped it. Last night I deactivated my account. Once I’ve determined I have all the data I want out of it, I will permanently delete the account.</p>

<p>Why leave Facebook now? Mainly because they moved everyone’s email address over to an <code>@facebook.com</code> address.<sup id="fnref:2012_06_26_1"><a href="#fn:2012_06_26_1" rel="footnote">1</a></sup> This by itself is a fairly benign change at face value, but it also creeps me out and violates my one rule of social networking: <em>never</em> modify the information a user provides.</p>

<p>By changing everyone’s visible e-mail address, Facebook likely hopes to route all communications through its servers. Access to user emails gains them further access to personal information in e-mails and such, and that information furthers their advertising goals. Google more or less does this with Gmail already – it’s not as though Facebook has committed themselves to some heretofore unseen evil. However, I trust Google more than Facebook. This level of trust is likely arbitrary, but it’s still there. As such, the one rule comes into play.</p>

<p>The assumption I make with a social network is that the data I give them is immutable on their end. They are then free to connect it to other data, do whatever creepy things they see fit to do in the background, and generally do the usual slimy things with my data. But for the profile I give them, I expect the data to remain as I set it. If the network changes my data, it has then violated the idea that I control my information. Facebook disagrees with this rule and believes they control my information.  I’m obligated to condemn their actions, so I danced my worthless protest and closed my Facebook account.</p>

<p>For now I’ll reside mainly on <a href="https://plus.google.com/106780644605655660368">Google+</a> and <a href="https://twitter.com/nilium">Twitter</a>. Google still retains more of my trust than it perhaps deserves. That said, it’s not entirely misplaced: they’ve stored my emails in relative safety for years. Twitter seems benign enough that the information they have seems useful only in a union of all other social network data. Therefore both retain my membership for the time being.</p>

<p>Adiós, Facebook. I won’t miss you.</p>

<div class="footnotes">
     <ol>
       <li id="fn:2012_06_26_1">
         <p>See Ars Technica’s <a href="http://arstechnica.com/business/2012/06/facebook-forces-all-users-over-to-facebook-com-e-mail-addresses/">article</a> for more on the subject.<a href="#fnref:2012_06_26_1" rev="footnote">&#8617;</a></p>
       </li>
     </ol>

</div>]]></description>
    </item><item>
      <title>The End: Ascension</title>
      <link>http://spifftastic.net/post/2012/05/the-end-ascension</link>
      <guid isPermaLink="true">http://spifftastic.net/post/2012/05/the-end-ascension</guid>
      <pubDate>Thu, 31 May 2012 18:14:13 -0600</pubDate>
      <description><![CDATA[
<p>Over a year ago, I programmed, designed, and shipped <a href="https://play.google.com/store/apps/details?id=com.cower.ascension">Ascension</a>. It made a small headway as a live wallpaper but never did particularly well.  Live wallpapers occupy a niche of the Android Market, now Google Play, and serve no utility.  They provide mild entertainment and pleasure, but developers give you little reason to purchase one.  The best we can do is show a picture of it that looks pretty cool.  Ascension looks pretty cool.  I still think it looks pretty cool and represents a sort of higher-end in live wallpapers.  Users customize it to suit their tastes, and customization sits as the most important feature of Ascension.  Folks still wanted more, but I didn’t.</p>

<p>I privately declared Ascension a finished project some time ago, mostly around when I finally decided Android development depressed me.  A few users have since contacted me and learned this as well.  I’d never declared a project finished before, at least not a user-facing one.  Sure, I’ve made libraries and they’re finished, but nothing sold directly to consumers.  The decision came easy, though: I wanted nothing else out of Ascension, wanted nothing to do with Android, so I stopped.  I prefer to work on what makes me happy.  Working on Ascension brought only the opposite feeling.  So I stopped.</p>

<p>Ascension became feature complete the day I released it, with bug fixes and small additions afterward as a sort of bonus while it continued to sell well enough to cover a cheap meal a day.  But sales slowed down despite updates and I decided then that only bugs would get me to update it.  Then I decided that only bugs that I could test would get me to update it.  Turns out Ascension lacks many bugs, if any.  I’d received a few bug reports of unusual foreign handsets failing to run it, but I honestly didn’t care.  They appeared to fill the cheap phone role, and I had no interest in supporting those users.  They were all Lite version users anyway.</p>

<p>The Lite version may have been my one big mistake.  I released a feature-stripped version of Ascension for users to try, mostly as an experiment.  If it resulted in increased sales, the free version would stay.  If it hurt things, it would go.  Unfortunately, results were mixed, and I let the Lite version be.  Ultimately, it seems more likely that only people interested in getting a free app downloaded the Lite version.  I pulled it from Google Play earlier this year.</p>

<p>In the end, Ascension pleased a good number of people.  The e-mails users sent me seem to prove that.  The comments on the app seem to prove that.  The consistently high rating on the Market seems to prove that.  I made something I wanted for my phone, sold it, and easily made back the cost of development.  It was a worthwhile project.  But it’s done, so I suppose I should get back to my current project.  Back to the project that makes me happy.</p>

]]></description>
    </item><item>
      <title>Sublime Text 2 Theme — Nil</title>
      <link>http://spifftastic.net/post/2012/05/nil-theme</link>
      <guid isPermaLink="true">http://spifftastic.net/post/2012/05/nil-theme</guid>
      <pubDate>Fri, 25 May 2012 16:48:36 -0600</pubDate>
      <description><![CDATA[
<p>Today I released my Sublime Text 2<sup id="fnref:2012_05_25_1"><a href="#fn:2012_05_25_1" rel="footnote">1</a></sup> theme, <a href="https://github.com/nilium/st2-nil-theme">Nil</a>.  It’s comprised mainly of solid colors and tries to communicate mostly through what I hope is a quick and obvious use of color rather than an attempt to be too flashy.  Though it probably is slightly flashy just for being a dark theme.  Have a screenshot:</p>

<h2 id="2012_05_25_the-nil-theme">The Nil Theme</h2>

<div class="thumbnail"><a href="/wp-content/uploads/2012/05/screenshot.png" title="Nil"><img src="/wp-content/uploads/2012/05/nil-screen.png" style="width:620px" /></a></div>

<p>Regarding colors, blue is the active buffer/selection, orange is a dirty buffer/selection in tabs and open files, and subdued orange is inactive and dirty in tabs and open files.  Aside from that, everything is a shade of grey and keeps my eyes in a state of relative happiness.  In particular, the tab colors are intended to communicate state better than something that might be easy to overlook, like a little dot.</p>

<h2 id="2012_05_25_installing-the-theme">Installing The Theme</h2>

<p><a href="https://github.com/nilium/st2-nil-theme">The theme can currently be downloaded on Github</a>.  I’ve submitted it for inclusion in Sublime Package Control, though if and when that happens seems indeterminable right now.  Installation is fairly simply, and the <a href="https://github.com/nilium/st2-nil-theme/blob/master/README.md">README</a> covers it all.  However, for the sake of simplicity, or in the event that you don’t want to visit Github, the instructions are as follows:</p>

<blockquote>
  <p>You can download or clone the repository into your Sublime Text 2
<code>Packages</code> directory. To do this, simply navigate to
<code>~/Library/Application Support/Sublime Text 2/Packages</code> (or wherever it
is on your particular operating system) and run the following command:</p>

  <pre><code>$ git clone git://github.com/nilium/st2-nil-theme.git 'Theme - Nil'
</code></pre>

  <p>It’s <strong>very important</strong> you clone the repository into the <code>Theme - Nil</code>
directory otherwise the theme won’t locate its assets and will take on
an eldritch appearance. You don’t want <a href="http://en.wikipedia.org/wiki/Shub-Niggurath">Shub-Niggurath</a> crawling
out of your screen, so remember, put it in the right directory.</p>
</blockquote>

<p>So there you have it.  If the theme appeals to you in any way, go right ahead and download it.</p>

<h2 id="2012_05_25_acknowledgments">Acknowledgments</h2>

<p>The theme itself is a fork of <a href="https://github.com/raik/st2-pseudo-osx-theme">Raik Ilves’s Pseudo OSX theme</a>, which is in turn a fork of <a href="https://github.com/buymeasoda/soda-theme">Ian Hill’s Soda theme</a>.  So, we’ve got a bit of a chain going now.  Additionally, I would not have done this at all had I overlooked <a href="https://github.com/BoundInCode/st2-refresh-theme">Liam Cain’s Refresh theme</a>, which is another nice alternative.  Basically, if you don’t like the Nil theme, these three are all excellent alternatives.  I wouldn’t have done this without the three of them.  Check ‘em out.</p>

<div class="footnotes">
     <ol>
       <li id="fn:2012_05_25_1">
         <p><a href="http://www.sublimetext.com/">http://www.sublimetext.com/</a><a href="#fnref:2012_05_25_1" rev="footnote">&#8617;</a></p>
       </li>
     </ol>

</div>]]></description>
    </item><item>
      <title>Starting with The PlayBook</title>
      <link>http://spifftastic.net/post/2012/05/the-playbook</link>
      <guid isPermaLink="true">http://spifftastic.net/post/2012/05/the-playbook</guid>
      <pubDate>Sun, 13 May 2012 11:30:03 -0600</pubDate>
      <description><![CDATA[
<p>Back around the end of March, I posted on Twitter that I wouldn’t be able to develop for the BlackBerry PlayBook because I simply couldn’t afford a device.  It interested me, much in the same way webOS interested me.  The PlayBook is a 7-inch tablet that never gained traction in the market, but it’s still a device running an interesting operating system: QNX.<sup id="fnref:2012_05_13_OS"><a href="#fn:2012_05_13_OS" rel="footnote">1</a></sup>  Interesting means I want to code for it.  But there’s the cost.  So, following that tweet, two folks from RIM contacted me and asked for my address.  Not long afterward, they shipped me a PlayBook, and since then I’ve fiddled with it and its developer tools.</p>

<p>The PlayBook itself is much nicer than I’d expected.  RIM knew how to create a nice OS and a nice tablet, at least.  In particular, it doesn’t feel cheap.  My HP Touchpad suffered from creaky plastic, it felt cheap, but the PlayBook avoids this.  The device has a back coated in some rubber-ish material which makes it pleasant to hold.  The power button, despite what reviews have said about difficulty using it, seemed easy enough to press.  Overall, it’s a very nice piece of hardware and remarkably comfortable in the hand.</p>

<p>The only complaint I have about the device itself is its bezel: RIM printed “BlackBerry” across the bezel.  If I pick up the device and hold it at any orientation other than the text’s, it looks stupid.  The iPad benefits here from having really no markings on its front aside from the home button, and that doesn’t demand a proper orientation.  If I pick up my iPad and start to use it upside down, the screen will reorient itself.  It doesn’t look stupid, it just works.  It accommodates the user.  I’m not sure why RIM feels it must remind the user they’re holding a BlackBerry device, but, again, it looks stupid.</p>

<p>The PlayBook ships with a number of apps and their quality varies, which I expect.  Most apps are reasonably nice, but slow.  I just expect scroll lag in non-iOS software now.  webOS suffers from it, Android suffers from it, and QNX, the PlayBook’s OS, suffers from it.  It’s especially noticeable, of all places, in App World, RIM’s app store.  When I attempt to scroll through applications in App World, it stutters through a small list of applications, frustrating me.  This is curious, but I assume it’s a side-effect of certain applications using either Adobe AIR or WebWorks (essentially HTML/JS apps).  AIR apps all seem to suffer performance issues.  I haven’t seen many WebWorks apps, but I assume they suffer the same – browser performance on these devices just isn’t there.  The iOS can’t handle it, and my own little tests with WebWorks seem to show the PlayBook can’t either.  Maybe future browsers and devices will make web apps appear equal to native apps, but until then it’s a bad idea.</p>

<p>This presented a problem for me when I decided to look at how a developer might make a fairly normal GUI app.  Currently, you have two options: Adobe AIR and WebWorks.  Again, these suffer from performance issues.  The WebWorks route is simple, but RIM offers developers very little assistance.  There is no usable GUI framework via JavaScript.  You’re very much on your own there, which is fair enough for web apps, but makes it difficult to create apps that fit in with the rest of the OS.</p>

<p>AIR offers a GUI framework of sorts, but the performance issues are so frustrating that I can’t imagine subjecting a user to them (and yet RIM has done just that).  In addition to that, I find the entire development process for AIR apps frustrating.  While WebWorks keeps the process simple, AIR seems built only for developers using Adobe’s wonderfully overpriced software rather than command-line tools.  So, if you’re not willing to pay anywhere from $250 the $700 USD, you might as well ignore AIR altogether.</p>

<p>Your third option<sup id="fnref:2012_05_13_Android"><a href="#fn:2012_05_13_Android" rel="footnote">2</a></sup> for app development is the NDK: C and C++, not much else.  You get your common libraries for these devices, including OpenGL, APIs for the OS and its windowing system, and other expected libraries.  That’s about it.  This should change with the next version of the OS, apparently BlackBerry 10, as RIM introduces Qt and Cascades, the latter a framework used by The Astonishing Tribe (TAT).  To put into perspective how important that last bit is, let me just say that the applications that seem most apparently built by TAT are also those that never experience lag.  Never.  Their apps, however, are also about as useful as toys, so make of that what you will.  Currently, however, Cascades and Qt are not exactly ready.  You can demo them now, but I don’t imagine you’ll make a PlayBook app using either.</p>

<p>The NDK, despite its lack of a GUI framework, is actually the nicest of the three options for application development.  Game developers in particular seem pretty well off here.  RIM provides some utility code to create an EGL context, render text, handle orientation changes, and so on.  It’s not much, but it reduces the amount of code one has to write.  Additionally, one can inspect the code to see that it’s not doing anything funny and otherwise just learn how RIM expects developers to handle things.  I think RIM knew what they were doing here, so it’s a shame that they didn’t put more into it.  AIR and WebWorks are, by comparison, garbage.  AIR in particular offers the most tortuous route to application development.  WebWorks is nice but it’s too early to view HTML apps as competitive with native apps.  For someone like me, the NDK is really the only good option for PlayBook development.</p>

<hr />

<p>I’ll probably continue writing some posts about this, but this should serve as a sort of introductory post for future writing on the PlayBook.  If there’s something in particular someone is curious about, I’ll be glad to divert some focus to that as well.  Personally, I’d rather write about development, so now that my semester is over and I have a summer’s worth of time to do some work, I’ll try to offer some sort of commentary on development for the PlayBook and other devices.</p>

<div class="footnotes">
     <ol>
       <li id="fn:2012_05_13_OS">
         <p>Officially, I believe RIM refers to the OS as “BlackBerry Tablet OS.”  Not the marketing department’s finest work.  Later, they’ll probably refer to it as “BlackBerry 10” when that’s released.  That said,  I prefer “QNX.”  It’s simple.<a href="#fnref:2012_05_13_OS" rev="footnote">&#8617;</a></p>
       </li>
       <li id="fn:2012_05_13_Android">
         <p>There is a fourth option for application development, but I cannot in good faith ever recommend it to anyone: Android development.  The PlayBook ships with some bits of Android, but the results are terrifyingly bad.  All Android ports for the PlayBook <em>feel</em> cheap and look completely out-of-place on the device.  This might appeal to developers who don’t care about the PlayBook, but otherwise you should avoid this option like the creepy doll in your attic.  And trust me, that creepy doll lives in your attic.  You just don’t want to remember.<a href="#fnref:2012_05_13_Android" rev="footnote">&#8617;</a></p>
       </li>
     </ol>

</div>]]></description>
    </item><item>
      <title>Zero</title>
      <link>http://spifftastic.net/post/2012/02/zero</link>
      <guid isPermaLink="true">http://spifftastic.net/post/2012/02/zero</guid>
      <pubDate>Tue, 21 Feb 2012 05:13:06 -0700</pubDate>
      <description><![CDATA[
<p>Count the number of new “social networks” focused on providing some equivalent to a “Like” button for something other than the web in general.  Count the number that require you to take a picture of it and share said picture.  Count the number that focus on food, especially.  Particularly count those with a focus on mobile phones, often with their primary interface being through a phone.  Count the number that actually claim to be a “Like” button for the rest of the world.</p>

<p>Now count the number that don’t suck.</p>
]]></description>
    </item>
  </channel>
</rss>