<?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>Ruby developer for Heroku. Climbs rocks in Austin &amp; teaches Rails classes at the University of Texas</description><title>Schneems</title><generator>Tumblr (3.0; @schneems)</generator><link>http://schneems.com/</link><item><title> Testing Against Multiple Rails Versions</title><description>&lt;p&gt;Upgrading major versions of Rails sucks. I was there from 0.9 to 1.0, all the way to the famed 2 to 3 release, and they were all painful. I have good news though: Rails 4 is right around the corner, and it&amp;#8217;s &lt;a href="http://railscasts.com/episodes/415-upgrading-to-rails-4"&gt;a much cleaner upgrade&lt;/a&gt;. While you are getting your app ready for Rails 4 are you bringing the gems you&amp;#8217;ve written up to speed? If the answer is &amp;#8220;I don&amp;#8217;t know&amp;#8221;, keep reading - we will cover how to test the gems you&amp;#8217;ve written against multiple versions of Rails including Rails 4 release candidate.&lt;/p&gt;

&lt;h2&gt;Multiple Versions Matter&lt;/h2&gt;

&lt;p&gt;Believe it or not, there are still a large number of people who are using Rails 2 in production today. While the path to upgrading to Rails 3 is well documented (there&amp;#8217;s a &lt;a href="http://www.railsupgradehandbook.com/"&gt;whole book on it&lt;/a&gt;) often the biggest blocker isn&amp;#8217;t the app, or even the Rails frameworks. The largest hurdle to upgrading is often an un-maintained third party library that can&amp;#8217;t be replaced or re-written and doesn&amp;#8217;t work in the latest versions. There are many reasons to quit maintaining a library, but &amp;#8220;I didn&amp;#8217;t know how to upgrade it to support the latest rails release&amp;#8221; shouldn&amp;#8217;t be one of them.&lt;/p&gt;

&lt;h2&gt;Testing your App&lt;/h2&gt;

&lt;p&gt;Step zero is writing tests for your gem if you don&amp;#8217;t already have them, once you&amp;#8217;re done with that: make sure you&amp;#8217;ve got a CI server running, I prefer &lt;a href="https://travis-ci.org/"&gt;Travis CI&lt;/a&gt; which is free for open source repos. Once you&amp;#8217;ve got your CI build green, you&amp;#8217;ll need to re-work your Gemfile so you can install multiple versions of Rails and then set up Travis to run your tests multiple times, each with a different version of Rails.&lt;/p&gt;

&lt;h2&gt;Make Ready your Gemfile&lt;/h2&gt;

&lt;p&gt;If you you haven&amp;#8217;t already, delete your &lt;code&gt;Gemfile.lock&lt;/code&gt; and remove it from git:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git rm Gemfile.lock
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Then ignore the file by adding it to your &lt;code&gt;.gitignore&lt;/code&gt;. On a stable app - Gemfile.lock stores the exact version of libraries that are used such as Rails 3.2.13. This is good for normal use, but we need our gem to be able to be &lt;code&gt;bundle install&lt;/code&gt;-ed against any version of Rails. Removing the &lt;code&gt;Gemfile.lock&lt;/code&gt; allows us to do that.&lt;/p&gt;

&lt;p&gt;The next thing we will need to do is to enable your app to load multiple Rails versions from the environment open up your libraries&amp;#8217; &lt;code&gt;Gemfile&lt;/code&gt; remove where you&amp;#8217;re specifying Rails or railties version:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;gem 'rails' '&amp;gt;= 3.1.0'
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If it&amp;#8217;s in the gemspec, you don&amp;#8217;t need to do anything, now add this code&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;rails_version = ENV["RAILS_VERSION"] || "default"

rails = case rails_version
when "master"
  {github: "rails/rails"}
when "default"
  "&amp;gt;= 3.1.0"
else
  "~&amp;gt; #{rails_version}"
end

gem "rails", rails
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Make sure to replace the numeric value in the &lt;code&gt;"default"&lt;/code&gt; case with whatever you had specified previously.&lt;/p&gt;

&lt;p&gt;Now you can bundle different versions of Rails like so&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ RAILS_VERSION=3.1.0 bundle update
$ RAILS_VERSION=3.1.0 bundle exec rake test
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;or if you want a one liner:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ export RAILS_VERSION=3.1.0; bundle update; bundle exec rake test
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This will install Rails version &lt;code&gt;~&amp;gt; 3.1.0&lt;/code&gt; and run tests against it. To run tests against Rails master you can use &lt;code&gt;RAILS_VERSION=master&lt;/code&gt; and to run against the betas or release candidates you can run &lt;code&gt;RAILS_VERSION=4.0.0.pre&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Now you can run tests on your app using different versions of Rails. You can see an example of this style of Gemfile in my projects &lt;a href="https://github.com/opro/opro/blob/master/Gemfile"&gt;oPRO&lt;/a&gt;  and &lt;a href="https://github.com/schneems/wicked/blob/master/Gemfile"&gt;Wicked&lt;/a&gt;. The next step is to configure Travis to automatically do this for you.&lt;/p&gt;

&lt;h2&gt;Running Multiple Rails Versions on Travis&lt;/h2&gt;

&lt;p&gt;In your project create a &lt;code&gt;.travis.yml&lt;/code&gt; file if you haven&amp;#8217;t already. You can add environment variables to your travis run matrix by adding them to this file:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;env:
  - "RAILS_VERSION=3.1.0"
  - "RAILS_VERSION=3.2.0"
  - "RAILS_VERSION=4.0.0.pre"
  - "RAILS_VERSION=master"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This will make travis run your project 4x more times each with a different environment specified. While we&amp;#8217;re testing against different versions of Rails, let&amp;#8217;s make sure we&amp;#8217;re testing against different versions of Rubies too. This will test MRI 1.9.3, 2.0.0, and master as well as JRuby in 1.9 mode:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;rvm:
  - 1.9.3
  - 2.0.0
  - ruby-head
  - jruby-19mode
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Any time you&amp;#8217;re testing the head or master of a project such as &lt;code&gt;ruby-head&lt;/code&gt; you may see failres because the branch is unstable and not due to your project. For these cases you may want to allow failures until official versions are released.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;matrix:
  allow_failures:
    - env: "RAILS_VERSION=master"
    - rvm: ruby-head
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This will still run tests against the most recent version of Ruby and against Rails master, but if they fail Travis will not flag the build as failed. If you want to fine tune your allowed failures you can add them together like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;matrix:
  allow_failures:
    - env: "RAILS_VERSION=3.0.0"
      rvm: 2.0.0
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This will allow failures against Rails version 3.0.0 only when using Ruby 2.0.0. You can see the &lt;code&gt;.travis.yml&lt;/code&gt; files for &lt;a href="https://github.com/opro/opro/blob/master/.travis.yml"&gt;oPRO&lt;/a&gt; and &lt;a href="https://github.com/schneems/wicked/blob/master/.travis.yml"&gt;wicked&lt;/a&gt; for full examples.&lt;/p&gt;

&lt;h2&gt;Test with Pull Requests&lt;/h2&gt;

&lt;p&gt;Once you&amp;#8217;ve got your &lt;code&gt;.travis.yml&lt;/code&gt; and &lt;code&gt;Gemfile&lt;/code&gt; set up. Commit your results to a branch and push to github:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git checkout -b test-rails-4
$ git add .
$ git commit -m "testing rails 4"
$ git push origin test-rails-4
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now go to your repo on Github and open up a pull request like this &lt;a href="https://github.com/schneems/wicked/pull/64"&gt;PR on wicked&lt;/a&gt;. If you have PR testing turned on with Travis, this will &lt;a href="https://travis-ci.org/schneems/wicked/builds/7241486"&gt;kick off a build&lt;/a&gt;. If you&amp;#8217;re lucky all of your required tests will pass and it will look like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://travis-ci.org/schneems/wicked/builds/7241460"&gt;&lt;img src="http://cl.ly/image/0k3p0h1p2l1D/content.png" alt=""/&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can see the &lt;a href="https://travis-ci.org/schneems/wicked/builds/7241460"&gt;Travis build for Wicked here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If your tests don&amp;#8217;t all pass, not to worry: look at the output, reproduce locally, fix, push, and repeat. Sometimes you might not be able to get one version of your library to support all the versions of Rails/Ruby that you need, when that happens you&amp;#8217;ve got diverging stable versions.&lt;/p&gt;

&lt;h2&gt;Diverging Stable Versions&lt;/h2&gt;

&lt;p&gt;Rails no longer supports version 2.0, but maintains version 3.2+ and 4.0.0.RC1+. Most of your users won&amp;#8217;t immediately upgrade to the latest version, and while you&amp;#8217;re waiting for them to do so, you may find security or other bugs in a version of your library. For this reason I encourage you to consider supporting at least two versions of Rails. There are a few different strategies you can take in order to accomplish this goal:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do nothing&lt;/strong&gt;: If you&amp;#8217;re lucky your gem will work unmodified in all versions of Rails, and you&amp;#8217;re good to go. Make sure you&amp;#8217;re tested, and don&amp;#8217;t introduce backwards incompatable changes later down the road.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Branch&lt;/strong&gt;: Rails uses versions and branches to manage it&amp;#8217;s codebase and you can too. If your gem needs a major overhaul to be compliant with the latest release you may want to branch out your codebase. One branch for Rails 3 and you can likely leave Rails 4 on master.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git checkout -b rails3
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You&amp;#8217;ll want to have clearly defined versions for your which version of rails your gem supports. You may want to break &lt;a href="http://semver.org/"&gt;semver&lt;/a&gt; for a single gem push and shadow Rails versioning. So the Rails3 compatible code can be found in version 3.X and the Rails4 compatible code can be found in 4.X of your gem. Once you do this, release as normal using semver, just avoid rev-ing the major version if you don&amp;#8217;t have to.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Separate Gems&lt;/strong&gt;: If keeping different copies of code in different branches seems too hard, break out your gems into multiple libraries. If your library is named &lt;code&gt;foo&lt;/code&gt; consider forking it and making a &lt;code&gt;foo_rails4&lt;/code&gt; gem. While easier on you, it makes it harder for your users to upgrade since they&amp;#8217;ll have to know you released a separate gem.&lt;/p&gt;

&lt;h2&gt;Testing Other Software Versions&lt;/h2&gt;

&lt;p&gt;You may find that your library depends on other libraries for development or production that have their own dependencies on Rails. One popular library is &lt;a href="https://github.com/plataformatec/devise"&gt;Devise&lt;/a&gt;. You can see how we conditionally change the version of Devise based on our Rails version in &lt;a href="https://github.com/opro/opro/blob/master/Gemfile"&gt;oPRO&amp;#8217;s Gemfile&lt;/a&gt;, I got this little trick from Steve&amp;#8217;s work on &lt;a href="https://github.com/drapergem/draper/blob/master/Gemfile"&gt;Draper&amp;#8217;s Gemfile&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;JRuby Note&lt;/h2&gt;

&lt;p&gt;While upgrading to Rails 4 I found that a JRuby Gem doesn&amp;#8217;t play nice. If you&amp;#8217;re testing JRuby and using the JRuby Sqlite3 adapter for ActiveRecord you may need to specify this in your gemfile:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;  gem "activerecord-jdbcsqlite3-adapter", '&amp;gt;= 1.3.0.beta', :platform =&amp;gt; :jruby
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If you&amp;#8217;re not testing JRuby in your Travis matrix, why aren&amp;#8217;t you? You can always set it as an allowed failure and then at least people who want to know if your lib works with JRuby can check the Travis builds.&lt;/p&gt;

&lt;h2&gt;The Importance of Release Candidates&lt;/h2&gt;

&lt;p&gt;Now that you know how to write tests for your libraries to run on multiple versions of Rails, you have no excuse for not having them fully tested and compatible when Rails4 is fully released. It&amp;#8217;s important to test against the Release Candidates (RC&amp;#8217;s) because these are what will eventually become the fully released version of Rails. If you wait till Rails4 is released and find a bug in the framework, it may be too late to fix. When I was testing Wicked, I &lt;a href="https://github.com/rails/rails/pull/10654"&gt;found and fixed a regression from 3.2.13 to 4.0.0.RC1&lt;/a&gt;. Even better, you&amp;#8217;ll know if your library works with Rails4 or not, and so will your users.&lt;/p&gt;

&lt;p&gt;If are a connoisseur of Hacker News, you may remember a set of inflammatory comments towards the Rails release team over a number of regressions introduced in a minor version bump of the library. The thing is: there was a release candidate for that minor version and for all of the people who wailed and gnashed their teeth at the regressions, few if any bothered to test against the release candidate. Next time your app gets caught by a regression, ask why you didn&amp;#8217;t catch it before that version was released. You could be part of the solution.&lt;/p&gt;

&lt;h2&gt;Test Today&lt;/h2&gt;

&lt;p&gt;With &lt;a href="http://gembundler.com/"&gt;bundler&lt;/a&gt; and &lt;a href="https://travis-ci.org/"&gt;Travis CI&lt;/a&gt; testing against multiple versions of Rails couldn&amp;#8217;t be easier. Don&amp;#8217;t be the maintainer of that &lt;strong&gt;one Gem&lt;/strong&gt; that isn&amp;#8217;t compatible with the Rails4 release. Test your gems against all the Rails versions today.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;update&lt;/strong&gt;: &lt;a href="http://twitter.com/shime_rb"&gt;@shime_rb&lt;/a&gt; pointed out there is a gem called &lt;a href="https://github.com/thoughtbot/appraisal#readme"&gt;Appraisal&lt;/a&gt; to help if you don&amp;#8217;t want to manage your Gemfile manually. You can see an example &lt;a href="https://github.com/thoughtbot/clearance/blob/master/.travis.yml"&gt;travis.yml with appraisal&lt;/a&gt;. Travis also supports &lt;a href="http://about.travis-ci.org/docs/user/build-configuration/#The-Build-Matrix"&gt;specifying multiple gemfiles&lt;/a&gt; which is how &lt;a href="https://github.com/plataformatec/devise/tree/master/gemfiles"&gt;devise tests against multiple versions of rails&lt;/a&gt; .&lt;/p&gt;

&lt;hr&gt;&lt;p&gt;Richard Schneeman works for Heroku and is married to &lt;a href="http://twitter.com/rubyku"&gt;Ruby&lt;/a&gt;, literally. He wrote the &lt;a href="http://www.codetriage.com/"&gt;easiest way to get started helping in open source: Code Triage&lt;/a&gt;. Follow him on twitter &lt;a href="http://twitter.com/schneems"&gt;@schneems&lt;/a&gt;.&lt;/p&gt;</description><link>http://schneems.com/post/50991826838</link><guid>http://schneems.com/post/50991826838</guid><pubDate>Tue, 21 May 2013 11:03:00 -0400</pubDate></item><item><title>Hi Richard. I love your videos; thanks so much (times a million!). I have a bit of a bigger question to ask. I'm just about to be a junior in college. I'm not studying anything technical. I've fallen in love with programming over the last month and a half. Previously, I just wanted to go into consulting: prestigious and great opportunities ahead. I enjoy that subject matter quite a bit. How can I decide if a career in software is for me? What is the career path/stability/future job titles/etc.?</title><description>&lt;p&gt;Happy you’re enjoying them :)&lt;/p&gt;

&lt;p&gt;As you may know i’m not a programmer by degree, I have a mechanical engineering BS from georgia tech. You don’t need a degree to get a job, but it is harder to get your first job without one. Not because people care about credentials, just that companies really stink at hiring programmers and may ask you a bunch of horribly lame CS questions in the interview that don’t have anything to do with modern web development.&lt;/p&gt;

&lt;p&gt;I spent ~3 years programming Ruby/Rails in college and through my first job before I got my first Rails gig. While everyone is hiring now, it is difficult to find a position looking for junior or new devs. Then if they don’t have the right mentoring programs and experience in place, you may hate working there. For my first job in rails: Gowalla, i got around any interview questions by demoing a fully functioning site (now offline) that did some cool stuf. Then I showed them the repo, and we talked about some of the code. I also gave them ~8+ hours of me giving Rails tutorials…so that helped :)&lt;/p&gt;

