<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link rel="hub" href="http://tumblr.superfeedr.com/" xmlns:atom="http://www.w3.org/2005/Atom"/><description>I’m a software developer who specializes in building great web applications, with a passion for future-friendly code, human and device accessibility, and open data.</description><title>Kelli Shaver</title><generator>Tumblr (3.0; @kellishaver)</generator><link>http://kellishaver.tumblr.com/</link><item><title>How I Slept Last Night: An Illustrated Guide</title><description>&lt;img src="http://25.media.tumblr.com/2c0bfa251d655c849ca9e6f1c8b23d77/tumblr_mlkm022H9K1rnnanlo1_500.png"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;&lt;div class="post_title"&gt;How I Slept Last Night: An Illustrated Guide&lt;/div&gt;&lt;/p&gt;</description><link>http://kellishaver.tumblr.com/post/48464106757</link><guid>http://kellishaver.tumblr.com/post/48464106757</guid><pubDate>Sat, 20 Apr 2013 16:24:02 -0400</pubDate></item><item><title>Julio's Blog: Hiring front-end developers</title><description>&lt;a href="http://julio-ody.tumblr.com/post/7005465282/hiring-front-end-developers"&gt;Julio's Blog: Hiring front-end developers&lt;/a&gt;: &lt;p&gt;&lt;a class="tumblr_blog" href="http://julio-ody.tumblr.com/post/7005465282/hiring-front-end-developers"&gt;julio-ody&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I’ve been getting a handful of emails offering me front-end jobs recently. Probably about time I admit that I like spending most of my time doing that, even though I ♥ my Rubies and &lt;em&gt;I still believe developers who specialise end up worse off&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;So I’ve decided to put down in words some thoughts…&lt;/p&gt;
&lt;/blockquote&gt;</description><link>http://kellishaver.tumblr.com/post/48086273167</link><guid>http://kellishaver.tumblr.com/post/48086273167</guid><pubDate>Mon, 15 Apr 2013 21:27:25 -0400</pubDate></item><item><title>Reorganization</title><description>&lt;a href="http://trentwalton.com/2013/04/10/reorganization/"&gt;Reorganization&lt;/a&gt;: &lt;p&gt;Rethinking team organization for responsive design.&lt;/p&gt;
&lt;p&gt;This article from Trent Walton ties in well to the podcast I’ll be linking to tomorrow, where in &lt;a href="http://nitch.cc" title="Nitch"&gt;we&lt;/a&gt; celebrate the first birthday of our podcast by discussing the ins and outs of managing responsive design projects with &lt;a href="http://ethanmarcotte.com" title="Ethan Marcotte" target="_blank"&gt;Ethan Marcotte&lt;/a&gt;.&lt;/p&gt;</description><link>http://kellishaver.tumblr.com/post/47740991776</link><guid>http://kellishaver.tumblr.com/post/47740991776</guid><pubDate>Thu, 11 Apr 2013 20:24:38 -0400</pubDate><category>dev</category><category>design</category><category>workflow</category><category>work</category><category>nitch</category></item><item><title>Random Test Files Generator</title><description>&lt;a href="http://orng.us/dmo7sk"&gt;Random Test Files Generator&lt;/a&gt;: &lt;p&gt;(or how to kill an EC2 micro instance with 8 lines of Bash)&lt;/p&gt;</description><link>http://kellishaver.tumblr.com/post/46560428574</link><guid>http://kellishaver.tumblr.com/post/46560428574</guid><pubDate>Thu, 28 Mar 2013 22:47:07 -0400</pubDate><category>bash</category><category>random</category><category>test</category><category>dev</category><category>work</category></item><item><title>The Game Cabinet: Seasons</title><description>&lt;a href="http://gamecabinet.tumblr.com/post/44917322781/seasons"&gt;The Game Cabinet: Seasons&lt;/a&gt;: &lt;p&gt;&lt;a class="tumblr_blog" href="http://gamecabinet.tumblr.com/post/44917322781/seasons"&gt;gamecabinet&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;img alt="image" src="http://media.tumblr.com/41cac85f2e268cbe4cc9e70a5d986afd/tumblr_inline_mjdmw0CWZG1qz4rgp.jpg"/&gt;&lt;/p&gt;
&lt;p&gt;This is a newest addition to my game collection; one I’ve only had for a couple of weeks. I have to say, I like it a&lt;em&gt; lot&lt;/em&gt;. Some of that is probably new game excitement, but Seasons has a lot of good things going for it.&lt;/p&gt;
&lt;p&gt;The theme of the game is simple: You’re a wizard competing in a…&lt;/p&gt;
&lt;/blockquote&gt;</description><link>http://kellishaver.tumblr.com/post/44918221702</link><guid>http://kellishaver.tumblr.com/post/44918221702</guid><pubDate>Sat, 09 Mar 2013 00:21:06 -0500</pubDate></item><item><title>Say hello to CSS Simple</title><description>&lt;p&gt;Last night, I started building &lt;a href="https://github.com/kellishaver/CSS-Simple" title="CSS Simple"&gt;CSS Simple&lt;/a&gt; - a lightweight CSS library for building clean interfaces. &lt;/p&gt;
&lt;p&gt;To be quite blunt, I was getting tired of all of the bloat around other CSS frameworks.&lt;/p&gt;
&lt;p&gt;Grid systems feel cumbersome and aren&amp;#8217;t always necessary (and often aren&amp;#8217;t mobile-first). Heavy ties to jQuery adds a bulk and complexity that isn&amp;#8217;t always needed. Reliance on a few COMPASS mix-ins means you need the whole COMPASS framework installed to edit anything.&lt;/p&gt;
&lt;p&gt;There are a lot of good reasons why these things are beneficial and many cases where they are necessary (or at least very helpful), but there are also a lot of times when they&amp;#8217;re just overkill.&lt;/p&gt;
&lt;p&gt;This is where CSS Simple fits in.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve only worked on it for a few hours, so in a lot of ways, it still feels like a library for prototyping. It&amp;#8217;s also Webkit-only at the moment. Those two things may change, or they may not. It depends on how much I have time to work on it and how my needs change over time. We&amp;#8217;ll see.&lt;/p&gt;
&lt;p&gt;Even if it remains a Webkit-only library for UI prototyping, I still think there&amp;#8217;s value in that.&lt;/p&gt;
&lt;p&gt;You can see it in action &lt;a href="http://www.kellishaver.com/misc/css-simple/"&gt;here&lt;/a&gt; and view it on Github &lt;a href="https://github.com/kellishaver/CSS-Simple"&gt;here&lt;/a&gt;.&lt;/p&gt;</description><link>http://kellishaver.tumblr.com/post/44723660673</link><guid>http://kellishaver.tumblr.com/post/44723660673</guid><pubDate>Wed, 06 Mar 2013 15:02:00 -0500</pubDate><category>dev</category><category>css</category><category>css-simple</category><category>frameworks</category><category>work</category><category>open source</category><category>webkit</category><category>ui</category><category>design</category></item><item><title>Browser Scratch Pad One-Liner</title><description>&lt;p&gt;I saw a few of these floating around a while back. The idea is to create a data URL one-liner to turn a browser tab into an editable scratch pad for taking notes, or writing whatever. It&amp;#8217;s kind of handy.&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s my take (Tumblr mangles the URL if I try and link to it):&lt;/p&gt;
&lt;p&gt;data:text/html;charset=utf-8,&amp;lt;title&amp;gt;Text Editor&amp;lt;/title&amp;gt;&amp;lt;link rel=&amp;#8221;shortcut icon&amp;#8221; href=&amp;#8221;http://g.etfv.co/http://www.sublimetext.com&amp;#8221;/&amp;gt;&amp;lt;link href=&amp;#8221;http://fonts.googleapis.com/css?family=Droid+Sans+Mono&amp;#8221; rel=&amp;#8221;stylesheet&amp;#8221; type=&amp;#8221;text/css&amp;#8221;&amp;gt;&amp;lt;body OnLoad=&amp;#8221;document.getElementsByTagName(&amp;#8216;body&amp;#8217;)[0].appendChild(document.createElement(&amp;#8216;p&amp;#8217;).appendChild(document.createTextNode(&amp;#8221;))); document.body.focus();&amp;#8221; contenteditable style=&amp;#8221;font-size:16px;font-family:&amp;#8217;Droid Sans Mono&amp;#8217;, sans-serif;max-width:80%;margin:2em auto;padding:2em;background-color:#222;color:#f3f3c4;line-height:1.5em;-webkit-text-shadow:1px 1px 1px #000&amp;#8221;&amp;gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;</description><link>http://kellishaver.tumblr.com/post/43807732280</link><guid>http://kellishaver.tumblr.com/post/43807732280</guid><pubDate>Sat, 23 Feb 2013 10:52:00 -0500</pubDate><category>random</category><category>snippets</category></item><item><title>RESTify Your API</title><description>&lt;a href="http://vvv.tobiassjosten.net/development/restify-your-api/"&gt;RESTify Your API&lt;/a&gt;: &lt;p&gt;This bugs me, too. Hint: If your API has the words ‘new’, ‘edit’, ‘view’, ‘delete’ or similar in the URL structure, your API is &lt;strong&gt;not&lt;/strong&gt; RESTful.&lt;/p&gt;</description><link>http://kellishaver.tumblr.com/post/42918850025</link><guid>http://kellishaver.tumblr.com/post/42918850025</guid><pubDate>Tue, 12 Feb 2013 06:41:00 -0500</pubDate><category>dev</category><category>api</category><category>rest</category></item><item><title>I ordered a couple of new games for the collection tonight....</title><description>&lt;img src="http://25.media.tumblr.com/390fde7d8fedf3353837e77d4c3af348/tumblr_mhn1koBWoe1rnnanlo2_500.jpg"/&gt;&lt;br/&gt; &lt;br/&gt;&lt;img src="http://25.media.tumblr.com/89ef0160e89ca6ea841abf2531225e47/tumblr_mhn1koBWoe1rnnanlo1_500.jpg"/&gt;&lt;br/&gt; &lt;br/&gt;&lt;p&gt;I ordered a couple of new games for the collection tonight. I’m looking forward to getting these off the UPS truck Wednesday, but I really need a bigger game cabinet.&lt;/p&gt;</description><link>http://kellishaver.tumblr.com/post/42176677721</link><guid>http://kellishaver.tumblr.com/post/42176677721</guid><pubDate>Sun, 03 Feb 2013 04:41:12 -0500</pubDate><category>boardgames</category><category>pics</category></item><item><title>Today I got a new laptop bag. I’ve been wanting one for a...</title><description>&lt;img src="http://25.media.tumblr.com/9fae8f2a5553868b0b715ac9f9c67251/tumblr_mhkzpeaNnx1rnnanlo2_500.jpg"/&gt;&lt;br/&gt; &lt;br/&gt;&lt;img src="http://24.media.tumblr.com/4f55cb544ff91e140f58ff530252624f/tumblr_mhkzpeaNnx1rnnanlo1_500.jpg"/&gt;&lt;br/&gt; &lt;br/&gt;&lt;p&gt;Today I got a new laptop bag. I’ve been wanting one for a while. The Lowepro bag I’ve had for a few years now is nice and has held up really well. It’s just a bit larger than I would like. This small Timbuk2 bag, however, is perfect for the small amount of things that I carry.&lt;/p&gt;</description><link>http://kellishaver.tumblr.com/post/42085539849</link><guid>http://kellishaver.tumblr.com/post/42085539849</guid><pubDate>Sat, 02 Feb 2013 02:05:00 -0500</pubDate><category>gear</category><category>work</category><category>pics</category></item><item><title>Jack's: Let's reconsider our "users"</title><description>&lt;a href="http://jacks.tumblr.com/post/33785796042/lets-reconsider-our-users"&gt;Jack's: Let's reconsider our "users"&lt;/a&gt;: &lt;p&gt;&lt;a class="tumblr_blog" href="http://jacks.tumblr.com/post/33785796042/lets-reconsider-our-users"&gt;jacks&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;us·er &lt;br/&gt;&lt;em&gt;/ˈyo͞ozər/&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Noun&lt;/strong&gt;&lt;br/&gt; 1. A person who uses or operates something, esp. a computer or other machine.&lt;br/&gt; 2. A person who takes illegal drugs; a drug user.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Synonyms&lt;/strong&gt;&lt;br/&gt; consumer&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;During a Square Board meeting, our newest Director Howard Schultz, pulled me aside and asked a simple question.&lt;/p&gt;
&lt;p&gt;“Why…&lt;/p&gt;
&lt;/blockquote&gt;</description><link>http://kellishaver.tumblr.com/post/41319365689</link><guid>http://kellishaver.tumblr.com/post/41319365689</guid><pubDate>Wed, 23 Jan 2013 19:54:21 -0500</pubDate></item><item><title>CORS headers with Devise</title><description>&lt;p&gt;Yesterday I set about to add a small JSON API to an already-built Rails application that uses &lt;a href="https://github.com/plataformatec/devise"&gt;Devise&lt;/a&gt; for its authentication system. This was simple enough to do by enabling token-based authentication and rendering a few &lt;a href="https://github.com/nesquena/rabl"&gt;rabl&lt;/a&gt; templates via &lt;code&gt;respond_to&lt;/code&gt; blocks (well, I say &amp;#8220;was&amp;#8221; but I&amp;#8217;m actually not finished yet - that&amp;#8217;s the gist of it, though, I just have more of them to do).&lt;/p&gt;
&lt;p&gt;However, I did hit a small stumbling block when it came to enabling &lt;a href="http://en.wikipedia.org/wiki/Cross-origin_resource_sharing"&gt;CORS&lt;/a&gt; headers. For those of you not familiar with them, CORS headers are the magic sauce that lets other applications, say, a JavaScript client hosted on a different server, fetch and parse JSON directly from your web server, effectively disabling &lt;a href="http://en.wikipedia.org/wiki/Same_origin_policy"&gt;same-origin policy&lt;/a&gt; restrictions that the browser places on remote JavaScript.&lt;/p&gt;
&lt;p&gt;In order to send these headers in my Rails application, I added a couple of &lt;code&gt;before&lt;/code&gt; filters in my &lt;code&gt;Application&lt;/code&gt; controller; one for the pre-flight (essentially a silent request made by the browser prior to an AJAX call to ensure that it has permissions to make the call) and one for the AJAX call itself.&lt;/p&gt;
&lt;p&gt;This all worked fine and I was able to log in by POSTing to the Devise &lt;code&gt;session&lt;/code&gt; controller, which would then give me my JSON user object, with its included &lt;code&gt;authentication_token&lt;/code&gt; in return.&lt;/p&gt;
&lt;p&gt;However, whenever I would enter an incorrect email/password combination, rather than sending the error object, the server would return a &lt;code&gt;401 Unauthorized&lt;/code&gt; header, without sending the additional CORS headers.&lt;/p&gt;
&lt;p&gt;The reason for this turned out to be that &lt;a href="https://github.com/hassox/warden"&gt;Warden&lt;/a&gt;, the bit of Rack middleware that Devise uses for authentication, was handling the failed request itself, before ever letting it pass through to the rest of the application (for, I assume, security reasons).&lt;/p&gt;
&lt;p&gt;One solution was to use the &lt;a href="https://github.com/cyu/rack-cors"&gt;Rack CORS&lt;/a&gt; gem and inject it into the application before Warden. This would work great, except that I have, on more than one occasion, had issues with this gem and tonight was no exception.&lt;/p&gt;
&lt;p&gt;Fortunately, what I wanted to do was fairly simple. I just wanted to return CORS headers for everything. I&amp;#8217;ll let my authentication system limit access, not my HTTP headers. That meant that those headers didn&amp;#8217;t need to be very restrictive or dynamic.&lt;/p&gt;
&lt;p&gt;So I wrote a small piece of middlware of my own:&lt;/p&gt;
&lt;pre&gt;
# lib/cors.rb
class Cors
  def initialize(app)
    @app = app
  end

  def call(env)
    status, headers, response = @app.call(env)

    headers['Access-Control-Allow-Origin'] = '*'
    headers['Access-Control-Allow-Methods'] = 'DELETE, GET, HEAD, OPTIONS, POST, PUT'
    headers['Access-Control-Max-Age'] = "1728000"

    [status, headers, response]
  end