&lt;p&gt;For consulting: i’ve never done it but I have friends that have. Get involved at a local meetup group. See if you can find other consultants and ask how they got into it. Many that I know share work with one another. I.e. they never turn down a job (lest a door shut) but they might farm off the work to another developer. Look around for a consultant who might be willing to give you a hours of their work a week for a low hourly rate in exchange for pairing/mentoring sessions. 1-on-1 instruction is the fastest way to level up your skills. Go talk to a consultancy agency, they may have a program like this in place already.&lt;/p&gt;

&lt;p&gt;If you’re into programming for the money, i say don’t. It’s a lot of time and effort and energy and if you’re not in love with it you will get burned out after a few years making the $$$ even out in the end. Go for it if only you enjoy building, creating, and maintaining meaningful projects. I never meant to learn to program, it just happened that I needed programming to build the things I wanted. The best way to see if this applies to you is to program more and then do the shower test. When you’re taking a shower before your day and getting excited about what you’re going to do, does thinking about programming get you more or less excited.&lt;/p&gt;

&lt;p&gt;For career: consultants make tons of money (think 2x what a salary dev makes) but their work is not stable. Typically when a company hires a consultancy it is to do something that no-one at their company wants to do, so you might not be doing the most rewarding work in the world. Salary developers have more ownership and control of what they work on, but there can be little to no variation in the type of projects depending on the size/focus/scope of the company.&lt;/p&gt;