end
&lt;/pre&gt;
&lt;p&gt;Next, it was simply a matter of using it, and inserting it where it needed to be, via my &lt;code&gt;app/config/application.rb&lt;/code&gt; file.
&lt;/p&gt;
&lt;pre&gt;
module MyApp
  class Application
    # ....

    config.middleware.use "Cors"
    config.middleware.insert_before Warden::Manager, "Cors"
  end
end
&lt;/pre&gt;
&lt;p&gt;Now response headers sent by Warden will be injected with the CORS headers created by our little custom bit of middleware, and thus failed login attempts will now return a proper 401 authentication error, rather than hanging as a cancelled request due to a failed pre-flight check.&lt;/p&gt;
&lt;p&gt;If you need a more robust solution, it&amp;#8217;s probably worth checking into Rack CORS, but this could also easily be extended by loading YAML config files containing lists of allowed origins or allowed resource URLs and returning headers conditionally.&lt;/p&gt;</description><link>http://kellishaver.tumblr.com/post/40758797489</link><guid>http://kellishaver.tumblr.com/post/40758797489</guid><pubDate>Thu, 17 Jan 2013 07:56:00 -0500</pubDate><category>ruby</category><category>rails</category><category>cors</category><category>ajax</category><category>devise</category><category>dev</category><category>work</category></item><item><title>After Aaron Swartz: The Tech World Must Talk About Depression</title><description>&lt;a href="http://mashable.com/2013/01/15/aaron-swartz-tech-world-depression/"&gt;After Aaron Swartz: The Tech World Must Talk About Depression&lt;/a&gt;: &lt;p&gt;I have some thoughts on this, myself. I’m just too busy to write them all down. It’s something I’ve been meaning to write about for a while. &lt;/p&gt;</description><link>http://kellishaver.tumblr.com/post/40753445560</link><guid>http://kellishaver.tumblr.com/post/40753445560</guid><pubDate>Thu, 17 Jan 2013 04:22:00 -0500</pubDate></item><item><title>API First</title><description>&lt;a href="http://api-first.com/"&gt;API First&lt;/a&gt;: &lt;p&gt;Design and development for a multi-platform world.&lt;/p&gt;</description><link>http://kellishaver.tumblr.com/post/39823884755</link><guid>http://kellishaver.tumblr.com/post/39823884755</guid><pubDate>Sun, 06 Jan 2013 03:33:11 -0500</pubDate><category>API</category><category>accessibility</category><category>mobile</category><category>dev</category></item><item><title>January Home Screen</title><description>&lt;img src="http://24.media.tumblr.com/cf348b95478af2e6e1f5732682152a3a/tumblr_mg4sdiUd1L1rnnanlo1_r2_500.png"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;January Home Screen&lt;/p&gt;</description><link>http://kellishaver.tumblr.com/post/39708219563</link><guid>http://kellishaver.tumblr.com/post/39708219563</guid><pubDate>Fri, 04 Jan 2013 21:32:00 -0500</pubDate><category>pics</category><category>nexus 7</category></item><item><title>10 Things I Learned in 2012</title><description>&lt;p&gt;2012 has been a busy year for me. Looking back on it, I realized I&amp;#8217;ve learned quite a few things over the past 12 months, so I thought I&amp;#8217;d take a moment and compile a list. Some of the things listed below are technologies I had dabbled in prior to this year, but never took the time to learn properly or use on a real project until now.&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;&lt;a href="http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html"&gt;&lt;strong&gt;Bash Scripting&lt;/strong&gt;&lt;/a&gt; - Writing Bash scripts always felt a little alien to me, but my new-found and constant drive toward Automating All The Things forced me to devote a little more time to learning it during the early half of the year. I still wouldn&amp;#8217;t call myself a pro, but I have enough useful knowledge of Bash now to get done what I need to do.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://getbookstrap.com"&gt;&lt;strong&gt;Bootstrap&lt;/strong&gt;&lt;/a&gt; - Bootstrap came out well before 2012, but after a cursory glance at it after its initial release, I sort of dismissed it as something I didn&amp;#8217;t really need and would never use. I still have mixed feelings about Bootstrap, but the newer versions continue to see great improvement and, after having used it on a few projects now, there are definitely cases where it saves real time and developer effort. I still don&amp;#8217;t think it&amp;#8217;s the right fit for every project, but then, what is?&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.opscode.com/chef/"&gt;&lt;strong&gt;Chef&lt;/strong&gt;&lt;/a&gt; - Again with the automation kick, I decided a couple of months ago that it was time to look into something a little more robust than post-receive Git hooks for project deployment.&lt;/li&gt;
&lt;li&gt;&lt;a href="http:knockoutjs.com"&gt;&lt;strong&gt;Knockout JS&lt;/strong&gt;&lt;/a&gt; - This is the newest item to be added to my list. I really only started working with Knockout JS about a week ago, but I found it very easy to pick up and I&amp;#8217;ve really been enjoying it.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://lua.org"&gt;&lt;strong&gt;Lua&lt;/strong&gt;&lt;/a&gt; - This was purely a &amp;#8220;for fun&amp;#8221; exercise. I&amp;#8217;d seen some Lua script and liked the look of it, so I decided I wanted to learn enough of it to know when it would be a good fit, when it wouldn&amp;#8217;t, and how to incorporate it into my workflow. If memory serves, this all came about after some playing around with &lt;a href="http://webscript.io"&gt;Webscript.io&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.padrinorb.com/"&gt;&lt;strong&gt;Padrino&lt;/strong&gt;&lt;/a&gt; - This lightweight, &lt;a href="http://sinatrarb.com"&gt;Sinatra-&lt;/a&gt;based Ruby framework is a scaled down alternative to the larger and more complex Ruby on Rails. If you like Sinatra but miss some of the conveniences Rails gives you, then Padrino is a good (though still fairly new) option to explore.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://phonegap.com/"&gt;&lt;strong&gt;PhoneGap (Cordova)&lt;/strong&gt;&lt;/a&gt; - This was on my &amp;#8220;I really need to learn this&amp;#8221; list for a couple of years now. As it turns out, there&amp;#8217;s very little actual learning to do. It helps that the API documentation has gotten a makeover in a big way and is now pretty excellent. The library makes using device APIs ridiculously easy. Most of the learning curve comes from sorting out how to properly build apps for non-iOS devices. The code is largely the same, the build process often more involved and tedious. That&amp;#8217;s not a fault of PhoneGap, it&amp;#8217;s just how the SDKs for the various other platforms (Android, Windows Phone, etc.) work.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://python.org"&gt;&lt;strong&gt;Python&lt;/strong&gt;&lt;/a&gt; - I haven&amp;#8217;t mastered Python this past year, but I have put it to more use, mostly in the form of shell scripts, rather than web applications. I have no interest in becoming a dedicated Python developer (nothing against it, it&amp;#8217;s a beautiful language, but I like where I&amp;#8217;m at now), but I wanted to be comfortable around Python code. So that&amp;#8217;s where I am now.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://redis.io/"&gt;&lt;strong&gt;Redis&lt;/strong&gt;&lt;/a&gt; - Until Redis, the only other NoSQL database I&amp;#8217;d really used was MongoDB, but earlier this year when I needed a key/value store for a small web app, Redis was my database of choice. It was fast, easy to use, well documented, and the Redis Ruby gem made integrating it into my project super easy.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://vagrantup.com"&gt;&lt;strong&gt;Vagrant&lt;/strong&gt;&lt;/a&gt; - The upgrade to Mountain Lion hosed my local PHP install, which I unfortunately still sometimes need. After an hour of trying to fix it and another hour of digging through posts on StackOverflow which lead me to solutions I&amp;#8217;d already tried unsuccessfully, I gave up and decided I would just build a virtual machine image for those rare instances where I needed PHP. Then I was reminded of Vagrant and the rest is history. I use it all the time now to create custom, encapsulated development environments for my projects. It&amp;#8217;s great.&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;So there you have it, some of the new things I picked up in 2012. A few items on this list are a little embarrassing, because I feel like they maybe should have belonged on the 2007 list, but there are so many things out there, it&amp;#8217;s just impossible to keep up with it all.&lt;/p&gt;</description><link>http://kellishaver.tumblr.com/post/39112586661</link><guid>http://kellishaver.tumblr.com/post/39112586661</guid><pubDate>Sat, 29 Dec 2012 02:34:00 -0500</pubDate><category>bash</category><category>bootstrap</category><category>chef</category><category>knockoutjs</category><category>lua</category><category>padrino</category><category>sinatra</category><category>phonega</category><category>python</category><category>redis</category><category>vagrant</category><category>work</category><category>dev</category><category>javascript</category><category>ruby</category><category>automation</category></item><item><title>(click to embiggen)
I whipped this up tonight to explain the...</title><description>&lt;img src="http://25.media.tumblr.com/7a3f6e36234aad3616ad4a0e81d0612b/tumblr_mfqjqrh8i91rnnanlo1_r1_500.png"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;(click to embiggen)&lt;/p&gt;
&lt;p&gt;I whipped this up tonight to explain the process to a client. The PhoneGap application is being built with Knockout JS + Zepto, communicating with a Ruby on Rails application on the remote end via a JSON REST API.&lt;/p&gt;</description><link>http://kellishaver.tumblr.com/post/39030176400</link><guid>http://kellishaver.tumblr.com/post/39030176400</guid><pubDate>Fri, 28 Dec 2012 04:59:00 -0500</pubDate><category>phonegap</category><category>rails</category><category>javascript</category><category>zepti</category><category>knockoutjs</category><category>mvc</category><category>mvvm</category><category>mobile</category><category>pics</category></item><item><title>Low contrast in Mountain Lion after reboot</title><description>&lt;p&gt;Since upgrading to Mountain Lion I&amp;#8217;ve noticed that occasionally, after rebooting, the display will appear very washed out and light greys are virtually impossible to detect.&lt;/p&gt;
&lt;p&gt;At first, I chalked this up to my bad eyesight, but it turns out it&amp;#8217;s actually a legitimate issue.&lt;/p&gt;
&lt;p&gt;Sometimes the contrast sensitivity in the Accessibility preferences pane has a mind of its own and changes itself to a different value.&lt;/p&gt;
&lt;p&gt;Just slide it back to the left to fix the problem.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://s3.amazonaws.com/orngus/1355979119-Screen%20Shot%202012-12-19%20at%2011.57.41%20PM.png"/&gt;&lt;/p&gt;</description><link>http://kellishaver.tumblr.com/post/38363330765</link><guid>http://kellishaver.tumblr.com/post/38363330765</guid><pubDate>Wed, 19 Dec 2012 23:59:30 -0500</pubDate><category>Apple</category><category>OSX</category><category>Mounta</category></item><item><title>Startup Idea</title><description>&lt;p&gt;I want to be able to subscribe to breakfast. Who&amp;#8217;s awake enough in the morning to make breakfast? Why would I want to wake up and cook food when I could sleep longer by not waking up and cooking food? And if I&amp;#8217;m not awake enough to even cook it, why would I ever want to put forth the extra effort to travel somewhere to get it?&lt;br/&gt;&lt;br/&gt;I hate mornings.&lt;br/&gt;&lt;br/&gt;I want a subscription to Amazon Donut&amp;#8230;.. maybe it comes with free coffee if you have a Prime membership.&lt;/p&gt;</description><link>http://kellishaver.tumblr.com/post/38218332873</link><guid>http://kellishaver.tumblr.com/post/38218332873</guid><pubDate>Tue, 18 Dec 2012 05:07:27 -0500</pubDate><category>random</category></item><item><title>No More PHP</title><description>&lt;p&gt;I&amp;#8217;ve decided to stop taking new PHP projects. I still have a few that I will maintain and some friends with PHP projects that I work on from time to time. That won&amp;#8217;t change. When it comes to new projects, though, I&amp;#8217;m moving on.&lt;/p&gt;
&lt;p&gt;I don&amp;#8217;t think PHP is the horrible language many people make it out to be. I think it certainly has its flaws, yes, but I also think it&amp;#8217;s quite possible to write quality, well-engineered code using PHP.&lt;/p&gt;
&lt;p&gt;I think a lot of PHP&amp;#8217;s bad reputation comes from the vast amounts of bad PHP code out there. It lets you get away with a lot. When it comes to maintaining code quality, that&amp;#8217;s a bad thing. When it comes to just getting things done, it&amp;#8217;s maybe not. There&amp;#8217;s an argument to be made either way. What worries me more is the number of experienced PHP developers who still recommend bad practices. It&amp;#8217;s not just limited to the web, either. There are a lot of bad books out there, as well. The amount of bad information floating around in the PHP community is depressing.&lt;/p&gt;
&lt;p&gt;This is, I think, where we see the distinction between someone who has learned PHP (and really, you could substitute in any one programming language there) and someone who has learned how to program.&lt;/p&gt;
&lt;p&gt;As for my personal reasons for moving away from PHP, while the community was not a deciding factor, yes, I will be glad to get away from it. Overall, though, the language bores me. It&amp;#8217;s really verbose and cluttered compared to more the elegant syntax of Ruby. I don&amp;#8217;t think it&amp;#8217;s bad, per say, it just makes using PHP feel really tedious and slow by comparison. I don&amp;#8217;t enjoy it, so I choose not to use it. It&amp;#8217;s that simple, really.&lt;/p&gt;</description><link>http://kellishaver.tumblr.com/post/36945747656</link><guid>http://kellishaver.tumblr.com/post/36945747656</guid><pubDate>Sat, 01 Dec 2012 06:50:00 -0500</pubDate><category>dev</category><category>work</category><category>php</category></item></channel></rss>