&lt;p&gt;For promotions: consultants just raise their rates as they get better. The range I know of right now is anywhere from $80-200 per hour depending on skills and knowledge. Keep in mind they might work 5-80 hours a week depending on how busy they are. Salary workers: you will typically need to ask for a raise like any other job. Titles are typically meaningless. You can be a “senior” engineer at most companies fairly quickly. Other companies have a “flat” architecture and the only difference between engineers is salary. After being a programmer you can go into project management for programmers. While the pay is good here keep in mind a good PM does everything a programmer doesn’t want to: think email…lots of email. If salary isn’t your thing, you can always ask for more vacation, or for extra company time spent working on open source work, or whatever. Most long term programmers make good money, but care more about building and shipping good products than titles and cash.&lt;/p&gt;

&lt;p&gt;Ok, so this got a little long. Hope that helps. Try to make community contacts to help with some of these questions, even if you don’t go into consulting…being well networked can only be a good thing. When in doubt go to a Rails meetup. Good question by the way.&lt;/p&gt;</description><link>http://schneems.com/post/50766559561</link><guid>http://schneems.com/post/50766559561</guid><pubDate>Sat, 18 May 2013 19:16:52 -0400</pubDate></item><item><title>You have the best lesson on Rails hands down. Coming from enterprise Java development..I felt that there was so much magic in Rails that other videos tend to skip over. Your through explanations and the Reddit on Rails project really helped to explain many of the details I was really confused about. Thank you!</title><description>&lt;p&gt;Glad you enjoyed the lessons :)&lt;/p&gt;</description><link>http://schneems.com/post/50424507321</link><guid>http://schneems.com/post/50424507321</guid><pubDate>Tue, 14 May 2013 11:47:42 -0400</pubDate></item><item><title>Hello Richard, I was curious after you worked at Gowalla and used PostgreSQL and now work at Heroku which has MongoDB as an option for users. If you were going to do an app that has data like places as well as user data like posts, checkins which would you use today? Thanks for your response.</title><description>&lt;p&gt;Heroku just announced support for postGIS &lt;a href="https://devcenter.heroku.com/articles/postgis"&gt;https://devcenter.heroku.com/articles/postgis&lt;/a&gt; which helps give you geo location features in your DB. I’ve never used Mongo, so I can’t compare the two. I love postgres though :)&lt;/p&gt;</description><link>http://schneems.com/post/49699098432</link><guid>http://schneems.com/post/49699098432</guid><pubDate>Sun, 05 May 2013 13:19:58 -0400</pubDate></item><item><title>Hey man, I just wanted to say thank you for putting the UT rails course online. Seriously. I've tried a couple of different courses, and this is the first one that explains everything clearly and teaches in a way I *understand* and actually *learn* from. So yea, anyways, thank you x1000. If for some reason I ever run into you in the real world, I owe you a beer or three.</title><description>&lt;p&gt;Happy to help :)&lt;/p&gt;</description><link>http://schneems.com/post/49697988899</link><guid>http://schneems.com/post/49697988899</guid><pubDate>Sun, 05 May 2013 13:05:28 -0400</pubDate></item><item><title>Dear Richard, I stumbled upon your videos after searching for a way to learn RoR online. Unfortunatey, I have no programming experience at all, and I was completely lost in the second video of week 2 (ActiveRecord). I didn't even know where to start to follow along. Is this intended for beginners with no database/programming knowledge? Finally, I noticed you also have a set of videos in beginner-to-builder-2011. Am I supposed to watch those videos before doing the UT Rails 10 wk course? Thanks!</title><description>&lt;p&gt;The course is intended for an audience that has some programming background such as understanding variable assignment and flow control (if/else). If you’re just getting started in any kind of programming i recommend codecademy, either start with Javascript (&lt;a href="http://www.codecademy.com/tracks/javascript"&gt;http://www.codecademy.com/tracks/javascript&lt;/a&gt;) or Ruby (&lt;a href="http://www.codecademy.com/courses/ruby-beginner-en-MxXx5/0/2"&gt;http://www.codecademy.com/courses/ruby-beginner-en-MxXx5/0/2&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;If you get lost in my course i recommend skipping ahead to the exercises, a good amount of the lecture for the first 1-2 weeks is theory that isn’t used until later.&lt;/p&gt;</description><link>http://schneems.com/post/49697780061</link><guid>http://schneems.com/post/49697780061</guid><pubDate>Sun, 05 May 2013 13:02:39 -0400</pubDate></item><item><title>Git Minutes Podcast Interviews Schneems</title><description>&lt;a href="http://episodes.gitminutes.com/2013/04/gitminutes-03-richard-schneeman-on-git.html"&gt;Git Minutes Podcast Interviews Schneems&lt;/a&gt;: &lt;p&gt;Had a delightful time talking to GitMinutes about workflow, Rails issues, and more. Have a listen and tell me what you think.&lt;/p&gt;</description><link>http://schneems.com/post/47545942711</link><guid>http://schneems.com/post/47545942711</guid><pubDate>Tue, 09 Apr 2013 12:28:11 -0400</pubDate></item><item><title>Heroku Engineer Engaged to Ruby</title><description>&lt;p&gt;It was a long day when &lt;a href="http://twitter.com/schneems"&gt;@schneems&lt;/a&gt; typed &lt;code&gt;$ git push heroku master&lt;/code&gt;, opened his website, and exclaimed &lt;strong&gt;&amp;#8220;I love Ruby!&amp;#8221;&lt;/strong&gt;. Then as if inside of &lt;a href="http://en.wikipedia.org/wiki/Pee-wee's_Playhouse"&gt;Pee-wee&amp;#8217;s Playhouse&lt;/a&gt; he heard a voice say: &amp;#8220;If you love Ruby so much why don&amp;#8217;t you marry her?&amp;#8221;. So on December 25th, he got down on one knee with his Grandmother&amp;#8217;s engagement ring and proposed to &lt;a href="http://twitter.com/rubyku"&gt;Ruby Ku&lt;/a&gt;. She said yes!&lt;/p&gt;

&lt;p&gt;&lt;img src="http://cl.ly/image/2I2L1K442R2Y/content.png" alt=""/&gt;&lt;/p&gt;

&lt;p&gt;You might think that to be the end of the story, dear readers, but it&amp;#8217;s just the beginning. Fast forward to March, our young protagonist sits weary on a plane bound for Austin, Tx. He&amp;#8217;s been away nearly a month, and has the jet lag to prove it. As he descended the airport escalator, destined to touch foot in the city he calls home, he heard a strange sound. As he lowered, the sound grew, and one-by-one: faces of his friends appeared at the base of the moving steps. As he stepped out he looked for his bride to be, but couldn&amp;#8217;t find her. Then his friends part like sea from sky and suddenly&amp;#8230;&lt;/p&gt;

&lt;iframe width="560" height="315" src="http://www.youtube.com/embed/BSwDHiuB6xY" frameborder="0"&gt;&lt;/iframe&gt;

&lt;p&gt;Did you watch the video?&lt;/p&gt;

&lt;p&gt;How are you still reading? Aren&amp;#8217;t your eyes filled with tears, and you cheeks cramping from smiling? (I know mine were).&lt;/p&gt;

&lt;p&gt;Ruby steps forward holding cue-card style signs. Then, in-time to the boom-box soundtrack, she drops the cards explaining one-by-one why she is in love. As the last card falls she drops to one knee, and with a bottle of 12 year old scotch - proposes to Richard (that&amp;#8217;s me). He said yes!&lt;/p&gt;

&lt;h2&gt;The Couple&lt;/h2&gt;

&lt;p&gt;Richard met Ruby at a meeting of &lt;a href="http://austinonrails.org/"&gt;Austin on Rails&lt;/a&gt; when she was learning enough programming to make &lt;a href="http://hourschool.com"&gt;Hourschool.com&lt;/a&gt;. After many awkward moments, false starts, and months of waiting: he stole a kiss after a midnight social (bike) ride. She launched &lt;a href="http://hourschool.com"&gt;her company&lt;/a&gt;, while &lt;a href="http://www.zdnet.com/blog/facebook/gowalla-confirms-facebook-acquires-location-based-social-network/5808"&gt;his got devoured by Facebook&lt;/a&gt;. They moved in together, he got a &lt;a href="http://schneems.com/post/18073861900/journey-to-the-center-of-geekdom"&gt;job at Heroku&lt;/a&gt;, her company won a design award from &lt;a href="http://www.ac4d.com/2012/07/10/alumni-christina-tran-wins-core77-service-award/"&gt;core77&lt;/a&gt;, and they found the light of their life: &lt;a href="http://cl.ly/image/1I373H2x0Y3r"&gt;Cinco Dog&lt;/a&gt;. She sometimes teaches at &lt;a href="http://www.ac4d.com/home/people/students-and-alumni/ruby-ku/"&gt;Austin Center for Design&lt;/a&gt; and He sometimes teaches at the &lt;a href="http://schneems.com/ut-rails"&gt;University of Texas&lt;/a&gt;. They are both massively addicted to coffee, sunny days, and dachshund kisses.&lt;/p&gt;

&lt;p&gt;After their mutual proposals, Ruby and Richard will be married on an urban farm in Austin, Tx on April 27th, 2013. Cinco dog remains single and ready to mingle.&lt;/p&gt;

&lt;h2&gt;The Journey Begins&lt;/h2&gt;

&lt;p&gt;Tomorrow brings another sunrise, another sunset, and another day of Richard loving Ruby.&lt;/p&gt;</description><link>http://schneems.com/post/45191593376</link><guid>http://schneems.com/post/45191593376</guid><pubDate>Tue, 12 Mar 2013 11:16:35 -0400</pubDate></item><item><title>Open Source in your Inbox: Code Triage</title><description>&lt;p&gt;&lt;a href="http://wireframeapp.com/post/31629741670/dear-apple-i-give-up-wireframeapp-will-become-open"&gt;&amp;#8220;I don&amp;#8217;t have time to contribute to open source&amp;#8221;&lt;/a&gt;. But who does? We&amp;#8217;re too busy shipping products and open source is so daunting and time consuming. Sure tools and technologies are our livelihood, but there&amp;#8217;s just so much there. Even if you&amp;#8217;ve got the time - where do you start?&lt;/p&gt;

&lt;p&gt;What if giving back wasn&amp;#8217;t so overwhelming, so time consuming, so vast and soul crushing? What if you could get bite-sized open source tasks delivered right to your inbox? You could work on them when you get some free time, while learning more about the underlying guts of the code you depend on. Well now you can with: &lt;a href="http://codetriage.com"&gt;Code Triage&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;What is Code Triage?&lt;/h2&gt;

&lt;p&gt;Code triage sends you one issue a day from your favorite repos:&lt;/p&gt;

&lt;center&gt;
&lt;a href="http://codetriage.com"&gt;&lt;img src="http://cl.ly/image/250w1z1x0v3I/content.png" alt="Code Triage Screenshot"/&gt;&lt;/a&gt;
&lt;/center&gt;

&lt;p&gt;These issues come in one at a time and it could be anything: from a feature request, to a bug report, to code attached to a pull request. It&amp;#8217;s up to you to figure out if you can fix, give feedback, or grab someone with more experience. The more you can help, the more free time the software maintainers have.&lt;/p&gt;

&lt;p&gt;Do you want:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;To have your name in the commit log of famous projects?&lt;/li&gt;
&lt;li&gt;To gain a better understanding of the libraries you&amp;#8217;re using?&lt;/li&gt;
&lt;li&gt;To use less buggy software?&lt;/li&gt;
&lt;li&gt;To be a better developer?&lt;/li&gt;
&lt;li&gt;To be a better person?&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Then &lt;a href="http://codetriage.com"&gt;Code Triage&lt;/a&gt; is for you.&lt;/p&gt;

&lt;h2&gt;Maintainers: Increase your Firepower&lt;/h2&gt;

&lt;p&gt;You&amp;#8217;ve got open source libraries? &lt;a href="http://www.codetriage.com/repos/new"&gt;Add your repos&lt;/a&gt; to Code Triage and subscribe to them. I&amp;#8217;ve a few of my own libraries: &lt;a href="http://www.codetriage.com/schneems/wicked"&gt;Wicked&lt;/a&gt; and &lt;a href="http://www.codetriage.com/schneems/sextant"&gt;Sextant&lt;/a&gt; to triage. On the rare ocasion when I have issues pile up, I make sure I can work them off at a sustainable pace.&lt;/p&gt;

&lt;p&gt;If you know someone interested in your project, suggest that they sign up to triage the repo. Also consider putting a link on your README.&lt;/p&gt;

&lt;p&gt;It has already worked well for me. When I first launched Code Triage into Beta, &lt;a href="http://twitter.com/neilmiddleton"&gt;@neilmiddleton&lt;/a&gt; helped so much on issues that I gave him &lt;a href="http://en.wikipedia.org/wiki/Commit_bit"&gt;commit bit&lt;/a&gt; to the &lt;a href="http://github.com/codetriage/codetriage"&gt;github repo&lt;/a&gt;. Now he works on the project and sometimes fixes issues before I even get a chance to take a look at them.&lt;/p&gt;

&lt;p&gt;In fact it has worked out so well, Neil ended up asking me to co-author a &lt;a href="http://www.amazon.com/Heroku-Neil-Middleton/dp/144934139X"&gt;Heroku book&lt;/a&gt;. Legal Disclaimer: Code Triage cannot guarantee you co-authorship of an O&amp;#8217;Reilly book.&lt;/p&gt;

&lt;h2&gt;Programmers: Make a Difference&lt;/h2&gt;

&lt;p&gt;Open up your favorite editor, click &amp;#8220;Recently Opened&amp;#8221;, and then find a project. Take a good hard look at your dependencies, pick one, and then sign up to triage. It&amp;#8217;s really that simple.&lt;/p&gt;

&lt;p&gt;The era of &amp;#8220;too busy&amp;#8221;, &amp;#8220;too novice&amp;#8221;, and &amp;#8220;too lost to start&amp;#8221; are over. Now is the time to solve bugs, merge good pull requests, and prevent maintainer burn-out. Together we can do it.&lt;/p&gt;

&lt;p&gt;Go make an impact: one issue at a time &lt;a href="http://codetriage.com"&gt;Code Triage&lt;/a&gt;.&lt;/p&gt;</description><link>http://schneems.com/post/42508340989</link><guid>http://schneems.com/post/42508340989</guid><pubDate>Thu, 07 Feb 2013 11:12:50 -0500</pubDate></item><item><title>Anatomy of an Exploit: An In-depth Look at the Rails YAML Vulnerability</title><description>&lt;p&gt;Exploits happens, and this month the Rails and Ruby communities have seen no shortage. From a major exploit in Rails to a slightly different Rubygems.org attack, there has never been a better time to brush up on software security.&lt;/p&gt;

&lt;p&gt;Maybe you’re wondering why these vulnerabilities happen in the first place, why they weren’t caught in the first place, or maybe you just want to know the specifics of this attack. We’ll start off by taking a look at the anatomy of a security exploit, and then dive into the gory details of the YAML issue.&lt;/p&gt;

&lt;h3&gt;&lt;a href="http://rubysource.com/anatomy-of-an-exploit-an-in-depth-look-at-the-rails-yaml-vulnerability/"&gt;Continue Reading&amp;#8230;&lt;/a&gt;&lt;/h3&gt;</description><link>http://schneems.com/post/42283920969</link><guid>http://schneems.com/post/42283920969</guid><pubDate>Mon, 04 Feb 2013 12:46:00 -0500</pubDate></item><item><title> Use GIFs in your Pull Request for Good, not Evil</title><description>&lt;p&gt;This weekend I made my &lt;a href="http://github.com/rails/rails/issues/9001"&gt;OVER 9000&lt;/a&gt; pull request to Rails, that features a demo of the functionality in GIF format. I&amp;#8217;ve had a number of people ask the same question &amp;#8220;what is your GIF workflow?&amp;#8221;. For the detail oriented of you in the crowd, here it is.&lt;/p&gt;

&lt;h2&gt;The Content&lt;/h2&gt;

&lt;p&gt;I filmed my screen using &lt;a href="http://www.telestream.net/screenflow/overview.htm"&gt;Screen Flow&lt;/a&gt;, which I used to do all my work on &lt;a href="http://schneems.com/ut-rails"&gt;UT on Rails&lt;/a&gt;, it&amp;#8217;s not free at $99, but does editing, exporting, and managed to completely displace Final Cut Pro from my workflow. I recommend it. &lt;a href="http://www.reddit.com/r/ruby/comments/16zvjt/use_gifs_in_your_pull_request_for_good_not_evil/c81a4wd"&gt;Another user&lt;/a&gt; suggests using quicktime which can do screen recording for free.&lt;/p&gt;

&lt;p&gt;I took the video and then cropped it down to 560x315 and exported using H.264, this produced a teensy 619kb &lt;code&gt;.mov&lt;/code&gt; file.&lt;/p&gt;

&lt;h2&gt;The GIF&lt;/h2&gt;

&lt;p&gt;Once I had a video I opened it up in Photoshop and used Save for Web to save as a &lt;code&gt;.GIF&lt;/code&gt;. You can do this, or I&amp;#8217;ve since learned that there is a free way to do this using FFMPEG and Image Magick that actually produces a smaller file. First install FFMPEG:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ brew install ffmpeg
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Then navigate to the correct directory, and assuming your file is named &lt;code&gt;ScreenFlow.mov&lt;/code&gt; you can run this to produce a GIF:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ffmpeg -i ScreenFlow.mov -pix_fmt rgb24 output.gif
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You&amp;#8217;ll notice the &lt;code&gt;output.gif&lt;/code&gt; is huge-normous, tipping the scales at over 100mb. To cut this down to size you can use image magick:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ brew install imagemagick
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Then run:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ convert -layers Optimize output.gif output_optimized.gif
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Thanks to this poster on &lt;a href="http://superuser.com/questions/436056/how-can-i-get-ffmpeg-to-convert-a-mov-to-a-gif#_=_"&gt;super user&lt;/a&gt; for the shorthand. Here is a &lt;a href="http://alias.sh/convert-video-gif"&gt;shell script&lt;/a&gt; to do that same thing, and if you&amp;#8217;re looking for more vibrant results &lt;a href="http://www.reddit.com/r/ruby/comments/16zvjt/use_gifs_in_your_pull_request_for_good_not_evil/c81btvm"&gt;this user had some helpful tips&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Now you just need to post your amazing creation.&lt;/p&gt;

&lt;h2&gt;Posting&lt;/h2&gt;

&lt;p&gt;Now we&amp;#8217;ve got a GIF sitting pretty around 182kb or so, but we need to put it into our PR somehow. You could drag and drop it into Github or you can upload it somewhere publicly accessible for re-use later. Use your favorite cloud storage service here, I like &lt;a href="http://getcloudapp.com/"&gt;Cloud App&lt;/a&gt;. The service allows you to drag files to your menubar and share them. Make sure you&amp;#8217;ve got the direct link (it should end in a .gif).&lt;/p&gt;

&lt;p&gt;Once you&amp;#8217;ve done that just add it as a markdown image &lt;code&gt;![title goes here](url goes here)&lt;/code&gt; and put it in your pull request, so this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;![Path Helper Demo](&lt;a href="http://f.cl.ly/items/3C121F3E0P0A2o092I0w/output_optimized.gif"&gt;http://f.cl.ly/items/3C121F3E0P0A2o092I0w/output_optimized.gif&lt;/a&gt;)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Becomes this:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://f.cl.ly/items/3C121F3E0P0A2o092I0w/output_optimized.gif" alt="Path Helper Demo"/&gt;&lt;/p&gt;

&lt;h2&gt;Enjoy&lt;/h2&gt;

&lt;p&gt;Submit your PR, kick back relax and enjoy the GIF you&amp;#8217;ve bestowed upon humanity. Remember with great GIF power comes great GIF responsibility. Don&amp;#8217;t post useless or unnecessary GIFs just because you can. Remember that maintaining a project is tough enough without having to look at looping cats all day long. So only add them when they truly benefit the conversation and when it is tasteful. If no-one abuses this functionality, then Github won&amp;#8217;t have reason to disable gif support.&lt;/p&gt;

&lt;p&gt;Thanks for sticking around, hope you learned something. Now go out and contribute to open source so you can feel like this:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://f.cl.ly/items/252h1x2H120w1i1Y1a1j/20121112174030!Happy_dance,gif.gif" alt=""/&gt;&lt;/p&gt;</description><link>http://schneems.com/post/41104255619</link><guid>http://schneems.com/post/41104255619</guid><pubDate>Mon, 21 Jan 2013 10:00:00 -0500</pubDate><category>gif</category><category>workflow</category><category>pull request</category></item><item><title>Good, Simple Design</title><description>&lt;p&gt;I&amp;#8217;ve heard this re-framed again and again by many different programmers from &lt;a href="https://twitter.com/wycats"&gt;@wycats&lt;/a&gt; at Ruby conf to &lt;a href="https://twitter.com/dhh"&gt;@dhh&lt;/a&gt; in his &lt;a href="http://david.heinemeierhansson.com/2012/the-parley-letter.html"&gt;parlay letter&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;I consider this [the ease of getting started], like maintainability, to be a side effect of good, simple design.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I think this is a great way of looking at the &amp;#8220;beginner&amp;#8221; problem, but it doesn&amp;#8217;t give much guidance. What exactly is good design for advanced developers? Why is it also good for beginners? Who counts as a beginner? Is a .NET dev with 5 years of industry experience learning rails lumped into the same category as a someone who had never previously viewed-source on a webpage?&lt;/p&gt;

&lt;h2&gt;In the Beginning&lt;/h2&gt;

&lt;p&gt;Let&amp;#8217;s take it back a bit, to the era before one click purchases, and github signup buttons. The realm was ruled by the textbox and it&amp;#8217;s mighty accomplices radio buttons, text areas, and submit buttons. Signing up for a new web app was a lesson in finger cramps. Eventually some people were clever enough to figure out that fewer fields meant fewer interactions, and less fatigue. This of course lead to fewer people dropping off and higher sign-up numbers. Good for the business, who now has more users. Good for you, who now has to type. In the end all they needed was a password and an email, the rest was just details.&lt;/p&gt;

&lt;p&gt;What do web forms have to do with advanced programming? Everything. It doesn&amp;#8217;t matter if you were browsing the BBS on a 28.8k or you just got your first taste of the Internet over AOL, you had to go through the same interaction. Experience was irrelevant. There was no &amp;#8220;click here if you understand the internet&amp;#8221; signup option. So when the pain of signing up for many many services by the elite trickled down to help the newbs signing up for their first service: every won.&lt;/p&gt;

&lt;p&gt;Anectdotes aside, this is how coding for interaction should be. Build for the pros, don&amp;#8217;t forget the nos.  What can we as developers take away from the signup form? Treat each user interaction as a barrier to entry and productivity, slash cut and simplify until you can&amp;#8217;t be simpler, and treat the interface as a tool to reduce activation energy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PROTIP: Look for heavy process and cut it down to size&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sometimes the simplicity can come from an internal structure, let&amp;#8217;s take a look at how re-thinking how routes are groked led us to a more productive programmer and eventually a smarter &amp;#8220;beginner&amp;#8221;.&lt;/p&gt;

&lt;h2&gt;Simplicity in Action: Sextant&lt;/h2&gt;

&lt;p&gt;A Sextant is an ancient tool for finding your route via the stars. My program &lt;a href="https://github.com/schneems/sextant"&gt;Sextant&lt;/a&gt; is a tool for finding your rails routes via your browser. I started the project to save me from the pain of &lt;code&gt;rake routes&lt;/code&gt; to slash my waiting time (counted in agonies per command, of course) from 20 to 0.&lt;/p&gt;

&lt;p&gt;What started as a simple tool for saving time has since ballooned into a new way to visualize and think about a core part of our Rails coding experience, with over &lt;a href="http://rubygems.org/gems/sextant"&gt;39 thousand&lt;/a&gt; downloads. The key to it&amp;#8217;s success was identifying that extra step that wasn&amp;#8217;t needed, the boot time of the rails app. Now that sextant is shipping with Rails 4 we can start the process over again. What else isn&amp;#8217;t needed, or what is missing?&lt;/p&gt;

&lt;h2&gt;The Evolution of an Interface&lt;/h2&gt;

&lt;p&gt;Once we got the routes into the browser we&amp;#8217;ve now got a powerful set of interaction tools to work with, namely html and javascript. I was able to clean up the visuals of the routes a bit, but it always bothers me when the computer knows the answer to something and yet makes me do the work. Named routes which are a commonly used element in the views, are listed not as they are intended to be used, but instead only have their prefixes in the output. So instead of &lt;code&gt;new_users_path&lt;/code&gt; I&amp;#8217;ll often type &lt;code&gt;new_users&lt;/code&gt; into a view by accident when I&amp;#8217;m tired or distracted. When I hit refresh the page I see my problem, I forgot to do my mental math and add the &lt;code&gt;_path&lt;/code&gt; suffix. When you&amp;#8217;re already tired, already frustrated, just trying to ship a feature these seemingly small hoops to jump through grow ever larger with each mistake made. Why not remove them entirely?&lt;/p&gt;

&lt;p&gt;The solution is to add this info into the view by displaying the full named route helper:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://cl.ly/image/3A1z290a3l0Z/content.png" alt=""/&gt;&lt;/p&gt;

&lt;p&gt;I think this is great. But why, what makes this a good idea?&lt;/p&gt;

&lt;h2&gt;&amp;#8216;Don&amp;#8217;t make me think&amp;#8217;&lt;/h2&gt;

&lt;p&gt;Rails is famously convention over configuration. This saves you, the developer, countless hours debating where to put your files or and what to name your folders. While this eliminating these extra steps is a great thing, something can get lost in the translation:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The first thing this current class of students asked me is &amp;#8220;Where can I find the document that describes all of the Rails conventions.&amp;#8221; - &lt;a href="https://twitter.com/steveklabnik/status/282185726777495553"&gt;@steveklabnik&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;As you&amp;#8217;re removing steps, if you miss some, then you&amp;#8217;re secretly adding a hidden step to Google for for awhile. This Google tax only comes to: the new, the uninformed, the tired, and the overworked programmer trying to ship at the last minute. It&amp;#8217;s easy to forget once you know the missing step by heart. This is why being explicit with route helpers in Sextant makes an impact. We took the hidden step &amp;#8220;add &lt;code&gt;_path&lt;/code&gt; to the end of these&amp;#8221; and made it explicit without losing any information (you can still see that &lt;code&gt;_url&lt;/code&gt; is an option):&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PROTIP: Mental math leads to errors, where can we be more specific?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;While you&amp;#8217;re refining and iterating and slashing steps, don&amp;#8217;t forget to keep context front and center. If you&amp;#8217;re looking for places where you might need better docs, or more accessible information. I recommend you keep a &amp;#8230;&lt;/p&gt;

&lt;h2&gt;Cheat Sheet&lt;/h2&gt;

&lt;p&gt;I use &lt;a href="http://evernote.com/"&gt;Evernote&lt;/a&gt; to keep track of the text snippets and docs links I end up finding useful. Not only does it help to organize my thoughts while I&amp;#8217;m having issues, I can search it later if I run into the same problem, and even better when I&amp;#8217;m bored or looking for something to productively procrastinate with, these notes are great places to see if we could add more docs, take away steps, or remove some mental math.&lt;/p&gt;

&lt;h2&gt;Design for All&lt;/h2&gt;

&lt;p&gt;If I can make my interface so simple it only needs one step, maybe one day we can eliminate the need entirely. This is exactly how automation is born and thrives. While it&amp;#8217;s obvious saving developer time is a good thing, why had no one done this before, and how can you build better software for all levels?&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;Keep a cheat sheet&lt;/li&gt;
&lt;li&gt;Look for duplicate or un-needed steps&lt;/li&gt;
&lt;li&gt;Look for long complicated processes&lt;/li&gt;
&lt;li&gt;Look for missing docs or implied information&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Get up and make a difference, work with &lt;a href="http://railsgirls.com/"&gt;more beginners&lt;/a&gt;, contribute to open source and help close the gaps.&lt;/p&gt;

&lt;hr&gt;&lt;p&gt;Richard &amp;#8220;&lt;a href="http://twitter.com/schneems"&gt;@schneems&lt;/a&gt;&amp;#8221; (pronounced like Schnapps) Schneeman writes Ruby code for &lt;a href="http://twitter.com/heroku"&gt;@heroku&lt;/a&gt; and teaches &lt;a href="http://schneems.com/ut-rails"&gt;Rails at the University of Texas&lt;/a&gt;.&lt;/p&gt;</description><link>http://schneems.com/post/40602104940</link><guid>http://schneems.com/post/40602104940</guid><pubDate>Tue, 15 Jan 2013 10:00:51 -0500</pubDate><category>ruby</category><category>rails</category><category>beginner</category><category>design</category></item><item><title>JRuby Support Live on Heroku</title><description>&lt;p&gt;I&amp;#8217;ve been quite lately, thats because we&amp;#8217;ve been working on something amazing over at Heroku. So check out:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;&lt;a href="http://blog.heroku.com/archives/2012/12/13/run_jruby_on_heroku_right_now/"&gt;Run JRuby on Heroku Right Now&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://devcenter.heroku.com/articles/moving-an-existing-rails-app-to-run-on-jruby?preview=1"&gt;Move and Existing Rails app to use JRuby&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;I had a ton of fun working with JRuby, and Heroku made it super easy. If you&amp;#8217;ve never thought of using JRuby in Production, maybe you can give it a whirrl.&lt;/p&gt;</description><link>http://schneems.com/post/37845120526</link><guid>http://schneems.com/post/37845120526</guid><pubDate>Thu, 13 Dec 2012 13:47:00 -0500</pubDate><category>jruby</category><category>heroku</category></item><item><title>Hi there, I wonder what do you think about MongoDB and Mongoid? I'm confused to use them or not. I'm between PostgreSQL and MongoDB... Well, so a relational database and a document-oriented database. Thanks for your reply.</title><description>&lt;p&gt;Stick with what you know unless you have a good reason for using something else. I have a video on nosql that may or may not help &lt;a href="http://www.youtube.com/watch?v=oL-A4JYwgH4"&gt;http://www.youtube.com/watch?v=oL-A4JYwgH4&lt;/a&gt;&lt;/p&gt;</description><link>http://schneems.com/post/36382396351</link><guid>http://schneems.com/post/36382396351</guid><pubDate>Fri, 23 Nov 2012 17:44:48 -0500</pubDate></item><item><title>Custom Wizard URLs in Rails with Wicked</title><description>&lt;p&gt;I wrote this wizard controller library that people seem to really dig called &lt;a href="https://github.com/schneems/wicked"&gt;Wicked&lt;/a&gt;. It works well to build &lt;a href="http://schneems.com/post/18437886598/wizard-ify-your-rails-controllers-with-wicked"&gt;after signup wizards&lt;/a&gt; and to &lt;a href="https://github.com/schneems/wicked/wiki/Building-Partial-Objects-Step-by-Step"&gt;incrementally build objects for the database&lt;/a&gt; but there is one thing it didn&amp;#8217;t do very well until now: allow you to change the text in your wizard url&amp;#8217;s quickly and easily.&lt;/p&gt;

&lt;p&gt;If you&amp;#8217;re new to Internationalization (&lt;a href="http://guides.rubyonrails.org/i18n.html"&gt;I18n&lt;/a&gt;) it&amp;#8217;s a process of making your website look native in more that one language. With the newly released Wicked you can translate your wizard urls or simply use it to change your custom urls in one language with no code changes. Check it out:&lt;/p&gt;

&lt;h3&gt;Internationalization of URLS (I18n)&lt;/h3&gt;

&lt;p&gt;If your site works in multiple languages, or if you just want more control over how your URL&amp;#8217;s look you can now use I18n with wicked. To do so you need to replace this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;include Wicked::Wizard
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;With this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;include Wicked::Wizard::Translated
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This will allow you to specify translation keys instead of literal step names. Let&amp;#8217;s say you&amp;#8217;ve got steps that look like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;steps :first, :second
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;So the urls would be &lt;code&gt;/after_signup/first&lt;/code&gt; and &lt;code&gt;/after_signup/second&lt;/code&gt;. But you want them to show up differently for different locales. For example someone coming form a Spanish speaking locale should see &lt;code&gt;/after_signup/uno&lt;/code&gt; and &lt;code&gt;after_signup/dos&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;To internationalize first you need to create your locales files under &lt;code&gt;config/locales&lt;/code&gt; such as &lt;code&gt;config/locales/es.yml&lt;/code&gt; for Spanish. You then need to add a &lt;code&gt;first&lt;/code&gt; and &lt;code&gt;second&lt;/code&gt; key under a &lt;code&gt;wicked&lt;/code&gt; key like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;es:
  hello: "hola mundo"
  wicked:
    first: "uno"
    second: "dos"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It would also be a good idea to create a english version under &lt;code&gt;config/locales/en.yml&lt;/code&gt; or your english speaking friends will get errors. If your app already uses I18n you don&amp;#8217;t need to do anything else, if not you will need to make sure that you set the &lt;code&gt;I18n.locale&lt;/code&gt; on each request you could do this somewhere like a before filter in your application_controller.rb&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;before_filter :set_locale

private

def set_locale
  I18n.locale = params[:locale] if params[:locale].present?
end

def default_url_options(options = {})
  {locale: I18n.locale}
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;For a screencast on setting up and using I18n check out &lt;a href="http://railscasts.com/episodes/138-i18n-revised"&gt;Railscasts&lt;/a&gt;. You can also read the &lt;a href="http://guides.rubyonrails.org/i18n.html"&gt;free I18n Rails Guide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Now when you visit your controller with the proper locale set your url&amp;#8217;s should be more readable like &lt;code&gt;/after_signup/uno&lt;/code&gt; and &lt;code&gt;after_signup/dos&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Wicked expects your files to be named the same as your keys, so when a user visits &lt;code&gt;after_signup/dos&lt;/code&gt; with the &lt;code&gt;es&lt;/code&gt; locale it will render the &lt;code&gt;second.html.erb&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; When you do this the value of &lt;code&gt;step&lt;/code&gt; as well as
&lt;code&gt;next_step&lt;/code&gt; and &lt;code&gt;previous_step&lt;/code&gt; and all the values within &lt;code&gt;steps&lt;/code&gt; will
be translated to what locale you are using. To translate them to the
&amp;#8220;canonical&amp;#8221; values that you&amp;#8217;ve have in your controller you&amp;#8217;ll need so
use &lt;code&gt;wizard_value&lt;/code&gt; method.&lt;/p&gt;

&lt;p&gt;For example, if you had this in your controller, and you converted it to
a use Wicked translations, so this will not work:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;steps :confirm_password, :confirm_profile, :find_friends

def show
  case step
  when :find_friends
    @friends = current_user.find_friends
  end
  render_wizard
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Instead you need to use &lt;code&gt;wizard_value&lt;/code&gt; to get the &amp;#8220;reverse translation&amp;#8221; in your controller code like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;steps :confirm_password, :confirm_profile, :find_friends

def show
  case wizard_value(step)
  when :find_friends
    @friends = current_user.find_friends
  end
  render_wizard
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The important thing to remember is that &lt;code&gt;step&lt;/code&gt; and the values in &lt;code&gt;steps&lt;/code&gt; are
always going to be in the same language if you&amp;#8217;re using the Wicked translations.
If you need any values to match the values set directly in your controller,
 or the names of your files (i.e. &lt;code&gt;views/../confirm_password.html.erb&lt;/code&gt;, then you need
to use &lt;code&gt;wizard_value&lt;/code&gt; method.&lt;/p&gt;

&lt;h2&gt;Custom URL&amp;#8217;s&lt;/h2&gt;

&lt;p&gt;Very similar to using I18n from above but instead of making new files for different languages, you can stick with one language. Make sure you are using the right module:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;include Wicked::Wizard::Translated
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Then you&amp;#8217;ll need to specify translations in your language file. For me, the language I&amp;#8217;m using is english so I can add translations to &lt;code&gt;config/locales/en.yml&lt;/code&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;en:
  hello: "hello world"
  wicked:
    first: "verify_email"
    second: "if_you_are_popular_add_friends"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now you can change the values in the URL&amp;#8217;s to whatever you want without changing your controller or your files, just modify your &lt;code&gt;en.yml&lt;/code&gt;. If you&amp;#8217;re not using English you can set your default_locale to something other than &lt;code&gt;en&lt;/code&gt; in your &lt;code&gt;config/application.rb&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;config.i18n.default_locale = :de&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; Don&amp;#8217;t forget to use &lt;code&gt;wizard_value()&lt;/code&gt; method to make
sure you are using the right cannonical values of &lt;code&gt;step&lt;/code&gt;,
&lt;code&gt;previous_step&lt;/code&gt;, &lt;code&gt;next_step&lt;/code&gt;, etc. If you are comparing them to non
wicked generate values.&lt;/p&gt;

&lt;p&gt;Custom crafted wizard urls: just another way Wicked makes your app a little more saintly.&lt;/p&gt;

&lt;hr&gt;&lt;p&gt;Richard &lt;a href="http://twitter.com/schneems"&gt;@schneems&lt;/a&gt; (pronounced sorta like Schnapps), loves writing gems and works for &lt;a href="http://heroku.com"&gt;Heroku&lt;/a&gt;. If you enjoy the &lt;a href="https://github.com/schneems.com/wicked"&gt;wicked gem&lt;/a&gt; consider watching the repo or telling your friends.&lt;/p&gt;</description><link>http://schneems.com/post/35705943704</link><guid>http://schneems.com/post/35705943704</guid><pubDate>Wed, 14 Nov 2012 10:00:00 -0500</pubDate><category>wicked</category><category>ruby</category><category>rails</category><category>i18n</category></item><item><title>Hacking mruby onto Heroku</title><description>&lt;p&gt;If you&amp;#8217;re in the Ruby world, you&amp;#8217;ve likely heard about &lt;a href="https://github.com/mruby/mruby"&gt;mruby&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Yukihiro_Matsumoto"&gt;Matz&amp;#8217;s&lt;/a&gt; latest experimental Ruby implementation. What I bet you didn&amp;#8217;t know is that you can run mruby on Heroku right now. As a matter of fact you can run just anything on Heroku, as long as it can compile it into a binary on a Linux box.&lt;/p&gt;

&lt;p&gt;If you&amp;#8217;re new to mruby, or to compiling binaries take a look at my last article &lt;a href="http://rubysource.com/try-mruby-today/"&gt;Try mruby Today&lt;/a&gt;. I cover getting mruby up and running on your local machine. If you are already up to speed then follow along as we use &lt;a href="https://github.com/heroku/vulcan"&gt;vulcan&lt;/a&gt; to package mruby as binary, wrap it up in a custom &lt;a href="http://blog.heroku.com/archives/2012/7/17/buildpacks/"&gt;buildpack&lt;/a&gt; and then launch an app to use mruby on the Heroku cloud.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://rubysource.com/hacking-mruby-onto-heroku/"&gt;Continue Reading &amp;#8230;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Yesterday&lt;/h2&gt;

&lt;p&gt;If you missed it yesterday we announced official support for &lt;a href="http://blog.heroku.com/archives/2012/11/5/ruby-2-preview-on-heroku/"&gt;Ruby 2.0.0 Preview1&lt;/a&gt;, and announced the dates for our developer conference, &lt;a href="http://blog.heroku.com/archives/2012/11/6/waza-2013/"&gt;Waza 2013&lt;/a&gt;, including the &lt;a href="http://blog.heroku.com/archives/2012/11/6/waza-2013/"&gt;Waza call for Speakers&lt;/a&gt;.&lt;/p&gt;</description><link>http://schneems.com/post/35139600268</link><guid>http://schneems.com/post/35139600268</guid><pubDate>Tue, 06 Nov 2012 13:59:33 -0500</pubDate><category>ruby</category><category>mruby</category><category>heroku</category><category>buildpacks</category></item><item><title>Ruby 2.0 Preview Available on Heroku</title><description>&lt;p&gt;When Heroku first launched you could only use one version of Ruby: 1.8.6. As the Ruby implementation matured and improved, so did Heroku. We recently announced the ability to specify your ruby version on Heroku, and we are happy to announce the first preview-build of Ruby available: starting today you can use Ruby 2.0 preview1 on Heroku.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blog.heroku.com/archives/2012/11/5/ruby-2-preview-on-heroku/"&gt;Read more &amp;#8230;&lt;/a&gt;&lt;/p&gt;</description><link>http://schneems.com/post/35063055023</link><guid>http://schneems.com/post/35063055023</guid><pubDate>Mon, 05 Nov 2012 12:18:40 -0500</pubDate></item><item><title> Reddit on Rails part 3: Last week of UT on Rails</title><description>&lt;p&gt;I&amp;#8217;m finally wrapping up my &lt;a href="http://schneems.com/ut-rails"&gt;UT on Rails&lt;/a&gt; series. While people have been getting close to the end of the course, I&amp;#8217;ve gotten the question &amp;#8220;Now what?&amp;#8221; plenty of times. Now that you&amp;#8217;ve spent 40+ hours pouring over videos, exercises, and quizzes where do you go from here? To answer this question I made a short video. But first, the last exercise of the course:&lt;/p&gt;

&lt;h2&gt;&lt;a href="https://github.com/schneems/reddit_on_rails/blob/master/part_three.md"&gt;Reddit on Rails: Part 3&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;This week we wrap up our Reddit on Rails exercise series by adding styling to our project,  full text search, and some much needed integration tests. What are you waiting for go start on 
&lt;a href="https://github.com/schneems/reddit_on_rails/blob/master/part_three.md"&gt;the exercise&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;&lt;a href="http://youtu.be/Bj-4NnDVkXA"&gt;Where Do We Go Now&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;A programming course can&amp;#8217;t make you a good programmer, watch this video to learn where to go from here. Don&amp;#8217;t stop now, you&amp;#8217;re so close to doing great things&amp;#8230;&lt;/p&gt;

&lt;iframe width="560" height="315" src="http://www.youtube.com/embed/Bj-4NnDVkXA?rel=0" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;

&lt;h2&gt;Additional Resources&lt;/h2&gt;

&lt;ul&gt;&lt;li&gt;&lt;a href="http://reddit.com/r/ruby"&gt;reddit.com/r/ruby&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://rubyweekly.com"&gt;Ruby weekly&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://railscasts.com/"&gt;Rails Casts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://pragprog.com/book/ppmetr/metaprogramming-ruby"&gt;Metaprogramming Ruby [book]&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://pragprog.com/book/tpp/the-pragmatic-programmer"&gt;The Pragmatic Programmer: From Journeyman to Master [book]&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://pragprog.com/book/jcdeg/new-programmer-s-survival-manual"&gt;New Programmers Survival Manual [book]&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://pragprog.com/book/ruby3/programming-ruby-1-9"&gt;Programming Ruby [The Pickaxe book]&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;hr&gt;&lt;p&gt;Don&amp;#8217;t forget to follow me on twitter &lt;a href="http://twitter.com/schneems"&gt;@schneems&lt;/a&gt; and tumblr. Though the class might be over, I still talk about Ruby and Rails quite a bit. Thanks, and see you on the internets.&lt;/p&gt;</description><link>http://schneems.com/post/34635522794</link><guid>http://schneems.com/post/34635522794</guid><pubDate>Tue, 30 Oct 2012 10:00:15 -0400</pubDate><category>rails</category><category>ruby</category><category>tutorial</category><category>course</category></item><item><title>Try mruby Today</title><description>&lt;p&gt;Ruby dominates the web: running popular sites like Github, Heroku, and Living Social. But why should web developers get to have all the fun? Wouldn’t it be great if game developers, embedded systems engineers, or anyone else could use the beautiful syntax of Ruby in their C programs? Lucky for us, that’s exactly what mruby plans to do&amp;#8230;&lt;/p&gt;

&lt;p&gt;continue reading my article on &lt;strong&gt;&lt;a href="http://rubysource.com/try-mruby-today/"&gt;Rubysource: try mruby today&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;</description><link>http://schneems.com/post/34170714500</link><guid>http://schneems.com/post/34170714500</guid><pubDate>Tue, 23 Oct 2012 12:58:00 -0400</pubDate><category>ruby</category><category>mruby</category><category>rubysource</category></item><item><title>the boots in the corner: Hire junior devs!</title><description>&lt;a href="http://amydoesntlai.tumblr.com/post/34088232695/hire-junior-devs"&gt;the boots in the corner: Hire junior devs!&lt;/a&gt;: &lt;p&gt;&lt;a href="http://amydoesntlai.tumblr.com/post/34088232695/hire-junior-devs" class="tumblr_blog"&gt;amydoesntlai&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;To employers:&lt;/p&gt;
&lt;p&gt;Hire junior devs!&lt;/p&gt;
&lt;p&gt;I am writing this not because it is self-serving — at least, not &lt;em&gt;entirely&lt;/em&gt; because it is self-serving — but because I have been hearing people in the industry say so, and I didn’t want to be guilty of, you know, hoarding their knowledge.&lt;/p&gt;
&lt;p&gt;On Wednesday, some of us…&lt;/p&gt;&lt;/blockquote&gt;</description><link>http://schneems.com/post/34164298674</link><guid>http://schneems.com/post/34164298674</guid><pubDate>Tue, 23 Oct 2012 10:05:28 -0400</pubDate></item></channel></rss>
