<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-35868762</id><updated>2011-11-12T17:49:29.917-08:00</updated><category term='mobile'/><category term='spork'/><category term='rubyconf2007'/><category term='Rubinius'/><category term='beer'/><category term='postgres'/><category term='continuous integration'/><category term='s3'/><category term='ai'/><category term='json-p'/><category term='hmc6352'/><category term='free'/><category term='dorkboard'/><category term='mars'/><category term='xbee'/><category term='unmanned aerial vehicles'/><category term='surveillance'/><category term='freedom'/><category term='asynchronous processing'/><category term='rush'/><category term='cool stuff'/><category term='iphone'/><category term='passenger'/><category term='git'/><category term='rack'/><category term='larubyconf'/><category term='recaptcha'/><category term='grep'/><category term='rails'/><category term='sun'/><category term='thinking sphinx'/><category term='bdd'/><category term='kids'/><category term='frankie'/><category term='facebook'/><category term='xml'/><category term='halloween'/><category term='xfs'/><category term='visualization'/><category term='msysgit'/><category term='business'/><category term='mysql'/><category term='flying robot'/><category term='keynote'/><category term='railsconf on beer'/><category term='oil dependency'/><category term='cucumber'/><category term='textmate'/><category term='venture capital'/><category term='OSX'/><category term='acts_as_ferret'/><category term='AdaLovelaceDay2010'/><category term='los angeles'/><category term='patents'/><category term='rspec'/><category term='android'/><category term='ironruby'/><category term='kids programming'/><category term='going public'/><category term='mac'/><category term='grid computing'/><category term='sinatra'/><category term='railsconf'/><category term='digital compass'/><category term='integrity'/><category term='heroku'/><category term='china'/><category term='ferret'/><category term='ubuntu'/><category term='larubyconf2009'/><category term='pololu'/><category term='kill rock stars'/><category term='zero effect'/><category term='vista'/><category term='svn'/><category term='subversion'/><category term='ruby'/><category term='space'/><category term='s3 folders'/><category term='futureruby'/><category term='attachment_fu'/><category term='jazz'/><category term='uav'/><category term='democracy'/><category term='ec2'/><category term='charting'/><category term='sphinx'/><category term='railsconf 2009'/><category term='jury service'/><category term='rush shell'/><category term='web development'/><category term='railsconf2007'/><category term='good code'/><category term='behavioral finance'/><category term='police state'/><category term='merb'/><category term='blimpduino'/><category term='sequel'/><category term='press'/><category term='AdaLovelaceDay10'/><category term='hebruby'/><category term='be prepared'/><category term='ruby vm'/><category term='railsconf 2008'/><category term='rad'/><category term='public transportation'/><category term='user interface'/><category term='agile development'/><category term='windows'/><category term='female programmers'/><category term='test-driven development'/><category term='programming languages'/><category term='softer side of development'/><category term='async'/><category term='zigbee'/><category term='ebs'/><category term='facebooker'/><category term='ey-cloud'/><category term='rubyconf2008'/><category term='arduino'/><category term='rubyconf'/><category term='apache'/><category term='jsonp'/><category term='knowledge'/><category term='google analytics'/><category term='math'/><category term='engine yard'/><category term='comatose'/><category term='software metrics'/><category term='instruments'/><category term='cloud computing'/><category term='rubyconf2010'/><category term='vacation'/><category term='robotics'/><category term='railsconf2008'/><category term='silverlight'/><category term='rubyconf 2007'/><category term='ruby waves'/><category term='multithreading'/><category term='werewolf'/><category term='music'/><category term='danny blitz'/><category term='los angeles rubyconf'/><category term='open source development'/><category term='cruisecontrol.rb'/><category term='domain specific languages'/><category term='databases'/><category term='sparkline'/><category term='jquery'/><category term='software architecture'/><category term='railsconf2009'/><category term='code2009'/><category term='ruby on rails'/><category term='rubyconf 2008'/><category term='radrails'/><category term='wireless'/><category term='testdriven.net'/><category term='unix'/><category term='upload progress'/><category term='twitter'/><category term='history'/><category term='microsoft'/><category term='electric car'/><category term='vote'/><category term='phonegap'/><category term='jruby'/><category term='ruby arduino development'/><category term='e the editor'/><category term='ruby.net'/><category term='capistrano'/><category term='AdaLovelaceDay09'/><category term='aptana'/><title type='text'>Dead Programmer Society</title><subtitle type='html'>To the day that the programmers start running the asylum. Carpe Codex!</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default?start-index=101&amp;max-results=100'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>197</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-35868762.post-7668071915323234054</id><published>2010-11-30T23:05:00.000-08:00</published><updated>2010-11-30T23:16:06.348-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='ruby on rails'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='google analytics'/><title type='text'>Gabba: A Ruby Gem For Doing Server Side Google Analytics Tracking</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.thehype.fm/wp-content/uploads/2009/05/yo-gabba.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 385px; height: 394px;" src="http://www.thehype.fm/wp-content/uploads/2009/05/yo-gabba.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;Yo, Gabba! Gabba, hey? &lt;a href="https://github.com/hybridgroup/gabba"&gt;Gabba&lt;/a&gt; is a Ruby gem to do easy server-side &lt;a href="http://google.com/analytics/"&gt;Google Analytics&lt;/a&gt; tracking of page view and custom events. Gather around and I'll show you how it works.&lt;br /&gt;&lt;br /&gt;Google Analytics is the gold standard of website traffic reporting. In addition to tracking page views, one of the interesting capabilities it has is to track custom events. These could be shopping cart checkouts or video plays from clicking on a button in a Flash player.&lt;br /&gt;&lt;br /&gt;The way that Google Analytics is implemented is using the typical tracking image technique. An image is fetched from the server, and based on the infomation pased with this request, the information about the visit is tracked. One twist on this is that Google Analytics generates the tag for the "traxel" using a piece of asynchronous JavaScript. This means that clients without javascript are not able to use Google Analytics to track visitor metrics... or does it?&lt;br /&gt;&lt;br /&gt;There is another lesser-known way to integrate that can generate the needed info entirely on the server. This is normally used to handle older mobile browsers that do not have JavaScript implementations. Since all you are doing is fetching a 1x1 pixel GIF image, all you really need is the magic URL.&lt;br /&gt;&lt;br /&gt;This is in fact exactly what you would need to do if you want to track custom events, the only real difference being the specific parameters passed to Google Analytics.&lt;br /&gt;&lt;br /&gt;There are a number of cases where you might want to track custom events for non-browser devices or other unique situations. Tracking when a purchase is completed, or when a video is played by Flash player or a phone call is initiated, are just a few things you might want to track entirely on the server, with no browser interaction at all.&lt;br /&gt;&lt;br /&gt;I did a bit of searching, but did not find any Ruby library that did what I needed. You know what that means! Fire up the editor, I'm going in! And that is how the gabba gem was born.&lt;br /&gt;&lt;br /&gt;It is very easy to use:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# track page views&lt;br /&gt;Gabba::Gabba.new("UT-1234", "mydomain.com").page_view("something", "track/me")&lt;br /&gt;&lt;br /&gt;# or track custom events&lt;br /&gt;Gabba::Gabba.new("UT-1234", "mydomain.com").event("Videos", "Play", "ID", "123")&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;That is all there is to using it. Simple way to get server side Google Analytics tracking of page view and custom events. Fork &lt;a href="https://github.com/hybridgroup/gabba"&gt;gabba&lt;/a&gt; on github, or just "gem install gabba" and start tracking all your fun stuff.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-7668071915323234054?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/7668071915323234054/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=7668071915323234054' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/7668071915323234054'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/7668071915323234054'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2010/11/gabba-ruby-gem-for-doing-server-side.html' title='Gabba: A Ruby Gem For Doing Server Side Google Analytics Tracking'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-213520426745796358</id><published>2010-11-17T07:20:00.000-08:00</published><updated>2010-11-18T09:20:10.498-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rubyconf2010'/><category scheme='http://www.blogger.com/atom/ns#' term='rubyconf'/><title type='text'>10 Cool Things From RubyConf X</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://rlv.zcache.com/x_hat-p148311112721548543qz14_400.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 400px; height: 400px;" src="http://rlv.zcache.com/x_hat-p148311112721548543qz14_400.jpg" border="0" alt="" /&gt;&lt;/a&gt;This last week was the fantastic &lt;a href="http://rubyconf.org/"&gt;RubyConf X&lt;/a&gt;. It has been ten years of RubyConf and in celebration of this notable occasion, the organizers located it in New Orleans and opened up the registration to a lot more people then most years past. This had the clearly foreseeable consequence of turning the conference into a really fun time!&lt;br /&gt;&lt;br /&gt;So here, in no particular order, are 10 cool things I saw or heard at the conference.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;1. Rite&lt;/h2&gt;&lt;br /&gt;During &lt;a href="http://twitter.com/yukihiro_matz"&gt;Matz's&lt;/a&gt; keynote he introduced "Rite" which is a embedded version of Ruby designed to run on devices such as digital TVs, and other neat small gadgets. It will have a different implementation that the CRuby implementation, optimized for the smaller lower powered profile of the next generation gadgets. The project is sponsored by the Japanese government and is already being used in development by a major game company that could not be named but is will known. My palms started sweating the minute I heard about it, and I am already getting excited about the prospect of &lt;a href="https://github.com/deadprogrammer/flying_robot"&gt;flying_robot&lt;/a&gt; 2.0 based on Rite.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;2. Evergreen w/CoffeeScript&lt;/h2&gt;&lt;br /&gt;&lt;a href="http://twitter.com/cjkihlbom"&gt;CJ Kihlbom&lt;/a&gt; and &lt;a href="http://twitter.com/jncoward"&gt;Jonas Nicklas&lt;/a&gt; gave an excellent overview of client-side UI testing. They also demoed their own highly useful &lt;a href="https://github.com/jnicklas/evergreen"&gt;Evergreen&lt;/a&gt; testing framework which works together with Ruby and Jasmine looks like a very succinct and useful approach toward browser testing. Writing specs in CoffeeScript looks very tasty.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;3. Gentlemanly Git Tricks&lt;/h2&gt;&lt;br /&gt;&lt;a href="http://twitter.com/CHACON"&gt;Scott Chacon's&lt;/a&gt; talks on git always leave me feeling knowing both more than I did, and less then I thought I did, at the same time. This session also had a hilarious and yet useful section on 'how to be a gentleman' including tips on whiskey, how to dress, how to tip, and how to treat a lady. Keeping it classy, Scott!&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;4. "F-Bombs, Zeds, _whys and a Missing Brain Area"&lt;/h2&gt;&lt;br /&gt;The keynote speeches from &lt;a href="http://twitter.com/pragdave"&gt;Dave Thomas&lt;/a&gt;, &lt;a href="http://twitter.com/dhh"&gt;David Heinemeier Hansson&lt;/a&gt; and Matz could not have been more different on the surface, and yet had a similar theme: defy the limitations of the status quo, and seek out new ideas that are actually better. Dave's admonishment of the community to get over our gender bias, David's F-bombs, weed photos, and cry of "Freedom!", and Matz's love of diversity from _why to Zed, and adopting of David's amusing yet appropriate term "freedom-patching" in lieu of the less pleasant-sounding "monkeypatching" were all different ways of showing our desire as a community to seek out these truths. As long as we keep talking to each other, and also listening with an open mind.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;5. Ruby 1.9.2 is Ready&lt;/h2&gt;&lt;br /&gt;Several people have been saying it, I am been using it from some testing, and &lt;a href=""&gt;Jim Wierich&lt;/a&gt; said it in the 'hallway track': Ruby 1.9.2 is ready for prime-time. If you are not transitioning your apps to 1.9.2 you should be. Performance, and cool tools like minitest are just two reasons to do it today.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;6. Beyond The Code&lt;/h2&gt;&lt;br /&gt;&lt;a href="http://twitter.com/paulca"&gt;Paul Campbell&lt;/a&gt;, &lt;a href="http://twitter.com/objo"&gt;Joe O'Brian&lt;/a&gt;, &lt;a href="http://twitter.com/keavy"&gt;Keavy McMinn&lt;/a&gt;, &lt;a href="http://twitter.com/jondahl"&gt;Jon Dahl&lt;/a&gt;, &lt;a href="http://twitter.com/mojombo"&gt;Tom Preston-Werner&lt;/a&gt; and several other interesting developers spoke about more than just programming. Hacking business, art, music, and code, are all just aspects of hacking. RubyConf is a great place to find out not just about Ruby code, but the motivations and inspiration behind people we respect, and look to to improve ourselves.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;7. Lightning Talks&lt;/h2&gt;&lt;br /&gt;The number of people that are eager to signup for a lightning talk was huge at RubyConf, as always greatly exceeding the available time. Even trimming down each to 4 minutes, there was only time to get thru relatively few, and I was lucky to get to speak about the &lt;a href="http://ticketrb.com"&gt;Ticketmaster&lt;/a&gt; gem.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;8. Kid Programmer Mini-Conf&lt;/h2&gt;&lt;br /&gt;&lt;a href="http://twitter.com/ultrasaurus"&gt;Sarah Allen&lt;/a&gt;, &lt;a href="http://twitter.com/sarahmei"&gt;Sarah Mei&lt;/a&gt;, &lt;a href="http://twitter.com/purp"&gt;Jim Meyer&lt;/a&gt; (who sadly could not make the conference at the last minute), &lt;a href="http://twitter.com/liahhansen"&gt;Liah Hansen&lt;/a&gt; put together a parallel kids programming track, for the first time ever at RubyConf. The idea was brilliant, and I hope to bring my own son next year to participate.&lt;br /&gt;&lt;br /&gt;UPDATE: Sarah Mei informs me that &lt;a href="http://twitter.com/maxwellsalz"&gt;Maxwell Salzberg&lt;/a&gt; is also an organizer of the kids track. My bad!&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;9. Hallway Track&lt;/h2&gt;&lt;br /&gt;As always, the conversations at RubyConf are amazing. The people who attend are doing amazing things, and the change to hang out for a few days talking is a fantastic chance to learn and find out incredibly useful and interesting things. You have to actually attend RubyConf to experience this, you just cannot get it by watching the videos.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;10. Music&lt;/h2&gt;&lt;br /&gt;From the live music in New Orleans, to the DJs, it is really great to have been in a city where music is something living, vibrant, and cherished. Getting to do my music/brain hacking talk on &lt;a href="http://rubyconf.org/presentations/36"&gt;"How To Jam In Code"&lt;/a&gt; was just the icing on the cake for me in the city of Jazz. Getting to create a bio-computer made of living people is a special privilege, thank you very much to everyone who participated.&lt;br /&gt;&lt;br /&gt;But most of all, thank you very much to &lt;a href="http://twitter.com/kellyjeanne"&gt;Kelly Fowler&lt;/a&gt;, &lt;a href="http://twitter.com/chadfowler"&gt;Chad Fowler&lt;/a&gt;, &lt;a href="http://twitter.com/rich_kilmer"&gt;Rich Kilmer&lt;/a&gt;, and &lt;a href="http://twitter.com/david_a_black"&gt;David Black&lt;/a&gt; for doing so very much for all of us. It is a lot of hard work, and we all appreciate it!&lt;br /&gt;&lt;br /&gt;RubyConf X was a tremendous affirmation of the strength and depth of sharing within the Ruby community. I look forward to seeing what the next ten years have in store for us.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-213520426745796358?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/213520426745796358/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=213520426745796358' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/213520426745796358'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/213520426745796358'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2010/11/10-cool-things-from-rubyconf-x.html' title='10 Cool Things From RubyConf X'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-2712334562692980713</id><published>2010-03-24T09:44:00.000-07:00</published><updated>2010-03-24T10:20:02.143-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AdaLovelaceDay10'/><category scheme='http://www.blogger.com/atom/ns#' term='female programmers'/><category scheme='http://www.blogger.com/atom/ns#' term='AdaLovelaceDay2010'/><title type='text'>Happy Ada Lovelace Day 2010</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_SgxaAaUGqzY/S6pHhWPdGII/AAAAAAAAB0o/i-TEbxPEVK4/s1600/barbie-programmer.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 200px;" src="http://3.bp.blogspot.com/_SgxaAaUGqzY/S6pHhWPdGII/AAAAAAAAB0o/i-TEbxPEVK4/s200/barbie-programmer.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5452248937117063298" /&gt;&lt;/a&gt;Once again, it is &lt;a href="http://en.wikipedia.org/wiki/Ada_Lovelace"&gt;Lady Ada Lovelace&lt;/a&gt; day, and time for me to celebrate some women software developers that I know personally. This year I want to call out four women that I have especially noticed their knowledge and dedication. In no particular order...&lt;br /&gt;&lt;br /&gt;First, a big shout out to Sarah Mei (&lt;a href="http://twitter.com/sarahmei"&gt;@sarahmei&lt;/a&gt;). Sarah is a founder of &lt;a href="http://railsbridge.org/"&gt;RailsBridge&lt;/a&gt;, a non-profit organization dedicated to helping people learn about and make use of Ruby on Rails. She is also a conference speaker who has been going around hyping up the community about one of the subjects most near and dear to my heart: teaching kids programming.&lt;br /&gt;&lt;br /&gt;Next, a special thanks to Sonia Ramirez, my colleague at &lt;a href="http://hybridgroup.com"&gt;our Los Angeles based software development consultancy The Hybrid Group&lt;/a&gt;. Sonia is a tireless and detail oriented software developer. She is always eager to learn, and brings a great sense of humor to all of her work with us.&lt;br /&gt;&lt;br /&gt;Third, a special thanks to &lt;a href="http://www.chariotsolutions.com/"&gt;Andrea O.K. Wright&lt;/a&gt;. Andrea has been a very active member of the Ruby community, and has given a number of presentations, must recently an incredibly ambitious overview of NoSQL databases at RubyConf 2009.&lt;br /&gt;&lt;br /&gt;And rounding out this small sampling of the XX chromosome-based programming talent, is a new acquaintance Sarah Allen (&lt;a href="http://twitter.com/ultrasaurus"&gt;@ultrasaurus&lt;/a&gt;). Sarah is also involved with the RailsBridge project, and is a mobile software developer who has published several projects based on the &lt;a href="http://rhomobile.com/"&gt;Rhodes&lt;/a&gt; framework. She is also a conference speaker, and published the RubyConf mobile application that we all made use of at &lt;a href="http://www.larubyconf.com/"&gt;LARubyConf&lt;/a&gt; earlier this year.&lt;br /&gt;&lt;br /&gt;These persons of the female gender are merely a small sampling of the awesomeness that exists within the Ruby community. They just happen to be ladies that I have either worked with, or benefited from their contributions directly.&lt;br /&gt;&lt;br /&gt;Thank you all, and have a great Ada Lovelace Day. And get back to some coding!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-2712334562692980713?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/2712334562692980713/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=2712334562692980713' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/2712334562692980713'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/2712334562692980713'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2010/03/happy-ada-lovelace-day-2010.html' title='Happy Ada Lovelace Day 2010'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_SgxaAaUGqzY/S6pHhWPdGII/AAAAAAAAB0o/i-TEbxPEVK4/s72-c/barbie-programmer.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-6332147648169304608</id><published>2010-03-04T10:30:00.000-08:00</published><updated>2010-03-04T10:36:58.654-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='ruby on rails'/><category scheme='http://www.blogger.com/atom/ns#' term='engine yard'/><category scheme='http://www.blogger.com/atom/ns#' term='ec2'/><category scheme='http://www.blogger.com/atom/ns#' term='ey-cloud'/><title type='text'>Configuring Hybrid Ruby on Rails Applications On EY-Cloud</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm3.static.flickr.com/2081/2219708271_ec0bb4cb80.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 250px; height: 333px;" src="http://farm3.static.flickr.com/2081/2219708271_ec0bb4cb80.jpg" border="0" alt="" /&gt;&lt;/a&gt;This last weekend, we completed migration of a slightly more complex Ruby on Rails application than the usual to &lt;a href="http://www.engineyard.com/products/cloud/features"&gt;Engine Yard's EY-Cloud&lt;/a&gt;. It took a few tries, and a tiny bit of research, before we completely understood what to do to get it up and running with all of the needed capabilities. Naturally this was due to gaps in my own knowledge, and I wanted to post about what I had learned, and how awesome EY-Cloud really is!&lt;br /&gt;&lt;br /&gt;If you do not know about it, EY-Cloud is Engine Yard's cloud platform that is based on &lt;a href="http://aws.amazon.com/ec2/"&gt;Amazon's EC2&lt;/a&gt;. Readers of this blog know I am not afraid to &lt;a href="http://deadprogrammersociety.blogspot.com/search/label/ec2"&gt;get hardcore when it comes to EC2 server configurations&lt;/a&gt;, and with EY-Cloud I feel like I can now get the best of everything. But I am getting ahead of myself.&lt;br /&gt;&lt;br /&gt;Let me briefly describe the architecture of the application I was migrating. The main application is written in Ruby on Rails and uses MySQL as its data store. The app provides UI and an API for interactions with the application, mostly called by a &lt;a href="http://phonegap.com"&gt;custom iPhone app written using PhoneGap&lt;/a&gt;. The main app is secured using an SSL certificate. In addition, a separate API for a specific high-performance capability is written using Sinatra and DataMapper. This "special API" is also secured via SSL.&lt;br /&gt;&lt;br /&gt;OK, you got that? Perhaps not, so here is a diagram to illustrate what I am talking about:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.gliffy.com/pubdoc/2008066/M.png"&gt;&lt;img style="display:block; margin:0px auto 10px;cursor:pointer; cursor:hand;width: 525px; height: 406px;" src="http://www.gliffy.com/pubdoc/2008066/M.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;We call this kind of application a "hybrid" application, meaning that it is built using Ruby on Rails + "something else". For this app, the "something else" is Sinatra + DataMapper.&lt;br /&gt;&lt;br /&gt;The previous installation used the same basic setup, but was created manually using hand-configured EC2 instances. This required a lot more management to keep the application going, and especially to add or remove instances to the cluster. Backing up the entire configuration by creating custom AMI's was also very labor intensive.&lt;br /&gt;&lt;br /&gt;This was the scenario that led us to wish to migrate the app from raw EC2 to EY-Cloud. So if you are planning to set something like this up yourself, here are my notes to share my experience migrating a hybrid Ruby on Rails application to EY-Cloud.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Prerequisites&lt;/b&gt;&lt;br /&gt;You need to have an account setup with Engine Yard for EY-Cloud. In addition, you should have installed the Elasticfox plugin for Firefox to easily administer the security groups. You can also do this via the command line, but it is a lot more effort.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Configure Main Environment &amp; Application&lt;/b&gt;&lt;br /&gt;Configuring your main application for EY-Cloud is a pretty simple process. It basically requires setting up private key access to the git repository and the application settings using the web based interface that Engine Yard provides. There is a complete &lt;a href="https://cloud-support.engineyard.com/faqs/overview/getting-started-with-engine-yard-cloud"&gt;article that describes this in detail here&lt;/a&gt;. The main steps are:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Create main environment&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Create main application and configure access to its git repo&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Config ssh key you will use to connect to instances&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Add ssl certificate, and config main app to use it&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Config any needed gems and unix packages to be used by main app&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Launch app server and separate database server in main environment&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Configure Secondary Environment &amp; Application&lt;/b&gt;&lt;br /&gt;Now you are ready to configure the environment and application for the other public accessible SSL protected service that is part of the application. This needs to be a secondary application because EY-Cloud currently only allows a single SSL cert per environment, and only allows you to associate it with one application. Hence needing a second environment configured. The main steps are:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Create specialapi environment&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Create specialapi application and configure access to its git repo&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Config ssh key you will use to connect to specialapi instances&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Add ssl certificate, and config specialapi app to use it&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Config any needed gems and unix packages to be used by specialapi app&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Launch specialapi app in specialapi environment. No database is necessary.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Copy contents of database.yml from /data/mainapp/shared/config/database.yml on "main app" server to /data/specialapi/shared/config/database.yml on "specialapi" server. Yes, you will need to use SSH to login to both servers.&lt;br /&gt;&lt;li&gt;Use keep file on the database.yml location on the specialapi environment to point to the master database in the main app environment. &lt;a href="https://cloud-support.engineyard.com/faqs/questions/making-changes-to-nginx-apache-or-monit-configs-with-keep-files"&gt;This page explains about keep files&lt;/a&gt;.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;EC2 Security Configuration&lt;/b&gt;&lt;br /&gt;In order to allow the secondary environment to get access to the database located in the main environment, you need to make a small but critical change to the configuration in the EC2 Security Groups. Otherwise the internal firewall at Amazon will not allow the application to access the database. It is very easy to configure this using Elasticfox. Here is how:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Setup your EC2 security credentials for your EY-cloud account. You can download them as part of the ey-cloud.yml file&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Once you are connected to that account using elasticfox, click on the "Security Groups" tab. You should see 3 security groups "default", one for the main app named something similar to "ey-myapp_production-12341234" that refers to the main environment, and another one named something like "ey-secondaryapp_production-56785678" that refers to the secondary environment&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Click on the "ey-myapp_production-12341234" group in the left pane labeled "Your Groups" then click on the green checkmark icon at the top of the "Group Permissions" pane. This will bring up the "Add New Permission For Security Group" dialog. Click on the "Group" tab, then choose the "ey-secondaryapp_production-56785678" group from the Groups dropdown, and click on the "Add" button. Your secondary environment should now be able to access the main environment's database&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;br /&gt;It is pretty great to be able to take advantage of both the cool management interface and scalable clustered database and application stack, as well as being able to get down and dirty via SSH, something you really do need in order to configure more complex hybrid Ruby on Rails applications. EY-Cloud provides this kind of capability, and is certainly a lot easier than managing it all yourself. Hopefully, these notes will make it easier for you to migrate your own complex application. Please let me know how it works for you.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-6332147648169304608?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/6332147648169304608/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=6332147648169304608' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/6332147648169304608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/6332147648169304608'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2010/03/configuring-hybrid-ruby-on-rails.html' title='Configuring Hybrid Ruby on Rails Applications On EY-Cloud'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm3.static.flickr.com/2081/2219708271_ec0bb4cb80_t.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-6421910172039057879</id><published>2010-02-22T11:40:00.000-08:00</published><updated>2010-02-22T11:54:46.771-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='los angeles rubyconf'/><title type='text'>I Was A Guest Blogger At LARubyConf 2010</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://jeanonjean.files.wordpress.com/2009/08/reporter-the-philadelphia-story.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 177px; height: 223px;" src="http://jeanonjean.files.wordpress.com/2009/08/reporter-the-philadelphia-story.jpg" border="0" alt="" /&gt;&lt;/a&gt;Longtime readers of this blog know that I can really get into writing about Ruby conferences, and I had a great time this last weekend at &lt;a href="http://larubyconf.com"&gt;LARubyConf 2010&lt;/a&gt;. This time, I got to try some thing new: I was guest blogging the conference for &lt;a href="http://www.thebitsource.com"&gt;TheBitSource&lt;/a&gt;, which has been providing some great coverage of other tech events like &lt;a href="http://www.pycon.org/"&gt;PyCon&lt;/a&gt; and &lt;a href="http://www.socallinuxexpo.org"&gt;SCALE&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.thebitsource.com/tech-conferences/larubyconf-2010-a-ruby-in-the-sun/"&gt;Please check out my complete recap from the 2nd annual Los Angeles Ruby Conference LARubyConf 2010 here&lt;/a&gt;. And thanks!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-6421910172039057879?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/6421910172039057879/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=6421910172039057879' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/6421910172039057879'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/6421910172039057879'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2010/02/i-was-guest-blogger-at-larubyconf-2010.html' title='I Was A Guest Blogger At LARubyConf 2010'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-419857232998880498</id><published>2010-01-18T08:30:00.000-08:00</published><updated>2010-01-18T08:32:13.612-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='git'/><category scheme='http://www.blogger.com/atom/ns#' term='phonegap'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Crossing The PhoneGap For Multiplatform Mobile Applications</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.elvincountry.com/travel-images/02802741.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 214px; height: 185px;" src="http://www.elvincountry.com/travel-images/02802741.jpg" border="0" alt="" /&gt;&lt;/a&gt;I had first heard of the &lt;a href="http://phonegap.com/"&gt;PhoneGap&lt;/a&gt; open source framework for multiplatform mobile development last year at the &lt;a href="http://futureruby.com/"&gt;FutureRuby&lt;/a&gt; conference in Toronto. Honestly, I did not really concentrate on all they were saying at the time, and in the flurry of info including back-to-back mobile sessions with &lt;a href="http://rhomobile.com/"&gt;Rhomobile&lt;/a&gt;, I did not fully retain a clear picture of what they had to offer. My bad.&lt;br /&gt;&lt;br /&gt;It was not until late last year, while working on plans for a very cool mobile application, that I was reminded about PhoneGap by one of my colleagues. After a brief evaluation of their benefits vs. the other multiplatform options, we decided to use PhoneGap on this particular project. We have made some amazing progress with using PhoneGap for mobile development since then, and I thought I would share a few of the lessons learned.&lt;br /&gt;&lt;br /&gt;First of all, a quick explanation of how PhoneGap works. &lt;a href="http://blogs.nitobi.com/jesse"&gt;Jesse MacFadyen&lt;/a&gt;, one of the programmers at &lt;a href="http://nitobi.com/"&gt;Nitobi&lt;/a&gt;, the primary developers of PhoneGap, has a &lt;a href="http://blogs.nitobi.com/jesse/2009/11/04/phonegap-for-iphone-exposed/"&gt;good blog post&lt;/a&gt; where he breaks down how the PhoneGap framework works on iPhone. Here is my much condensed take on what he is saying.&lt;br /&gt;&lt;br /&gt;All of the mobile platforms supported by PhoneGap have some kind of web browser control. A PhoneGap application is a packaged up application which is a webpage or mini-website, that executes inside whatever web browser control is available on that platform. Add in a standard JavaScript API to a wrapper that accesses the device-specific functionality like GPS or the accelerometer, and you can hook up the JavaScript on your "page" to the hardware. &lt;br /&gt;&lt;br /&gt;But don't make the mistake of thinking you should just slap together some web pages formatted for mobile. Rather, you can and must think of it as an application that is written in the form of a single web page with a bunch of JavaScript. To access server data, you will need to write some AJAX code to access the remote resources, then update your UI accordingly. The good news is you can use familiar JavaScript libraries such as &lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt; to do so. We chose &lt;a href="http://www.jqtouch.com/"&gt;jqTouch&lt;/a&gt; to get a very iPhone-like UI.&lt;br /&gt; &lt;br /&gt;The PhoneGap framework is under very active development. New code is being committed to their &lt;a href="http://github.com/phonegap/phonegap"&gt;github repo&lt;/a&gt; frequently. As such, you really do need to have git installed, and some working knowledge of how to use it, to get things setup.&lt;br /&gt;&lt;br /&gt;In fact, the device specific functionality for each platform is contained within the main PhoneGap git repository as a series of git submodules such as &lt;a href="http://github.com/phonegap/phonegap-iphone"&gt;phonegap-iphone&lt;/a&gt;, &lt;a href="http://github.com/phonegap/phonegap-android"&gt;phonegap-android&lt;/a&gt;, etc. This makes it all but impossible to install the latest and greatest without git. Being a git user myself, this does not pose any problem, and if you are not gitmotized yet, this is an ideal time to become so.&lt;br /&gt;&lt;br /&gt;Here are the series of steps I followed to create my own PhoneGap project...&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Prerequisites&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Install iPhone SDK (yes, you must join the iPhone developer program)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Install Android SDK (&lt;a href="http://www.talkandroid.com/android-sdk-install-guide/"&gt;http://www.talkandroid.com/android-sdk-install-guide/&lt;/a&gt; has some good instructions. I am not using Eclipse, so I skipped all that)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Install Apache Ant (sudo port install apache-ant)&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Install PhoneGap&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Get latest PhoneGap (git clone git://github.com/phonegap/phonegap.git)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Get submodules for iPhone &amp; Android (cd phonegap &amp;&amp; git submodule update)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Build iPhone Lib and install&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Build Android libs&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Setting Up A New Multiplatform PhoneGap Project&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Create a new iPhone project using the phonegap-iphone template. The www directory in the new project will be becoming the shared part of your project, with all your UI and application logic&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Create the Android project using the phonegap-android build script. Use the www directory from the iphone project as the www-dir param. You will be replacing this with a reference to the git submodule&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Create a new git repo in the www directory in the iPhone project, and commit all the files in the www directory&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Change directories to the parent of where you want to put the directory for the shared git repo, then clone the repo located at /path/to/iphoneproj/www to /path/to/sharedrepo. You may also want to create a remote branch at this point for the new shared repo&lt;/li&gt; &lt;br /&gt;&lt;li&gt;Remove the www directory from the iPhone project&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Create a new git repo in the iphone project directory, then commit all files. You may also want to create a remote branch at this point&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Put the shared code into the iPhone project by using "git submodule add" to put a reference to the shared repo into /path/to/iphoneproj/www&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Create a new git repo in the Android project directory, then commit all files. You may also want to create a remote branch at this point, as you probably did for the iPhone project files&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Remove the /path/to/androidproj/assets/www directory from the Android project, and use "git submodule add" to put a reference to the shared repo at /path/to/androidproj/assets/www&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;You now should have 3 git repos, with the shared code, the iPhone specific project code, and the Android specific project code, each in their respective places. Much easier and nicer to work on.&lt;br /&gt;&lt;br /&gt;Anyhow, I hope this info is useful to any PhoneGap developers that want to get things setup cleanly for multi-platform mobile programming. Please let me know any feedback or improvements that people out there come up with, for this neat open source framework for doing JavaScript-based mobile development.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-419857232998880498?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/419857232998880498/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=419857232998880498' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/419857232998880498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/419857232998880498'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2010/01/crossing-phonegap-for-multiplatform.html' title='Crossing The PhoneGap For Multiplatform Mobile Applications'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-7253915096983624286</id><published>2010-01-12T12:12:00.000-08:00</published><updated>2010-01-12T12:29:46.352-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='sparkline'/><category scheme='http://www.blogger.com/atom/ns#' term='ruby on rails'/><category scheme='http://www.blogger.com/atom/ns#' term='charting'/><title type='text'>Sparkline Some Interest With Ruby on Rails</title><content type='html'>&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 250px; height: 188px;" src="http://farm1.static.flickr.com/29/62568004_cb569e408c.jpg" border="0" alt="" /&gt;Recently, I added some &lt;a href="http://en.wikipedia.org/wiki/Sparkline"&gt;sparkline&lt;/a&gt; graphs to a Ruby on Rails application. A sparkline is a very small graphic that displays a large amount of information, typically shown over time, and usually embedded in some other text. Invented by the father of modern infographics &lt;a href="http://www.edwardtufte.com"&gt;Edward Tufte&lt;/a&gt;, the sparkline has become a fixture of many online applications that want to visually display some stats in a simple, integrated way.&lt;br /&gt;&lt;br /&gt;When it come to adding sparklines into a Ruby on Rails application, there are a couple of different options. You can chart the data on the server, output being an image file. You can also chart the data on the client, with a couple of different JavaScript libraries as available options.&lt;br /&gt;&lt;br /&gt;I started my plan, intending to implement my charts on the client-side. The project that appears to have the most flexibility, speed, and options, is an amazing jQuery plugin called &lt;a href="http://omnipotent.net/jquery.sparkline/"&gt;jQuery Sparkline&lt;/a&gt;. Unfortunately, the project to which I needed to add the sparklines is a bit older, and does not use jQuery. As a result, I was not able to use jQuery Sparkline for this current project.&lt;br /&gt;&lt;br /&gt;Another interesting JavaScript sparkline library is &lt;a href="http://github.com/lethain/sparklines.js"&gt;lethain's Sparkline.js&lt;/a&gt;, but it has not been updated in some time, and is not compatible with current Internet Explorer versions. There is also an interesting looking newer lib &lt;a href="http://github.com/topfunky/topfunky-sparkline-js"&gt;topfunky-sparkline-js&lt;/a&gt; but I have not tried it out yet. &lt;br /&gt;&lt;br /&gt;So that brings us to server-side sparkline generation. If you are using ImageMagick/RMagick then @topfunky once again provides, with the Ruby &lt;a href="http://github.com/topfunky/sparklines"&gt;sparklines gem&lt;/a&gt;. This gem provides lots of options for doing all sorts of fancy sparklines.&lt;br /&gt;&lt;br /&gt;In my case, I am not using ImageMagick for anything else, so I did not want to install it just for this. What I really wanted was something much lighter-weight, and I was willing to accept a lot fewer options to get it. &lt;br /&gt;&lt;br /&gt;It turns out that &lt;a href="http://twitter.com/madrobby"&gt;madrobby&lt;/a&gt; has written a library for generating very simple sparklines in pure Ruby code, called &lt;a href="http://github.com/madrobby/spark_pr"&gt;spark_pr&lt;/a&gt;. The project uses _why's pure Ruby implementation of a PNG generator to do the low-level work. &lt;br /&gt;&lt;br /&gt;spark_pr has also spawned an interesting application of it from &lt;a href="http://twitter.com/technoweenie"&gt;@technoweenie&lt;/a&gt; called &lt;a href="http://rack-sparklines.heroku.com/"&gt;Sparkplug&lt;/a&gt;, which is a Rack module that generates spaklines from CSV data on the fly, using Rack handlers and Rack caching.&lt;br /&gt;&lt;br /&gt;Once I had seen Sparkplug's minimal elegance, it seemed spark_pr was the option for me. I decided to incorporate spark_pr into my application. Given that the app was written with a dedicated approach to keeping a clean RESTful interface, and that the database already contained the time-series data, it was quite easy to incorporate. Here is what I had to do:&lt;br /&gt;&lt;br /&gt;Step 1: Put spark_pr.rb file into lib directory. I just grabbed the code from the repo, and dropped it into my project. You may decide to have a more sophisticated way to do it, such as using git submodules.&lt;br /&gt;&lt;br /&gt;Step 2: &lt;pre&gt;require "spark_pr"&lt;/pre&gt; in your controller&lt;br /&gt;&lt;br /&gt;Step 3: &lt;pre&gt;include Spark&lt;/pre&gt; in your controller&lt;br /&gt;&lt;br /&gt;Step 4: Add PNG format to controller action that was already returning my time-series data, and return the sparkline PNG data:&lt;br /&gt;&lt;script src="http://gist.github.com/275414.js"&gt;&lt;/script&gt;&lt;br /&gt;Note that this controller action is already returning XML or JSON. PNG is just another format to be added, if you have a well-designed RESTful controller action.&lt;br /&gt;&lt;br /&gt;Step 5: Put image_tag that requests the sparkline PNG image file into the view where you want it to appear, like this one:&lt;br /&gt;&lt;script src="http://gist.github.com/275578.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Voila! Refresh that view and you should now be looking at your ultra-hipster-chic sparkline graph. It is surprising how much more information comprehension a person has, when they are seeing a visual representation of their data. Plus it looks cool.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-7253915096983624286?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/7253915096983624286/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=7253915096983624286' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/7253915096983624286'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/7253915096983624286'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2010/01/sparkline-some-interest-with-ruby-on.html' title='Sparkline Some Interest With Ruby on Rails'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm1.static.flickr.com/29/62568004_cb569e408c_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-1775093734666498918</id><published>2009-12-31T09:07:00.000-08:00</published><updated>2010-01-01T10:08:52.142-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='code2009'/><title type='text'>Thanks For A Great #code2009</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://edibleink.files.wordpress.com/2009/11/champagne2-1.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 279px;" src="http://edibleink.files.wordpress.com/2009/11/champagne2-1.jpg" border="0" alt="" /&gt;&lt;/a&gt;It has been an amazing year for both personal and professional code development.&lt;br /&gt;&lt;br /&gt;Starting with the inspiration to begin &lt;a href="http://flyingrobo.com"&gt;Project Flying Robot&lt;/a&gt;, to the prestige of presenting at &lt;a href="http://www.larubyconf.com/"&gt;LARubyConf&lt;/a&gt;, &lt;a href="http://futureruby.com/"&gt;FutureRuby&lt;/a&gt;, &lt;a href="http://twtrcon.com/"&gt;TWTRCON&lt;/a&gt;, &lt;a href="http://ignite.oreilly.com/"&gt;IgniteLA&lt;/a&gt;, &lt;a href="http://parnassusgroup.com/twitterconference/"&gt;140 The Twitter Conference&lt;/a&gt;, &lt;a href="http://www.rubyconf.org/"&gt;RubyConf&lt;/a&gt;, and &lt;a href="http://www.conferenciarails.org/"&gt;Conferencia Rails&lt;/a&gt;, and lastly the year-end fun of starting out the ongoing &lt;a href="http://search.twitter.com/search?q=%23code2009"&gt;#code2009&lt;/a&gt; Twitter meme, so popular that it spawned a couple of mashups and got picked up by &lt;a href="http://news.ycombinator.com/item?id=1023432"&gt;Hacker News&lt;/a&gt; and uber-language blog &lt;a href="http://lambda-the-ultimate.org/node/3749"&gt;Lambda the Ultimate&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;In between were numerous meetups, hackfests, code jams, code dojos, pull requests, and casual codeslinging with friends. And the &lt;a href="http://www.makerfaire.com/"&gt;Maker Faire&lt;/a&gt;! &lt;br /&gt;&lt;br /&gt;To everyone who welcomed me, listened to me, helped me, or taught me something, I am indeed grateful. Thank you. Let's do this 2010 thing right!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-1775093734666498918?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/1775093734666498918/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=1775093734666498918' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/1775093734666498918'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/1775093734666498918'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2009/12/thanks-for-great-code2009.html' title='Thanks For A Great #code2009'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-5054289144277992411</id><published>2009-11-16T08:15:00.000-08:00</published><updated>2009-11-16T08:30:05.497-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='flying robot'/><category scheme='http://www.blogger.com/atom/ns#' term='rubyconf'/><title type='text'>Flying Robot: World Tour 2009 Continues</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.kissfaq.com/tours/kiss_pctour2.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 198px; height: 250px;" src="http://www.kissfaq.com/tours/kiss_pctour2.jpg" border="0" alt="" /&gt;&lt;/a&gt;As usual, no blog posts = a lot of other activity here at Flying Robot HQ. Among other personal stuff, my brother &lt;a href="http://twitter.com/damenevans"&gt;Damen Evans&lt;/a&gt; and I have been getting ready for the last public demos of &lt;a href="http://twitter.com/flyingrobot"&gt;@flyingrobot&lt;/a&gt; for 2009. And we are going out with style! &lt;br /&gt;&lt;br /&gt;Later this week, we roll up to San Francisco to present at the prestigious &lt;a href="http://rubyconf.org"&gt;RubyConf&lt;/a&gt;! Then, next week @flyingrobot and I will fly off to Madrid, Spain, to do our first European appearance at the awesome-looking &lt;a href="http://www.conferenciarails.org/"&gt;Conferencia Rails&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Anyhow, if you have been waiting eagerly for more Flying Robot news and gadgets, be patient. We will be unveiling our mysterious cool new stuff in just a few days...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-5054289144277992411?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/5054289144277992411/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=5054289144277992411' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/5054289144277992411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/5054289144277992411'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2009/11/flying-robot-world-tour-2009-continues.html' title='Flying Robot: World Tour 2009 Continues'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-3582385944718340126</id><published>2009-10-10T11:19:00.000-07:00</published><updated>2009-10-10T17:05:31.308-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ec2'/><category scheme='http://www.blogger.com/atom/ns#' term='postgres'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>PostgreSQL on Ubuntu on EC2: Backing It All Up</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_1luLRXKoJM8/SJPNIpIJamI/AAAAAAAAGnQ/QgxlU54iRrU/s400/dean%2Bback.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 300px; height: 400px;" src="http://1.bp.blogspot.com/_1luLRXKoJM8/SJPNIpIJamI/AAAAAAAAGnQ/QgxlU54iRrU/s400/dean%2Bback.jpg" border="0" alt="" /&gt;&lt;/a&gt;This post continues what I started with &lt;a href="http://deadprogrammersociety.blogspot.com/2009/08/postgresql-on-ubuntu-on-ec2.html"&gt;"PostgreSQL on Ubuntu on EC2: The Installation Guide"&lt;/a&gt;. Once you have your PostgreSQL database server instance running, you will need to backup two different things: your database data, and the instance itself. The database data will be backed up using Elastic Block Storage (EBS) snapshots. Once we have the instance running the backups correctly, we will then create an Amazon Machine Image (AMI) that will allow you to launch a new instance to replace the database server in case it goes down.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Backing Up The Database&lt;/b&gt;&lt;br /&gt;First, we need to connect to our database server instance via SSH using the ubuntu user. &lt;br /&gt;&lt;br /&gt;We will need to install some dependencies to get our backup script to run:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;sudo apt-get install build-essential&lt;br /&gt;sudo apt-get install ruby1.8-dev&lt;br /&gt;sudo apt-get install rubygems&lt;br /&gt;sudo gem update --system&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;You will need to tweak RubyGems so that the update works correctly, as &lt;a href="http://www.videc.at/2009/04/30/rubygems-undefined-method-manage_gems-for-gemmodule-nomethoderror/"&gt;described here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Now you can install Gemcutter, which is the new ultra cool repository for gems:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;sudo gem install gemcutter&lt;br /&gt;sudo gem tumble&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Finally we are ready to install the Amazon EC2 rubygem:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;sudo gem install amazon-ec2&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Now we can create our backup script. Save this code into the ~/ directory under the name backup_database.rb. You will need to substitute the Amazon ACCESS_KEY_ID and SECRET_ACCESS_KEY, as well and entering the correct EBS volume for the DATABASE_VOLUME constant:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#!/usr/bin/env ruby&lt;br /&gt;&lt;br /&gt;  require 'rubygems'&lt;br /&gt;  require 'AWS'&lt;br /&gt;&lt;br /&gt;  ACCESS_KEY_ID = 'YOUR_ACCESS_KEY'&lt;br /&gt;  SECRET_ACCESS_KEY = 'YOUR_SECRET_ACCESS_KEY'&lt;br /&gt;  DATABASE_VOLUME = 'vol-XXXXXXXX'&lt;br /&gt;&lt;br /&gt;  puts "Starting database snapshot..."&lt;br /&gt;  ec2 = AWS::EC2::Base.new(:access_key_id =&gt; ACCESS_KEY_ID, :secret_access_key =&gt; SECRET_ACCESS_KEY)&lt;br /&gt;  ec2.create_snapshot(:volume_id =&gt; DATABASE_VOLUME)&lt;br /&gt;  puts "Database snapshot completed."&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Due to the finicky way that Ruby runs as part of a cron job, we are best off creating a shell script that then runs the Ruby backup script. Save this code into the ~/ directory under the name backup_db.sh:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#!/bin/sh  &lt;br /&gt;cd /home/ubuntu&lt;br /&gt;ruby /home/ubuntu/backup_database.rb&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Don't forget to make the backup shell script executable:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;chmod +x /home/ubuntu/backup_db.sh&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Now we just need to configure this script to run as part of a cron job, so that the backups take place automatically. The crontab command brings up the list of configured cron tasks for the current user:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;crontab -e&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;This example crontab entry runs the backup daily at midnight, but you may want it to run more frequently:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;0 0 * * * /home/ubuntu/backup_db.sh&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;At this point, you should have a fully functional automated backup system. Verify after midnight that the script has run as you expect, by looking to see if a new snapshot has been created, using Elastifox or however you administrate your EC2 instances.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Creating The AMI&lt;/b&gt;&lt;br /&gt;Creating the AMI to backup the entire database instance is pretty easy. First, you need to upload the PEM files. Remember you are authenticating as the "ubuntu" user:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;scp -i id_rsa-gsg-keypair pk-YOUR.pem cert-YOUR.pem ubuntu@domU-12-34-31-00-00-05.usma1.compute.amazonaws.com:&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Use your SSH connection into the database server instance to copy the PEM files to the /mnt directory:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;sudo cp /home/ubuntu/*.pem /mnt&lt;br /&gt;&lt;/code&gt; &lt;br /&gt;&lt;br /&gt;Now create the bundle. Make sure you use your Amazon account number (without dashes) as the value for the -u parameter. This can take quite a while, so do not get impatient:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;sudo ec2-bundle-vol -d /mnt -k /mnt/pk-YOUR.pem -c /mnt/cert-YOUR.pem  -r i386 -u YOURUSERACCOUNTNUMBER&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;You can now upload the bundle to your Amazon S3 account, in preparation for making available as an AMI. Use something versioned for the -b parameter which is the name of the bundle:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;sudo ec2-upload-bundle -b my-database-server-1.0-ami -m /mnt/image.manifest.xml -a YOUR_ACCESS_KEY -s YOUR_SECRET_ACCESS_KEY&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Final step is going back to your local machine, and making the newly created bundle available to be used to start a new instance:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;ec2-register my-database-server-1.0-ami/image.manifest.xml&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;You can now now launch a brand new database server instance based on this AMI, and it will be a clone of your existing database server. This is the procedure you would follow if you need to restore your database server instance from backups.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Restoring Your Database Server From The Backups&lt;/b&gt;&lt;br /&gt;In the case that something goes terribly terribly wrong, you can get back to normal as follows:&lt;br /&gt;- startup a new EBS volume from your most recent snapshot backup, &lt;br /&gt;- start up a new server from your database AMI&lt;br /&gt;- configure your new server instance to use the new volume started from the backup data&lt;br /&gt;- switch your elastic IP to point to the new server, or update the references in your application to point to the new server&lt;br /&gt;&lt;br /&gt;This concludes part 2 of the great PostgreSQL config post for the EC2 cloud. Hopefully it will help you with a nice simple way to take the basic PostgreSQL instance that you got up and running on Ubuntu/EC2 using the directions in the &lt;a href="http://deadprogrammersociety.blogspot.com/2009/08/postgresql-on-ubuntu-on-ec2.html"&gt;part 1 post&lt;/a&gt;, and add the confidence that backed up data and a completely reproducible configuration provides.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-3582385944718340126?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/3582385944718340126/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=3582385944718340126' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/3582385944718340126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/3582385944718340126'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2009/10/postgresql-on-ubuntu-on-ec2-backing-it.html' title='PostgreSQL on Ubuntu on EC2: Backing It All Up'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_1luLRXKoJM8/SJPNIpIJamI/AAAAAAAAGnQ/QgxlU54iRrU/s72-c/dean%2Bback.jpg' height='72' width='72'/><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-3900586409889958729</id><published>2009-09-13T15:42:00.000-07:00</published><updated>2009-09-13T16:32:49.086-07:00</updated><title type='text'>Happy 200 Posts: My 10 Personal Favorites</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://kedarvideo.files.wordpress.com/2008/08/47000-candles.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 267px; height: 151px;" src="http://kedarvideo.files.wordpress.com/2008/08/47000-candles.jpg" border="0" alt="" /&gt;&lt;/a&gt;I was shocked to discover this morning that this is to be my 200th blog post. Wow! It has been a good run so far since I restarted the Dead Programmer Society in 2006, and I really appreciate the awesome feedback and support that I have received from the community.&lt;br /&gt;&lt;br /&gt;To commemorate this personal event, here is a list of my top 10 favorite posts, in no particular order:&lt;br /&gt;&lt;br /&gt;1. &lt;a href="http://deadprogrammersociety.blogspot.com/2007/05/i-would-rather-be-jazz-programmer.html"&gt;"I'd Rather Be A Jazz Programmer"&lt;/a&gt;&lt;br /&gt;2. &lt;a href="http://deadprogrammersociety.blogspot.com/2009/05/fear-and-loathing-at-railsconf-2009.html"&gt;"Fear And Loathing At RailsConf 2009"&lt;/a&gt;&lt;br /&gt;3. &lt;a href="http://deadprogrammersociety.blogspot.com/2006/10/programming-zombies-will-crush-you.html"&gt;"Programming Zombies Will Crush You"&lt;/a&gt;&lt;br /&gt;4. &lt;a href="http://deadprogrammersociety.blogspot.com/2009/03/twitter-1-2-3-rule.html"&gt;"The Twitter 1-2-3 Rule"&lt;/a&gt;&lt;br /&gt;5. &lt;a href="http://deadprogrammersociety.blogspot.com/2008/04/goldilocks-and-three-icons.html"&gt;"Goldilocks and the Three Icons"&lt;/a&gt;&lt;br /&gt;6. &lt;a href="http://deadprogrammersociety.blogspot.com/2008/01/money-in-ghetto.html"&gt;"Money In The Ghetto"&lt;/a&gt;&lt;br /&gt;7. &lt;a href="http://deadprogrammersociety.blogspot.com/2007/03/i-speak-for-code.html"&gt;"I Speak For The Code"&lt;/a&gt;&lt;br /&gt;8. &lt;a href="http://deadprogrammersociety.blogspot.com/2007/01/folly-of-accountabalism.html"&gt;"The Folly Of Accountabalism"&lt;/a&gt;&lt;br /&gt;9. &lt;a href="http://deadprogrammersociety.blogspot.com/2006/11/planning-game-vs-crying-game.html"&gt;"The Planning Game Vs. The Crying Game"&lt;/a&gt;&lt;br /&gt;10. &lt;a href="http://deadprogrammersociety.blogspot.com/2006/10/architect-is-not-honorary-title.html"&gt;"Architect Is Not An Honorary Title"&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Once again, I thank everyone for your support, and I look forward to telling more tales from the Dead Programmer Society.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-3900586409889958729?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/3900586409889958729/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=3900586409889958729' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/3900586409889958729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/3900586409889958729'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2009/09/happy-200-posts-my-10-personal.html' title='Happy 200 Posts: My 10 Personal Favorites'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-8868741496209444248</id><published>2009-08-15T01:27:00.000-07:00</published><updated>2009-08-15T06:05:00.622-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xfs'/><category scheme='http://www.blogger.com/atom/ns#' term='ebs'/><category scheme='http://www.blogger.com/atom/ns#' term='ec2'/><category scheme='http://www.blogger.com/atom/ns#' term='postgres'/><title type='text'>PostgreSQL on Ubuntu on EC2: The Installation Guide</title><content type='html'>&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px; height: 409px;" src="http://www.popgadget.net/images/russian-doll.jpg" alt="" border="0" /&gt;For some time, I have had clients hosting a couple different applications on Amazon EC2 using Ubuntu. One of these apps uses PostgreSQL, and has been running without event for quite a while. Yesterday, I got to catch up for lost time, by spending the entire day wrestling with data recovery issues related to a failed apt-get upgrade on an important database server. Luckily, the awesome &lt;a href="http://twitter.com/esh"&gt;Eric Hammond&lt;/a&gt; was around on IRC, came to my rescue, and coached my thru my self-inflicted pain.&lt;br /&gt;&lt;br /&gt;If you are not interested in PostgreSQL, you probably just stop here. Nothing to see folks, move along. However, if you are looking for the well-lit path to getting PostgreSQL installed on Amazon EC2 will all the trimmings, read on.&lt;br /&gt;&lt;br /&gt;I went to find various web pages to use as source material, expecting since the last time I went through this, someone would have written a nice definitive guide to installing PostgreSQL on Ubuntu, running it on a dedicated instance on Amazon EC2, and using Elastic Block Storage (EBS). Naturally, you want to be using the XFS file system too. However, no such luck: just a big collection of pages of instructions on the various parts, without any nice simple path to getting things working together.&lt;br /&gt;&lt;br /&gt;Hence, this post tries to provide a set of instructions for getting things working, and avoiding a couple of problems that I have run into while running Postgres in production for the last couple years.&lt;br /&gt;&lt;br /&gt;Step 0 - You are signed up for Amazon EC2, no? If not, there are plenty of pages with instructions on how to do so.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 1 - Choose your AMI&lt;/span&gt;&lt;br /&gt;There are several AMI's available to you. I currently run Hardy 8.04 LTS x86 architecture in the USA, so I am using ami-5d59be34, but you may have other requirements. The &lt;a href="https://help.ubuntu.com/community/EC2StartersGuide"&gt;Ubuntu EC2 starter guide&lt;/a&gt; has good info on your options.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 2 - Launch your instance&lt;/span&gt;&lt;br /&gt;I like to use Elasticfox, cause I am super lazy. The command line works well, also.&lt;br /&gt;&lt;br /&gt;What size instance? This AMI supports small and medium. PostgreSQL is pretty efficient these days, and especially using a dedicated instance and not running anything but the database server improves raw database performance considerably. You would probably be pretty surprised how well a small instance can perform, but choose medium if you think you will have more significant needs.&lt;br /&gt;&lt;br /&gt;One key pattern I use for my EC2 hosted apps, is creating security groups in EC2 to separate my database servers from the public internet. I never use the default security group, but instead create a group for each tier of my application like "database", "web", "transcoder" and then allow specific groups to communicate with each other.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 3 - Create the EBS Volume&lt;/span&gt;&lt;br /&gt;You can do this via Elasticfox, or via command line. Either way, make sure you do two key things: make sure you create the EBS volume in the same availabilty zone as your database server instance, and also make sure you create a volume with enough space. Here is how you would use the command line tools to create a 10GB volume in the 'us-east-1a' zone:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;ec2-create-volume -z us-east-1a -s 10&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;One the volume is ready, attach it to the database instance. For example, this attaches an EBS volume named 'vol-VVVV1111' to the instance 'i-IIII1111' on device /dev/sdh:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;ec2-attach-volume -d /dev/sdh -i i-IIII1111 vol-VVVV1111&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 4 - Connect to the database instance&lt;/span&gt;&lt;br /&gt;You need to SSH in to configure you new instance. Remember, you cannot connect as 'root' user in Ubuntu, you need to connect using the 'ubuntu' user. &lt;a href="http://alestic.com/2009/04/ubuntu-ec2-sudo-ssh-rsync"&gt;This page&lt;/a&gt; has good details about using sudo and SSH on the official Ubuntu EC2 AMIs.&lt;br /&gt;&lt;br /&gt;OK, so now you are connected via SSH to your server. Of course, start with the usual update/upgrade:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;sudo apt-get update &amp;amp;&amp;amp; sudo apt-get upgrade -y&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 5 - Install XFS&lt;/span&gt;&lt;br /&gt;We will need to install the XFS file system. Actually, your could use some other file system, but XFS is quite mature and has good performance. Plus if you are crazy, you can scale up to a massive virtual RAID drive that will cost $4000 per month.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;sudo apt-get install -y xfsprogs&lt;br /&gt;&lt;/code&gt;&lt;span style="font-weight: bold;"&gt;Step 6 - Format the EBS volume using XFS&lt;/span&gt;&lt;br /&gt;We need to install a file system on the EBS volume before we can do anything with it. Here is an example:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;sudo modprobe xfs&lt;br /&gt;sudo mkfs.xfs /dev/sdh&lt;br /&gt;&lt;br /&gt;echo "/dev/sdh /data xfs noatime 0 0" | sudo tee -a /etc/fstab&lt;br /&gt;sudo mkdir /data&lt;br /&gt;sudo mount /data&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Now we have a /data directory that maps to our EBS volume. Anything we write to /data will be persisted, even if the database server instance itself terminates.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 7 - Install PostgreSQL&lt;/span&gt;&lt;br /&gt;Now we need to get PostgreSQL installed. &lt;a href="http://hocuspokus.net/2008/05/install-postgresql-on-ubuntu-804"&gt;This page&lt;/a&gt; has a very nice simple set of instructions on how to do that correctly for Ubuntu, but here is a synopsis especially for a headless server. First install Postgres:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;sudo apt-get install postgresql postgresql-client postgresql-contrib&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Now reset the password for the postgres account in the PostgreSQL server:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;sudo su postgres -c psql template1&lt;br /&gt;template1=# ALTER USER postgres WITH PASSWORD 'password';&lt;br /&gt;template1=# \q&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;And then change the password on the user account to match:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;sudo passwd -d postgres&lt;br /&gt;sudo su postgres -c passwd&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Now we need to modify the postgres configuration file postgresql.conf. First, to allow other machines to connect to our instance, and also to have PostgreSQL use our nice shiny /data directory.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;sudo nano /etc/postgresql/8.3/main/postgresql.conf&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Change the line containing&lt;br /&gt;&lt;code&gt;&lt;br /&gt;data_directory = '/var/lib/postgresql/8.3/main'&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;to&lt;br /&gt;&lt;code&gt;&lt;br /&gt;data_directory = '/data/main'&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Now change&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#listen_addresses = 'localhost'&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;to&lt;br /&gt;&lt;code&gt;&lt;br /&gt;listen_addresses = '*'&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;and also change&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#password_encryption = on&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;to&lt;br /&gt;&lt;code&gt;&lt;br /&gt;password_encryption = on&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Save the file, then open the pg_hba.conf file so we can control who can access the server:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;# DO NOT DISABLE!&lt;br /&gt;# If you change this first entry you will need to make sure that the&lt;br /&gt;# database&lt;br /&gt;# super user can access the database using some other method.&lt;br /&gt;# Noninteractive&lt;br /&gt;# access to all databases is required during automatic maintenance&lt;br /&gt;# (autovacuum, daily cronjob, replication, and similar tasks).&lt;br /&gt;#&lt;br /&gt;# Database administrative login by UNIX sockets&lt;br /&gt;local   all         postgres                          ident sameuser&lt;br /&gt;# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD&lt;br /&gt;&lt;br /&gt;# "local" is for Unix domain socket connections only&lt;br /&gt;local   all         all                               md5&lt;br /&gt;# IPv4 local connections:&lt;br /&gt;host    all         all         127.0.0.1/32          md5&lt;br /&gt;# IPv6 local connections:&lt;br /&gt;host    all         all         ::1/128               md5&lt;br /&gt;&lt;br /&gt;# Connections for all PCs on the subnet&lt;br /&gt;#&lt;br /&gt;# TYPE DATABASE USER IP-ADDRESS IP-MASK METHOD&lt;br /&gt;host    all         all         0.0.0.0/0          md5 # wide-open, you may want to make this more specific to your database&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 8 - Move the database files&lt;/span&gt;&lt;br /&gt;We need to stop the PostgreSQL server, move the database files to our EBS volume, then restart the server.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;sudo /etc/init.d/postgresql-8.3 stop&lt;br /&gt;sudo mv /var/lib/postgresql/8.3/main /data&lt;br /&gt;sudo /etc/init.d/postgresql-8.3 start&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;You are now running PostgreSQL on Amazon EC2 using EBS for your database, with the XFS file system. Congratulations!&lt;br /&gt;&lt;br /&gt;I will write a followup post on how to setup your database server for self-backing up using EBS snapshots, but that is all I have time for right now. Hopefully this pared-down set of instructions has been useful to you. Thanks again to Eric Hammond, and everyone else who's blogs were culled together into this post.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-8868741496209444248?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/8868741496209444248/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=8868741496209444248' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/8868741496209444248'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/8868741496209444248'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2009/08/postgresql-on-ubuntu-on-ec2.html' title='PostgreSQL on Ubuntu on EC2: The Installation Guide'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-6691150186209506511</id><published>2009-07-25T09:37:00.000-07:00</published><updated>2009-07-26T18:05:14.950-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='futureruby'/><title type='text'>The FutureRuby Revolution Will Not Be On AOL - Part 2</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.vansabbenauctions.nl/VSA25/802.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 225px; height: 320px;" src="http://www.vansabbenauctions.nl/VSA25/802.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;a href="http://futureruby.com"&gt;FutureRuby&lt;/a&gt; Day 2 began in a seemingly calm and reflective way. Coffees were sipped, and hangovers nursed. As the self-inflicted wounds from the &lt;a href="http://www.joeydevilla.com/wordpress/wp-content/uploads/2009/07/pravda_vodka_bar_3.jpg"&gt;Pravda-Vodka-Kalashnikov&lt;/a&gt; faded, &lt;a href="http://twitter.com/peteforde"&gt;Pete Forde&lt;/a&gt;, our leader and spiritual adviser, began a short sermon.&lt;br /&gt;&lt;br /&gt;His message was simple: Vegas is a horrible place to hold &lt;a href="http://railsconf.com"&gt;RailsConf&lt;/a&gt;. And we should live in a manner that follows the &lt;a href="http://www.amazon.com/Four-Agreements-Practical-Personal-Freedom/dp/1878424319"&gt;"Four Agreements"&lt;/a&gt;. Seriously, yes, he said both of these things.&lt;br /&gt;&lt;br /&gt;Pete told us of the source of his sudden enlightenment: &lt;a href="http://www.jupiterhotel.com/"&gt;Portland's Jupiter Hotel&lt;/a&gt;. Instead of a Gideon bible, they have copy of Four Agreements in each room. Pete, being a curious guy, started to read the book. To save us time, he summarized it in nice Twitter-sized chunks.&lt;br /&gt;&lt;br /&gt;1. Use your words for good... do not gossip&lt;br /&gt;2. Do not take anything personally&lt;br /&gt;3. Do not make assumptions&lt;br /&gt;4. Always try your best&lt;br /&gt;&lt;br /&gt;With our spiritual bootstrapping complete, we proceeded to have a consciousness-expanding session from Collin Miller presentation called "Transc/Ending Encoding". This was NOT about video encoding.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://twitter.com/collintmiller"&gt;Collin Miller&lt;/a&gt; - "Transc/Ending Encoding"&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;If the 60's revolt gave the counterculture heroes like &lt;a href="http://en.wikipedia.org/wiki/Timothy_Leary"&gt;Leary&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Albert_Hofmann"&gt;Hoffman&lt;/a&gt;, it gave us tech heroes like &lt;a href="http://en.wikipedia.org/wiki/Douglas_Engelbart"&gt;Englebart&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Alan_Kay"&gt;Kay&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;When writing software, we edit text files. We use textual encoding is a way to flatten down information to a simpler structure. But what does editing text lack? There are other options to make programs without text.&lt;br /&gt;&lt;br /&gt;There is this high priesthood of text, however, programming does not need to be difficult to be useful. The future is the ONLY frontier... so where are we as programmer-monks going?&lt;br /&gt;&lt;a href="http://twitter.com/martinfowler"&gt;&lt;br /&gt;Martin Fowler&lt;/a&gt; has his concept of "&lt;a href="http://www.martinfowler.com/bliki/IllustrativeProgramming.html"&gt;illustrative programming&lt;/a&gt;". As another example, a spreadsheet is non-textual programming.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Charles_Simonyi"&gt;Charles Simonyi&lt;/a&gt;'s &lt;a href="http://en.wikipedia.org/wiki/Intentional_programming"&gt;Intentional Programming&lt;/a&gt; in a different approach. It allows users to change names easily, or even program in two different natural languages. It does this by maintaining a constant set of references to everything in program. By doing this, different users can edit the same source database, without using the same editing style.&lt;br /&gt;&lt;br /&gt;Another example is Subtext (&lt;a href="http://www.subtextual.org/"&gt;http://www.subtextual.org/&lt;/a&gt;). In Subtext, everything is just a reference. It is like "googling the code". Subtext uses decision tables, and a syntax tree editor.&lt;br /&gt;&lt;br /&gt;It was a very interesting talk, and it seems like many people were inspired to think differently about code. I was having &lt;a href="http://www.smalltalk.org"&gt;Smalltalk&lt;/a&gt; flashbacks, and my brother &lt;a href="http://twitter.com/damenevans"&gt;Damen Evans&lt;/a&gt; was reminiscing about how cool &lt;a href="http://en.wikipedia.org/wiki/HyperCard"&gt;HyperCard&lt;/a&gt; used to be.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://twitter.com/drnic"&gt;Dr. Nic&lt;/a&gt; - "Living with 1000 Open Source Projects"&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Next up was "Dr. Nic" aka Dr. Nic Williams who is actually a PhD in CS, so not just granting himself an honorarium. His talk was called "Living with 1000 Open Source Projects". I have heard Dr. Nic speak before, and he is a very intelligent and funny speaker.&lt;br /&gt;&lt;br /&gt;There are two types of open source project founders:&lt;br /&gt;Type A. Nurture and converse "Do you care?"&lt;br /&gt;Type B. People who were previously type A&lt;br /&gt;&lt;br /&gt;"Who ever looked at their old code and thought 'that's better than what I write now'?"&lt;br /&gt;&lt;br /&gt;If you look after your old projects, you will end up with 500/hr. week of projects&lt;br /&gt;&lt;br /&gt;"Open source projects don't scale, but neither does raising pets and children"&lt;br /&gt;&lt;br /&gt;The question is which OSS projects to maintain? The pet projects you NEED every day&lt;br /&gt;&lt;br /&gt;Goal: ZERO maintenance&lt;br /&gt;&lt;br /&gt;How to reduce bad karma from "abandoning" your project:&lt;br /&gt;- publish project status&lt;br /&gt;- facilitate group therapy&lt;br /&gt;- forward emails to mailing list&lt;br /&gt;&lt;br /&gt;Put a badge on project home page that says last time someone contributed to the project&lt;br /&gt;&lt;br /&gt;Aim for community to be self-sufficient&lt;br /&gt;&lt;br /&gt;&lt;a href="http://github.com"&gt;Github&lt;/a&gt; makes things easier with centralized patches. The &lt;a href="http://github.com/defunkt/github-gem/tree/master"&gt;github gem&lt;/a&gt; is great for laziness.&lt;br /&gt;&lt;br /&gt;"Easy to give away commit rights, if you think 'this is not MY project, I just look after it'"&lt;br /&gt;&lt;br /&gt;Aim: ZERO process cost&lt;br /&gt;&lt;br /&gt;Aim for Zero&lt;br /&gt;- don't use it? do not maintain it&lt;br /&gt;- manage expectations&lt;br /&gt;- community self-sufficient&lt;br /&gt;- zero process cost&lt;br /&gt;- zero defects&lt;br /&gt;&lt;br /&gt;How to use your spare time&lt;br /&gt;- find a hobby&lt;br /&gt;- talk to your spouse&lt;br /&gt;- create more projects&lt;br /&gt;&lt;br /&gt;"you can do less"&lt;br /&gt;&lt;br /&gt;Dr. Nic's talk really resonated with many of us. I, for one, immediately on getting back from the conference gave commit rights on two of my projects to two worthy individuals. Wow, what a relief!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://twitter.com/mattknox"&gt;Matt Knox&lt;/a&gt; - "Crimes Against Humanity, Writ Small"&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;After Dr. Nic, was a great talk called "Crimes Against Humanity, Writ Small" from Matt Knox. I have been hanging out for the last couple of years with Matt at various Ruby conferences, but I had no idea how awesome he really is, till he got to show his stuff at FutureRuby.&lt;br /&gt;&lt;br /&gt;The message behind his talk was really about taking responsibility for one's own actions. This was a very important recurring theme, starting right from Nathanial Talbott's talk at the very beginning of FutureRuby "you write the software for the nukes, you own responsibility if they are used". In Matt's case, the "nukes" in question were adware. The kind that attaches itself to your machine like a vampire squid, and will not let go. &lt;br /&gt;&lt;br /&gt;Like all roads to hell, Matt's started with the best of intentions. His wonderful idea was killing adware on Windows with &lt;a href="http://schemers.org/"&gt;Scheme&lt;/a&gt;. As in &lt;a href="http://en.wikipedia.org/wiki/Lisp_(programming_language)"&gt;LISP&lt;/a&gt;. That sounds like a really fun job... and it was, at first.&lt;br /&gt;&lt;br /&gt;From an auspicious start "kill this worm", the job progressed to "kill lots of worms/malicious ad clients". Then the job became "somewhat edgy" aka "kill competitors and keep us from being killed... by anything"&lt;br /&gt;&lt;br /&gt;As a result of all this, there were major negative repercussions that took down the company. In the aftermath, Matt was able to do some amazing self-exploration. "What just happened? Is this just who I am?"&lt;br /&gt;&lt;br /&gt;That brings us around to the famous &lt;a href="http://en.wikipedia.org/wiki/Milgram_experiment"&gt;Milgram experiments&lt;/a&gt;. The incredible part was that 70% went the distance, and did what they thought was "torturing" another human being. Most human evil lives here.&lt;br /&gt;&lt;br /&gt;What does this mean?&lt;br /&gt;- The human brain has a remote root exploit in 70% of the installed base&lt;br /&gt;- Knowing is 1/2 the battle&lt;br /&gt;&lt;br /&gt;Good&lt;br /&gt;- don't be evil&lt;br /&gt;&lt;br /&gt;Better&lt;br /&gt;- recognize that people who do evil may not be evil&lt;br /&gt;- this makes it easier to not hate them&lt;br /&gt;&lt;br /&gt;Best&lt;br /&gt;- set up structures to insure this does not happen&lt;br /&gt;&lt;br /&gt;The world forgives. But to provoke forgiveness, one needs to own your actions, and their results.&lt;br /&gt;&lt;br /&gt;There is a remote root exploit in human brain, but the world forgives.&lt;br /&gt;&lt;br /&gt;Matt, thank you very much for your bravery and honesty, in sharing what was clearly a very painful learning experience.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://twitter.com/pauldowman"&gt;Paul Dowman&lt;/a&gt; - "Between the Battleship and the FAILWhale"&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;After the raw psychology of Matt's talk, it was not easy for me to switch gears to Paul Dowman's talk "Between the Battleship and the FAILWhale". However, it was full of solid info with why's and how's about scaling. Here are a few highlights:&lt;br /&gt;&lt;br /&gt;Scalability != performance&lt;br /&gt;Performance is faster load time&lt;br /&gt;Scalability is handling greater load on same hardware&lt;br /&gt;&lt;br /&gt;2 kinds of scaling&lt;br /&gt;Vertical scaling - increase power of a single unit of your architecture&lt;br /&gt;Horizontal scaling - adding units to your architecture&lt;br /&gt;&lt;br /&gt;Why is scaling so hard? It cannot be an afterthought.&lt;br /&gt;Should I forget about my scaling problem till my app is a hit? It's a biz decision&lt;br /&gt;&lt;br /&gt;Developers and shareholders should talk about the tradeoffs, because scaling has costs: it requires more capital, and makes system more complex.&lt;br /&gt;&lt;br /&gt;You can do some simple things to prepare to scale, without a major engineering effort. The goal is to be able scale just by adding more servers&lt;br /&gt;&lt;br /&gt;HTTP Caching like &lt;a href="http://www.squid-cache.org/"&gt;squid&lt;/a&gt;, &lt;a href="http://varnish.projects.linpro.no/"&gt;varnish&lt;/a&gt; or &lt;a href="http://github.com/rtomayko/rack-cache/tree/master"&gt;Rack::Cache&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Use a queue for anything not needed to render the page right then. You will get a faster response, have a more consistent system load, and have less contention for locks.&lt;br /&gt;&lt;a href="http://aws.amazon.com/sqs/"&gt;&lt;br /&gt;Amazon SQS&lt;/a&gt; is pretty cool. SQS is slow but scalable, simple and requires no maintenance or deployment.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.danga.com/memcached/"&gt;Memcached&lt;/a&gt; is inherently distributed, and you can just add more instance to scale. But it is not a database, so do not treat it like one. Data can/will disappear, since it is not persisted.&lt;br /&gt;&lt;br /&gt;For scaling your database, you have various options:&lt;br /&gt;- Use an RDBMS like &lt;a href="http://www.mysql.com/"&gt;MySQL&lt;/a&gt; or &lt;a href="http://www.postgresql.org/"&gt;PostgreSQL&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://aws.amazon.com/simpledb/"&gt;SimpleDB&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://tokyocabinet.sourceforge.net/"&gt;Tokyo Cabinet&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://couchdb.apache.org/"&gt;CouchDB&lt;/a&gt;&lt;br /&gt;- something else&lt;br /&gt;&lt;br /&gt;Traditional RDBMS cannot scale horizontally forever. However, a lot of data does fit the table paradigm and SQL is powerful. Do not confuse data storage with data management.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://http://twitter.com/josephwilk"&gt;Joe Wilk&lt;/a&gt; - "Cucumbered"&lt;/b&gt;&lt;br /&gt;Next up was Joseph Wilk, all the way from London, to talk about &lt;a href="http://cukes.info/"&gt;Cucumber&lt;/a&gt;. Joe is a very unassuming but smart and witty fellow. The way he structured his talk was really clever. He used BDD itself to describe BDD... brilliant!&lt;br /&gt;&lt;br /&gt;So why use something like Cucumber? So that the customer can use something less syntactically stripped to describe their needs, THEN translate that to Ruby. It is a token of the conversation, and defines the acceptance criteria for the "customer". It is useful as a design tool, and provides executable documentation for the project.&lt;br /&gt;&lt;br /&gt;Cucumber has a gateway for different human languages, so that the developer and customer can interact in the customer's own human language. Like Swedish, Spanish, or LOLCATS. In fact there are currently over 30 languages already supported.&lt;br /&gt;&lt;br /&gt;Really, that is part of getting the most value out of Cucumber, is getting customers using Cucumber THEMSELVES... you can even just send around the "plaintext" using email, Google Docs, whatever allows you to share the plaintext data.&lt;br /&gt;&lt;br /&gt;The Art of "plaintext"&lt;br /&gt;- don't force structure&lt;br /&gt;- avoid noise&lt;br /&gt;- avoid inconsistency&lt;br /&gt;- balance abstraction&lt;br /&gt;- use Ruby language building blocks to keep things DRY&lt;br /&gt;  &lt;br /&gt;There are a couple of cool features that have gotten into Cucumber while I was not paying attention. One is Tagging, which allows you to tag a feature, and run only those features.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;@any plaintext word&lt;br /&gt;  &lt;br /&gt;cucumber --tags ~@in-progress&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Another is Continuous Integration (Work In Progress) (--wip) which looks very useful since running each and every feature story can be time-consuming and slow down a CI build. Running all of the features as part of a nightly build is a workable compromise, and this look pretty useful to me for Integrity integration etc.&lt;br /&gt;&lt;br /&gt;It was a very cool talk from Joe, and if you are not using Cucumber you really should be. It is an amazing source of insight into the needs of the user, and a great way to explain WHY you are doing things, not just WHAT you are doing.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://twitter.com/avibryant"&gt;Avi Bryant&lt;/a&gt; - "Failure: An Illustrated Guide"&lt;/b&gt;&lt;br /&gt;Next up, Avi Bryant gave a fun talk called "Failure: An Illustrated Guide". He basically took us thru 30+ iterations (I lost count) of UI variations trying to create an important part of the functionality for his new site &lt;a href="http://trendly.com/"&gt;Trendly&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;It was interesting to see all of the different attempts that they made, in finally reaching what is a pretty cool and different UI metaphor for visualizing time-series data from website stats. Once the presentation video is online, it is for sure worth watching, not so much because of what they did, but more from how it will make you revisit your own UI.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://twitter.com/jondahl"&gt;Jon Dahl&lt;/a&gt; - "Programming and Minimalism"&lt;/b&gt;&lt;br /&gt;Jon's talk about "Programming and Minimalism" delved into the comparisons and contrasts of music and programming. He played a number of musical examples that showed stylistic development of musical genres from simple forms, to complex ones, and then evolved to simpler ones as part of a new "branch" of development. &lt;br /&gt;&lt;br /&gt;It was interesting to consider these parallels, especially since I happened to be sitting next to friend &lt;a href="http://twitter.com/atduskgreg"&gt;Greg Borenstein&lt;/a&gt;, who's classical musical vocabulary is much greater than mine, and had interesting side-channel comments. Like Avi's presentation, the video/audio is probably needed to in order to get more than a superficial explanation of his points.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://twitter.com/marick"&gt;Brian Marick&lt;/a&gt; - "Artisanal Retro-Futurism and Team-Scale Anarcho-Syndicalism"&lt;/b&gt;&lt;br /&gt;I was really looking forward to the next talk. Brian Marick is one of the original authors of the "&lt;a href="http://agilemanifesto.org/"&gt;Agile Manifesto&lt;/a&gt;" and a very interesting thinker. I had heard him bandy about this phrase "Artisanal Retro-Futurism and Team-Scale Anarcho-Syndicalism" and I was eager to hear what it meant. FutureRuby was about to get radical. The &lt;a href="http://www.infoq.com/presentations/marick-retro-futurism"&gt;video of this talk&lt;/a&gt; is now online, so I really suggest you check it out for yourself.&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;"When I say agile, I mean Ruby... the way that Ruby projects are run"&lt;br /&gt;&lt;br /&gt;"Switching to scrum, at least my job doesn't suck as much as it used to"&lt;br /&gt;&lt;br /&gt;"I don't want to see on my gravestone, 'he made agile projects suck a little less'"&lt;br /&gt;&lt;br /&gt;"Even the wage-slave can have joy-in work"&lt;br /&gt;&lt;br /&gt;"the cubical is the single worst design of people and space to do software development"&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;What is "anarcho-syndicalism"? It is a political/economic trade-union movement peaked in 1923, crushed in 1924 by the U.S. government.&lt;br /&gt;&lt;br /&gt;Here were a few of their tenants:&lt;br /&gt;- getting rid of the government, and getting rid of private corporations&lt;br /&gt;- worker self management&lt;br /&gt;- direct action&lt;br /&gt;- worker solidarity&lt;br /&gt;&lt;br /&gt;Brian suggests adopting some of the ideas of the anarcho-syndicalists but at Team-scale" meaning within your own team.&lt;br /&gt;&lt;br /&gt;Teams should band together more than they do, and we need more power in the hands of team to counterbalance the power in the corporation.&lt;br /&gt;&lt;br /&gt;So on to this "Artisanal" thing. Brian used the example of artisanal cheese. The people who make this cheese are very into cheese. They care about the cheese! They do not just do it for profit, profit is the result of their caring.&lt;br /&gt;&lt;br /&gt;Lastly back to the "retro-futurism". Recently, the New Yorker magazine did an issue about innovation. However, to capture the idea of innovation, they used images from the past, like the jet pack.&lt;br /&gt;&lt;br /&gt;The idea of "retro-futurism" is trying to recapture the spirit of hopefulness from the past. Books like &lt;a href="http://www.amazon.com/Infinite-All-Directions-Freeman-Dyson/dp/0060915692"&gt;Freeman Dyson's "Infinite In All Directions"&lt;/a&gt; capture this endless sense of possibility.&lt;br /&gt;&lt;br /&gt;Do not let the context drive you, you control the context. Brian calls for a revolution in how software development projects are run, and challenges us to be scrappy, care, and keep our spirit of naive optimism.&lt;br /&gt;&lt;br /&gt;Start doing something about this: go to &lt;a href="http://arxta.net/"&gt;arxta.net&lt;/a&gt;, and talk to your teammates. And yes, I do have a sticker on my MacBook Pro.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://twitter.com/jessehirsh"&gt;Jesse Hirsh&lt;/a&gt; - "Fighting the Imperial Californian Ideology"&lt;/b&gt;&lt;br /&gt;The final presentation, from Jesse Hirsh, was even more radical than Brian Marick. Jesse challenged all of us by taking some of those same principles that we had all just agreed with coming from Brian about software, but extended them further. Much further.&lt;br /&gt;&lt;br /&gt;There have already been a couple of good posts that &lt;a href="http://www.joeydevilla.com/2009/07/15/futureruby-talk-fighting-the-imperial-californian-ideology/"&gt;summarize&lt;/a&gt; or &lt;a href="http://freelancing-gods.com/posts/future_ruby_and_californian_conflict"&gt;comment&lt;/a&gt; on Jesse's talk. Go check them out if you want more detail.&lt;br /&gt;&lt;br /&gt;A couple of books that have influenced Jesse are "&lt;a href="http://en.wikipedia.org/wiki/Snow_Crash"&gt;Snow Crash&lt;/a&gt;" and "&lt;a href="http://www.amazon.com/Imperial-San-Francisco-California-Geography/dp/0520229029"&gt;Imperial San Francisco&lt;/a&gt;". The reason this is important is that ideologies are viral. In the mid 1800's the US sent surveyors into California, and once the mineral wealth there are been established, declared war on Mexico to get mines.&lt;br /&gt;&lt;br /&gt;This was only the first of many "gold rushes" to take place in CA, although subsequent ones would develop other resources than mines. San Francisco technology invented the mining shaft to extract greater amounts of resources from the same mine. Taking those same technological achievements, a mining shaft turned upside down was a skyscraper - mining human labor instead of minerals.&lt;br /&gt;&lt;br /&gt;The Hearst mining family was the most successful of these robber barons of mining, and the most responsible for many of the negative outcomes that resulted. As an example, Hearst Mining is responsible for 8 of 10 Superfund hazardous waste cleanup sites.&lt;br /&gt;&lt;br /&gt;But it did not end there. As is well documented, the Spanish-American War, which resulted in the brutal colonial occupation of the Phillipines, was triggered by the first manufactured war, created by the first media mogul &lt;a href="http://en.wikipedia.org/wiki/William_Randolph_Hearst"&gt;William Randolph Hearst&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;San Francisco built all arms, and still responsible for all advanced military technology today. One big example is U.S. nuclear weapons, which are designed at the &lt;a href="https://www.llnl.gov/"&gt;Lawrence Livermore National Labs&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This all established California as a place where a few small elites could conquer the world. The end of the cold war, was replaced by new imperial project - the California Ideology. The acolytes of this new ideology were &lt;a href="http://www.kk.org/"&gt;Kevin Kelley&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Stewart_Brand"&gt;Stewart Brand&lt;/a&gt;, and the &lt;a href="http://www.gbn.com"&gt;Global Business Network&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Many saw the emergence of magazines like &lt;a href="http://www.wired.com/"&gt;Wired&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Mondo_2000"&gt;Mondo2000&lt;/a&gt; (shout-out to &lt;a href="http://en.wikipedia.org/wiki/R._U._Sirius"&gt;RUSirius&lt;/a&gt;!) as the frontier of new techno-utopia. However, not everywhere has the silicon valley infrastructure. This new world was still under the dominance of SF.&lt;br /&gt;&lt;br /&gt;The corrupting influence and domination of SF was exemplified by &lt;a href="http://en.wikipedia.org/wiki/Bay_Area_Laboratory_Co-operative"&gt;BALCO&lt;/a&gt; - the Bay Area Labratory Co-Operative known for the designer steroids that have altered professional sports irrevocably.&lt;br /&gt;&lt;br /&gt;When &lt;a href="http://twitter.com/chr1sa"&gt;Chris Anderson&lt;/a&gt; wrote "&lt;a href="http://www.thelongtail.com/"&gt;The Long Tail&lt;/a&gt;", Jesse says we all recognized it as brilliant. However, it reinforced the hierarchy to allow the few to get all of the best parts, while relegating everyone else to the skinny end of the long tail.&lt;br /&gt; &lt;br /&gt;Jesse goes on to attack Chris's latest manifesto "&lt;a href="http://www.scribd.com/doc/17135767/FREE-full-book-by-Chris-Anderson-Read-in-Fullscreen"&gt;Free&lt;/a&gt;". He says there is something fundamentally wrong with his argument, however NOT the free part. Jesse says the fatal flaw is the ethic of waste. Chris says that now that bandwidth is in such abundance, we must waste it, because only then can we reach innovation.&lt;br /&gt;&lt;br /&gt;Jesse rails on waste as an ethic in CA (cars, weapons, mining etc). He prefers a revolutionary wholeism. Wholeism is a flip on relativism. Making everything the same, is NOT the answer, according to Jesse. We are in similar time with social tools like as when AOL took over Internet and turned it into total crap.&lt;br /&gt;&lt;br /&gt;When you have neighborhoods in the net, you can clean them up. We need to take the best tools available, merge into a coherent vision. Take a page from Barack Obama's playbook and become community activists.&lt;br /&gt;&lt;br /&gt;Who can you trust? Not the corporation, only your comrades, which is whoever you have social capital with.&lt;br /&gt;&lt;br /&gt;The struggle for human rights never ends, the question is which side are you on? The era of the nation-state is done, it is time for the new rise of the city-state. Get involved.&lt;br /&gt;&lt;br /&gt;Jesse had given an intense and fascinating talk. We could not complete the FutureRuby agenda, without some serious rabble-rousing. We surely have to individually take responsibility for what we choose to do with our power as technologists. Agree with Jesse on any individual point, or not, there was a lot of food for further thought. &lt;br /&gt; &lt;br /&gt;&lt;b&gt;Aftermath&lt;/b&gt;&lt;br /&gt;The conference sessions were now over, but the FutureRuby festivities had not yet ended. After so many ideas compressed into so little time, we needed to hang out and process things together, while allowing it to be unstructured. &lt;a href="http://twitter.com/meghatron"&gt;Meghann&lt;/a&gt; had come up with the innovative thought of putting the after-party into 3 different walkable nearby locations: a cool coffeehouse with retro video games, a classic little dive bar with live music, and &lt;a href="http://hackerspaces.org"&gt;HackerspaceTO&lt;/a&gt;. Not to mention a &lt;a href="http://www.vimeo.com/5592994"&gt;hilarious street performance&lt;/a&gt; that could only happen somewhere open-minded like Toronto. &lt;br /&gt;&lt;br /&gt;Jamming on harmonica with a cyborg who played the water organ was just part of my personal awesome experience. Where is that video? So was getting to hang out at HackerspaceTO where they have frickin' laser beams. We timed it poorly, and missed the band dressed in Farscape garb, but there was so much to see and do, right up to the end.&lt;br /&gt;&lt;br /&gt;FutureRuby was not just a fun conference. And it was not just a chance to learn about a bunch of new things. It opened me up to new possibilities, and helped re-affirm my personal commitment. I thank all of the staff, volunteers, speakers, and attendees for making it an inspirational experience.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-6691150186209506511?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/6691150186209506511/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=6691150186209506511' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/6691150186209506511'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/6691150186209506511'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2009/07/futureruby-revolution-will-not-be-on.html' title='The FutureRuby Revolution Will Not Be On AOL - Part 2'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-2357217303717410137</id><published>2009-07-16T17:05:00.000-07:00</published><updated>2009-07-16T17:07:07.494-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='futureruby'/><title type='text'>I Have Seen The FutureRuby, And It Is Amazing - Part 1</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm2.static.flickr.com/1081/1045078870_28a927b58d_o.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 210px; height: 386px;" src="http://farm2.static.flickr.com/1081/1045078870_28a927b58d_o.jpg" border="0" alt="" /&gt;&lt;/a&gt;It was with tremendous excitement that my brother &lt;a href="http://twitter.com/Damenevans"&gt;Damen&lt;/a&gt; and I had arrived in Toronto for &lt;a href="http://futureruby.com"&gt;FutureRuby&lt;/a&gt;. Not only were we getting to attend the reprise of what had been by all accounts the "Best. Conference. Ever.", but we were going to be speaking about &lt;a href="http://flyingrobo.com"&gt;Project Flying Robot&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;There had been many interesting interactions with various security personnel on the journey, thanks to the many small homemade electronic devices that make up our tiny squadron. All of them were extremely friendly and professional as they carefully unpacked, swabbed, scanned, then repacked our cases full of joysticks, &lt;a href="http://www.arduino.cc/"&gt;Arduinos&lt;/a&gt;, electric motors, batteries, and many wires. MANY wires.&lt;br /&gt;&lt;br /&gt;By the hour that we arrived, we were too late to attend &lt;a href="http://failcampto.eventbrite.com/"&gt;failCAMP&lt;/a&gt; (failed to make it?), but there would be many opportunities to interact with our fellow comrades in Ruby. &lt;a href="http://twitter.com/peteforde"&gt;@peteforde&lt;/a&gt; and &lt;a href="http://twitter.com/meghatron"&gt;@meghatron&lt;/a&gt; of &lt;a href="http://unspace.ca"&gt;Unspace&lt;/a&gt; had designed the conference with the kind of architectural integrity only a geek could conceive. It was not until the final sessions that the master plan became clear, but I will get to that.&lt;br /&gt;&lt;br /&gt;As a result, the next morning we had no post-fail hangovers to slow us down with our last minute assembly and attempts at troubleshooting, combined with walking all over Toronto. Once the evening came, we were eager to connect with our fellows, and happy to climb the stairs to &lt;a href="http://unspace.ca"&gt;Unspace&lt;/a&gt;'s cool digs. Pinball machine FTW! And &lt;a href="http://twitter.com/atduskgreg"&gt;Greg Borenstein&lt;/a&gt;'s &lt;a href="http://www.youtube.com/watch?v=mUoUMko77KM"&gt;robotic drummer&lt;/a&gt; pounding the skins on Pete Forde's drum kit, controlled by &lt;a href="http://github.com/gilesbowkett/archaeopteryx/tree/master"&gt;Archaeopteryx&lt;/a&gt;. It was an excellent party, and they had to kick us out at midnight with the reminder of the talks in the early AM, not to mention the festivities yet to come.&lt;br /&gt;&lt;br /&gt;Opening up the first day of the actual conference with the first talk was &lt;a href="http://blog.talbott.ws/"&gt;Nathaniel Talbott&lt;/a&gt; with a rabble-rousing speech on &lt;a href="http://blog.talbott.ws/articles/2009/7/15/how-capitalism-saves-ruby-from-corporatism"&gt;"How Capitalism Saves Ruby From Corporatism, or, Owning The Means of Production"&lt;/a&gt;. This was an immediate shot across the bow of the status quo, and gave us all a clue that the 'collectivist' theme was not just a cool design style for the schwag, but also a serious theme for the conference content.&lt;br /&gt;&lt;br /&gt;Next on was &lt;a href="http://www.igvita.com/"&gt;Ilya Grigorik&lt;/a&gt; with &lt;a href="http://www.slideshare.net/igrigorik/lean-mean-tokyo-cabinet-recipes-with-lua"&gt;"Lean and Mean Tokyo Cabinet Recipes"&lt;/a&gt;. If you do not know about it, &lt;a href="http://tokyocabinet.sourceforge.net/"&gt;Tokyo Cabinet&lt;/a&gt; is an open source key-value database, that also has server and full-text capabilities. Ilya gave a very hardcore presentation that went all the way into many of the cool things that can be done with TC right now. This was a departure against the traditional SQL way of doing things, and tied in with the revolutionary theme. You HAVE been getting up to speed on one or more non-SQL databases already, haven't you?&lt;br /&gt;&lt;br /&gt;The next session was one I was particularly eager to hear. &lt;a href="http://austinche.name/"&gt;Austin Che&lt;/a&gt; spoke about "Programming Life". As in, "Hello World in a petri dish" kind of programming. I had missed the actual workshop, where some lucky people were successful as growing their own &lt;a href="http://www.flickr.com/photos/luismi_cavalle/3718636707/"&gt;glowing bacteria&lt;/a&gt;. However, the excellent talk from Austin took us on a wild ride through the current state-of-the-art in biohacking. Let me put it another way: we already have the rough biotech equivalents of both Github, with the &lt;a href="http://obda.open-bio.org/"&gt;Open Bioinformatics Foundation&lt;/a&gt;, and Sparkfun with Auston's own &lt;a href="http://ginkgobioworks.com/"&gt;Gingko Bioworks&lt;/a&gt;. Other sites like &lt;a href="http://biobricks.org"&gt;biobricks.org&lt;/a&gt; and &lt;a href="http://openwetware.org"&gt;openwetware.org&lt;/a&gt; are also there for anyone who wants to get started with this fascinating technology at home.&lt;br /&gt;&lt;br /&gt;Following this was &lt;a href="http://twitter.com/anteaya"&gt;Anita Kuno&lt;/a&gt; with "Version Control: Blood Brain &amp; Bones" reminding us that the human mechanism needs to be correctly maintained, and developed for correct performance. She had a bunch of specific eating techniques and foods to share, and almost immediately, it seemed that we were more conscious of what nutritional input we were routing into our individual biocomputers.&lt;br /&gt;&lt;br /&gt;Next up was one of the best presentations of the entire conference. &lt;a href="http://www.foysavas.com/"&gt;Foy Savas&lt;/a&gt; gave a talk named "polyglots Unite!" which spoke about multi-language programming, and using a takeoff on Rack named Crack to providing a kind of Rack-adapter for other web-backends other than Ruby. It is a neat concept, and I look forward to seeing where it goes. The presentation itself was absolutely fantastic. The timing, the clarity... in a word, he "killed". One of the best speakers of the conference.&lt;br /&gt;&lt;br /&gt;Only something pretty different and amazing could follow up that, and &lt;a href="http://www.mishaglouberman.com/"&gt;Misha Glouberman&lt;/a&gt;'s "Terrible Noises for Beautiful People" satisfied. It was a laptops closed participatory session that had our entire group singing, clapping, and sushing together. Not only that, but we actually played &lt;a href="http://en.wikipedia.org/wiki/Conway%27s_Game_of_Life"&gt;Conway's game of life&lt;/a&gt; using musical interaction with the entire group as the cellular automata. You can't do THAT at home! Absolutely brilliant.&lt;br /&gt;&lt;br /&gt;Next were my brother &lt;a href="http://twitter.com/Damenevans"&gt;Damen Evans&lt;/a&gt; and I with our &lt;a href="http://flyingrobo.com"&gt;"Flying Robot"&lt;/a&gt; presentation. Despite a few small technical glitches (hardware!) we pulled it off, and the &lt;a href="http://search.twitter.com/search?q=futureruby+blimp+OR+flying"&gt;crowd was enthusiastic&lt;/a&gt;. We had a great time, and congrats to the winners of the 2 Blimpduino kits &lt;a href="http://twitter.com/_krispy_"&gt;@_krispy_&lt;/a&gt; and &lt;a href="http://twitter.com/maplealmond"&gt;@maplealmond&lt;/a&gt;. There is some &lt;a href="http://www.youtube.com/watch?v=Xuuk3n60UUk"&gt;cool video here&lt;/a&gt;, and lots of great photos like &lt;a href="http://hyfen.posterous.com/flying-robots-at-futureruby-courtesy-of-deadp"&gt;here&lt;/a&gt;, and &lt;a href="http://www.flickr.com/photos/jay_tennier/3718902768/in/set-72157621411683706/"&gt;here&lt;/a&gt;. Thank you to everyone who participated, we had a great time doing it!&lt;br /&gt;&lt;br /&gt;Once we had demonstrated Ruby air superiority over the skies within the Metropolitan Hotel, it was all mobile all the time for the remains of the day. First, a 3-way talk from the guys at &lt;a href="http://phonegap.com/"&gt;Phonegap&lt;/a&gt;, followed with a demo by &lt;a href="http://www.adamblum.com/"&gt;Adam Blum&lt;/a&gt; from &lt;a href="http://www.rhomobile.com/"&gt;Rhomobile&lt;/a&gt;. I had seen Adam's basic pitch before at &lt;a href="http://www.larubyconf.com/"&gt;LARubyConf&lt;/a&gt;, one nice change was that they no longer seem to be trying to charge a per-user license. Per-user license, what's that?? I haven't seem one of those since last century, I think.&lt;br /&gt;&lt;br /&gt;Finally, the sessions for the first day were complete. We all put on our finery, and took over &lt;a href="http://pravdavodkabar.com/"&gt;Pravda&lt;/a&gt;, a Russian-mobster-styled vodka bar that pulled out all the stops, with many people staggering out of the vodka-freezer with smiles on their faces. My personal favorite moment was when we gave a spontaneous group loud "ahhh-clapping-shushing" in response to the wonderful announcement that &lt;a href="http://www.shopify.com/"&gt;Shopify&lt;/a&gt; was going to pay to keep the bar open longer. There was large quantities of amazing food as well. That &lt;a href="http://twitter.com/meghatron"&gt;@meghatron&lt;/a&gt; really knows how to throw a party!&lt;br /&gt;&lt;br /&gt;After a pleasant stroll through the streets of Toronto, powered by Russian jet-fuel, we collapsed, to get a few comfortable, if short, hours of rest before FutureRuby Day 2.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-2357217303717410137?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/2357217303717410137/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=2357217303717410137' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/2357217303717410137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/2357217303717410137'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2009/07/i-have-seen-futureruby-and-it-is.html' title='I Have Seen The FutureRuby, And It Is Amazing - Part 1'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-6186056620547085203</id><published>2009-07-05T09:55:00.000-07:00</published><updated>2009-07-05T10:47:47.600-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='flying robot'/><category scheme='http://www.blogger.com/atom/ns#' term='arduino'/><category scheme='http://www.blogger.com/atom/ns#' term='ruby arduino development'/><category scheme='http://www.blogger.com/atom/ns#' term='uav'/><category scheme='http://www.blogger.com/atom/ns#' term='futureruby'/><category scheme='http://www.blogger.com/atom/ns#' term='unmanned aerial vehicles'/><title type='text'>Getting Ready For Takeoff At FutureRuby</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://upload.wikimedia.org/wikipedia/commons/thumb/d/da/Leonardo_Design_for_a_Flying_Machine,_c._1505.jpg/450px-Leonardo_Design_for_a_Flying_Machine,_c._1505.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 300px; height: 213px;" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/da/Leonardo_Design_for_a_Flying_Machine,_c._1505.jpg/450px-Leonardo_Design_for_a_Flying_Machine,_c._1505.jpg" border="0" alt="" /&gt;&lt;/a&gt;I just realized it has been an entire month since my last post. Sorry! In case you were wondering, the always overambitious plans for &lt;a href="http://flyingrobo.com"&gt;Project Flying Robot&lt;/a&gt; have taken up more time than expected. And &lt;a href="http://www.sparkfun.com"&gt;parts&lt;/a&gt;. Especially &lt;a href="http://www.digikey.com/"&gt;parts&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Lucky for us, the benefit of a hard deadline approaches: &lt;a href="http://futureruby.com/"&gt;FutureRuby&lt;/a&gt; is coming up next week. My brother &lt;a href="http://myfirstairship.blogspot.com/"&gt;Damen Evans&lt;/a&gt; and I are going to be showing off our latest works in Unmanned Aerial Vehicles (UAV) based on &lt;a href="http://rad.rubyforge.org/"&gt;Ruby Arduino Development&lt;/a&gt; (RAD). I don't want to let on too much, so as to eliminate the surprise element, but this should be our biggest spectacle yet.&lt;br /&gt;&lt;br /&gt;So if you're going to be in Canada next week, we look forward to seeing you. If not, I'm sure there will be plenty of video to watch in either amazement or amusement, depending on how well we can pull this off...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-6186056620547085203?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/6186056620547085203/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=6186056620547085203' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/6186056620547085203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/6186056620547085203'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2009/07/getting-ready-for-takeoff-at-futureruby.html' title='Getting Ready For Takeoff At FutureRuby'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-3542484967280693453</id><published>2009-06-03T21:12:00.000-07:00</published><updated>2009-06-03T21:17:33.303-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flying robot'/><category scheme='http://www.blogger.com/atom/ns#' term='uav'/><category scheme='http://www.blogger.com/atom/ns#' term='unmanned aerial vehicles'/><category scheme='http://www.blogger.com/atom/ns#' term='blimpduino'/><title type='text'>Project Flying Robot: Supporting The Blimpduino</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.makershed.com/v/vspfiles/photos/mkca1-2.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 250px; height: 167px;" src="http://www.makershed.com/v/vspfiles/photos/mkca1-2.jpg" border="0" alt="" /&gt;&lt;/a&gt;As &lt;a href="http://makerfaire.com/"&gt;Maker Faire&lt;/a&gt; approached, &lt;a href="http://myfirstairship.blogspot.com/"&gt;my brother Damen&lt;/a&gt; and I were very busy working on something cool: support for the &lt;a href="http://www.makershed.com/ProductDetails.asp?ProductCode=mkca1"&gt;now-shipping Blimpduino kit!&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Thanks to the tireless efforts of Chris Anderson and Jordi Muñoz, the long awaited &lt;a href="http://diydrones.com/profiles/blog/show?id=705844%3ABlogPost%3A44817"&gt;Blimpduino&lt;/a&gt; kit is now shipping at &lt;a href="http://www.makershed.com/ProductDetails.asp?ProductCode=mkca1"&gt;Makershed&lt;/a&gt;. As readers of this blog know, we have drawn a lot of inspiration from the Blimpduino. Now, we actually have 2 of them, and you can get your own. For less than $100, plus a few other items, and &lt;a href="http://github.com/deadprogrammer/flying_robot/tree/master"&gt;flying_robot&lt;/a&gt; software of course, you have everything you need for a complete experimenters kit for Unmanned Aerial Vehicles at home.&lt;br /&gt;&lt;br /&gt;There are a few mods you need to make to your Blimpduino, if you want to be cool like us, and control/reprogram it using a linked pair of XBee modems. We will post complete directions soon on how to mod your blimpduino into a &lt;a href="http://github.com/deadprogrammer/flying_robot/tree/master"&gt;flying_robot&lt;/a&gt; using &lt;a href="http://rad.rubyforge.org/"&gt;Ruby Arduino Development&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;In the meantime, you can look at the almost completed &lt;a href="http://github.com/deadprogrammer/flying_robot_blimpduino/tree/master"&gt;flying_robot for Blimpduino code here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-3542484967280693453?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/3542484967280693453/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=3542484967280693453' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/3542484967280693453'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/3542484967280693453'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2009/05/project-flying-robot-supporting.html' title='Project Flying Robot: Supporting The Blimpduino'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-1132828055615983331</id><published>2009-05-17T15:17:00.000-07:00</published><updated>2009-05-17T15:28:31.820-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='railsconf'/><category scheme='http://www.blogger.com/atom/ns#' term='railsconf 2009'/><title type='text'>Fear And Loathing At RailsConf 2009</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.moviewallpapers.net/images/wallpapers/1998/fear-and-loathing-in-las-vegas/fear-and-loathing-in-las-vegas-3-800.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 150px;" src="http://www.moviewallpapers.net/images/wallpapers/1998/fear-and-loathing-in-las-vegas/fear-and-loathing-in-las-vegas-3-800.jpg" border="0" alt="" /&gt;&lt;/a&gt;We were around Barstow on the edge of the desert, when the drugs began to take hold... wait, that was someone else's story. OK, restart.&lt;br /&gt;&lt;br /&gt;We were around Barstow on the edge of the desert when the excitement began to take hold... we were on our way to RailsConf 2009! No screaming bats, just loud pumping techno music to power the PT Cruiser. My designer, who was not old enough to be pouring beer on his chest, nor interested in facilitating the tanning process, said "What the hell are you yelling about?". I aimed the Cruiser toward the horizon without slowing down, "I need an In-n-Out milkshake."&lt;br /&gt;&lt;br /&gt;Las Vegas... what a place. Putting RailsConf there is the sort of idea that makes sense on paper, but could turn a previously mild-mannered group of Ruby programmers into a mob of raging lunatics. Come to think of it, a group of Ruby programmers IS a mob of raging lunatics. Case in point? Video slot machines... the worst odds in vegas, but the best graphics. How will a group of perpetually partially attentive people be able to resist the siren call of millions of sensory distractions each designed to exert psychological pressure to LOOK AT ME? Seems like an interesting Milgram-like experiment.&lt;br /&gt;&lt;br /&gt;The back of the PT Cruiser was full of musical gear for the RailsConf music jam. With a small but effective PA and a few spare guitars, this session should be the best one yet. Could we play Vegas? Without offending the locals, or running afoul of some Musician's Union enforcers, that is.&lt;br /&gt;&lt;br /&gt;I had meant to keep meticulous notes, and post a flurry of blog entries as I have done as RailsConf's past. But the dull fog of Vegas combined with the mad dog sentiments already awakened in the Rails community at GoGaRuCo, left me with the sure knowledge that no matter how hard I might try to offend the insiders, no one would even notice with the continuous drunken flame wars that RailsConf Vegas would become quickly known for throughout the Twitterverse.&lt;br /&gt;&lt;br /&gt;The madness had taken hold long before we hit Vegas, and adding alcohol and neon fueled hyperstimulation only had the effect of pushing us into a raging frenzy. "Tim Ferris? How DARE he tell ME to exercise. Bob Martin? How dare he accuse me of not testing? Everyone else? How dare they dare to dare, or else how dare they not dare to dare! Forgeddaboutit!"&lt;br /&gt;&lt;br /&gt;Just then my already tenuous sanity began teetering, and I started yelling that the White Rabbit and I had been pair programming together for years. The wild-eyed activist within me leaped into action, and I practically elbowed people out of my way to get to the mic, to ask Uncle Bob the burning question on my mind: "What happened to the social revolution you started with Kent Beck and Ward Cunningham?"&lt;br /&gt;&lt;br /&gt;From the look in his eyes, I know the question haunted him, just as it still haunts me. If this is the utopia, why are we all fighting so much? "I saw the best minds of my generation destroyed by madness, starving hysterical naked..." and still Twittering away trying to validate justify, explain, strengthen, while simultaneously eroding it, tearing it away.&lt;br /&gt;&lt;br /&gt;I had to escape, find a place to hide and collect my shattered illusions. Fortunately, the safety zone of CabooseConf greeted me. The comfort and sanity of watching my programming buddies hacking together an LLVM implementation for AVR was like slipping under a warm, soft blanket, after the frenzy that had started while I was sitting in the Reptile Room, watching some giant lizards get ready to feast on fresh ideas.&lt;br /&gt;&lt;br /&gt;Days had passed, but in the strange netherworld between Vegas's clockless existence, and the constant Twitter flow of new input, I had lost all sense of temporality. It was a surprise that we had already come to the final keynote aka Q&amp;A session. It was an odd demonstration of our shared exhaustion and sensory overload, that pretty much no one wanted to ask any questions.&lt;br /&gt;&lt;br /&gt;"Time to get out of here!" I said to my designer. We piled the PT Cruiser full of our gear, plying the staff with dollar bills like we were mythical high-rollers. I drove like the wind, but it was not quickly enough. Leaving behind a cloud of gritty, baked dust, we fled from a man-made 24-hour spectacle that even Dante could have never imagined, even if he had taken all the drugs available to an Italian in the 14th century at the same time.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;With apologies to, and in memory of HST, we need his free spirit now more than ever&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-1132828055615983331?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/1132828055615983331/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=1132828055615983331' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/1132828055615983331'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/1132828055615983331'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2009/05/fear-and-loathing-at-railsconf-2009.html' title='Fear And Loathing At RailsConf 2009'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-7854852035660553350</id><published>2009-04-29T09:28:00.000-07:00</published><updated>2009-04-29T17:49:15.372-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='rack'/><category scheme='http://www.blogger.com/atom/ns#' term='ruby on rails'/><category scheme='http://www.blogger.com/atom/ns#' term='heroku'/><category scheme='http://www.blogger.com/atom/ns#' term='cloud computing'/><title type='text'>Heroku Has Launched</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://ecx.images-amazon.com/images/I/510MZNM0WDL._SL500_AA280_.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 280px; height: 280px;" src="http://ecx.images-amazon.com/images/I/510MZNM0WDL._SL500_AA280_.jpg" border="0" alt="" /&gt;&lt;/a&gt;Well, just a very short time after &lt;a href="http://deadprogrammersociety.blogspot.com/2009/04/heroku-why-havent-i-been-using-you-till.html"&gt;I started using&lt;/a&gt; &lt;a href="http://heroku.com/"&gt;Heroku&lt;/a&gt;, they went commercial. Yes, after their very successful beta period, where apparently &lt;a href="http://gigaom.com/2009/04/23/heroku-to-exit-beta-start-charging-for-cloud-computing/"&gt;24,999 web sites other than mine were already hosting&lt;/a&gt;, Heroku is now offering a paid version of their service. I had a sneak peak at the pricing a few days ahead of time, but I was not able to talk. And despite my intentions of blogging this right away, the other demands on my time have kept me occupied till just now.&lt;br /&gt;&lt;br /&gt;Heroku is mimicking the successful "freemium" pricing plan of other services, but brings it into the Ruby web application hosting space, within some pretty generous limitations. Yes, exactly. Heroku still allows you to get started with their service at no charge at all. Wow. I do not know of any free web hosting service that does not at minimum plaster your site with hideous ads. Let alone quality Ruby hosting. Let alone Ruby powered cloud computing.&lt;br /&gt;&lt;br /&gt;As your traffic needs increase, or database storage needs, they have a variety of pricing tiers. Thanks to a slick AJAXified pricing tool, the complexity of so many pricing options is somewhat mitigated. Plus it's fun to play with.&lt;br /&gt;&lt;br /&gt;The evolution of most startups seems to track really well with Heroku's overall business strategy: as a customer becomes larger and more successful, their increased traffic and database needs will cause them to start paying Heroku. If your venture does not really go anywhere, it is not really taking up much in the way of resources anyhow. This aligns Heroku nicely with the needs of their customers, instead of pitting them against them trying to extract revenues too early in the growth curve.&lt;br /&gt;&lt;br /&gt;Despite a few growing pains, they have had pretty decent uptime on my app so far. Even with my new app &lt;a href="http://www.thumbfight.com/"&gt;Thumbfight&lt;/a&gt; getting a few sudden traffic bursts, as well as having a major reliance on &lt;a href="http://twitter.com"&gt;Twitter&lt;/a&gt; for back-end processing (more about &lt;a href="http://www.thumbfight.com/"&gt;Thumbfight&lt;/a&gt; in an upcoming post). &lt;br /&gt;&lt;br /&gt;Heroku is a work in progress, but so is most everything else on the entire Internet. Heroku provides an amazingly easy and insanely cheap way to jumpstart your Ruby-based web application hosting and deployment, while still getting some real expertise. As long as you can work within their current technical limitations, for a Ruby-powered startup, I think Heroku is a great way to go.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-7854852035660553350?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/7854852035660553350/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=7854852035660553350' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/7854852035660553350'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/7854852035660553350'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2009/04/heroku-has-launched.html' title='Heroku Has Launched'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-6695939700863281861</id><published>2009-04-18T15:08:00.000-07:00</published><updated>2009-04-18T15:34:33.848-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flying robot'/><category scheme='http://www.blogger.com/atom/ns#' term='arduino'/><category scheme='http://www.blogger.com/atom/ns#' term='ruby arduino development'/><title type='text'>Project Flying Robot: Getting RAD With The ATMega328</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cache.jalopnik.com/assets/resources/2008/04/wind-tunnel.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 247px; height: 165px;" src="http://cache.jalopnik.com/assets/resources/2008/04/wind-tunnel.jpg" border="0" alt="" /&gt;&lt;/a&gt;I have been wanting to upgrade the hardware used in our &lt;a href="http://dorkbotpdx.org/wiki/dorkboard"&gt;Dorkboards&lt;/a&gt; for &lt;a href="http://flyingrobo.com"&gt;flying_robot&lt;/a&gt;, from the ATMega168, to the newer better faster ATMega328. More memory, and a faster UART for serial communications with the XBee modems in the same pinout = easy win. Thanks to a quick shipping turnaround from &lt;a href="http://www.adafruit.com"&gt;@adafruit&lt;/a&gt; I got them in before the weekend, so I could play a little bit today.&lt;br /&gt;&lt;br /&gt;The first step was to upgrade my hard-working Arduino Diecimila to a 328. I now have it working great with &lt;a href="http://rad.rubyforge.org/"&gt;Ruby Arduino Development (RAD)&lt;/a&gt;, but since RAD was really setup for Arduino 12, I had to make a couple changes. Here is what I did:&lt;br /&gt;&lt;br /&gt;1. D/l and install &lt;a href="http://arduino.cc/en/Main/Software"&gt;Arduino 15&lt;/a&gt; (brave, I know, since that is the latest release, and many people run one version down from the latest)&lt;br /&gt;2. Change my hardware.yml entry&lt;br /&gt;&lt;pre&gt;mcu: atmega328p&lt;/pre&gt;&lt;br /&gt;3. Change my software.yml entry&lt;br /&gt;&lt;pre&gt;arduino_root: /Applications/arduino-0015&lt;/pre&gt;&lt;br /&gt;4. Lastly, since the ATMega328 bootloader runs at a faster rate, I had to tweak the RAD code itself to support it. The file "/vendors/rad/generators/makefile/makefile.erb" is the template used to create the makefile that compiles and uploads the code to the Arduino. Line 77 in that file controls the baud rate, which needs to be set like this for the '328:&lt;br /&gt;&lt;pre&gt;UPLOAD_RATE = 57600&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Once I had done this, I was easily and quickly able to recompile/re-upload the latest flying_robot code to my test board. Yeah! Hopefully tomorrow I can upgrade &lt;a href="http://github.com/deadprogrammer/flying_robot_rogue_one/tree/master"&gt;Rogue 1&lt;/a&gt; and try a flight at the new, higher communication speed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-6695939700863281861?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/6695939700863281861/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=6695939700863281861' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/6695939700863281861'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/6695939700863281861'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2009/04/project-flying-robot-getting-rad-with.html' title='Project Flying Robot: Getting RAD With The ATMega328'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-1317952744739432262</id><published>2009-04-14T11:23:00.000-07:00</published><updated>2009-04-14T12:49:09.304-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='ruby on rails'/><category scheme='http://www.blogger.com/atom/ns#' term='heroku'/><category scheme='http://www.blogger.com/atom/ns#' term='sinatra'/><category scheme='http://www.blogger.com/atom/ns#' term='cloud computing'/><title type='text'>Heroku, Why Haven't I Been Using You Till Now?</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.dinaview.com/wp-content/uploads/2008/06/hero.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 290px;" src="http://www.dinaview.com/wp-content/uploads/2008/06/hero.jpg" border="0" alt="" /&gt;&lt;/a&gt;Last night, I finally got around to deploying something on &lt;a href="http://heroku.com/"&gt;Heroku&lt;/a&gt;, an interesting service founded by my formerly LA-based Ruby programming chums &lt;a href="http://adam.blog.heroku.com/"&gt;Adam Wiggins&lt;/a&gt;, James Lindenbaum, and Orion Henry. I had played with their previous incarnation of the service, now known as "Heroku Garden" but only recently have I gotten to know a little bit more about the incredible offering they have evolved into.&lt;br /&gt;&lt;br /&gt;Basically, the Heroku crew have addressed the question "how can I deploy my &lt;a href="http://rubyonrails.org/"&gt;Ruby on Rails&lt;/a&gt;, &lt;a href="http://www.sinatrarb.com/"&gt;Sinatra&lt;/a&gt;, or other &lt;a href="http://rack.rubyforge.org/"&gt;Rack&lt;/a&gt;-based web application into a dynamic cloud of servers with ridiculous ease?" They have done this with an ingenious architecture that takes advantage of &lt;a href="http://aws.amazon.com/ec2/"&gt;Amazon's EC2&lt;/a&gt; to provide their internal infrastructure. This allows Heroku to concentrate on their most important core value proposition, of a simple way to take your Ruby code and just push it into the cloud.&lt;br /&gt;&lt;br /&gt;Notice I said "push". Heroku requires that you use &lt;a href="http://git-scm.com/"&gt;git&lt;/a&gt; for source control of your application. You are using git for everything now, right? If not, git with it! Sorry, could not resist that. Anyhow, by simply adding a remote master to your existing git repo that points to Heroku, along with a few Ruby gems that they provide, you can deploy your app just by pushing your current branch to the Heroku master. &lt;br /&gt;&lt;br /&gt;Doing this, causes your app to get packaged up into "slug". Once you have an active slug, it will be be deployed to a "dyno" within the Heruku grid, which is what a virtual node within their architecture is called. As your app requires more resources, the slug can be deployed to more dynos within "less than 2 seconds for most apps". That is way faster than starting up a new Amazon EC2 instance yourself, and having this extra layer has a number of other interesting benefits as well.&lt;br /&gt;&lt;br /&gt;Heroku has a quick start guide, which pretty much runs down what you need to do. I had found a slightly more &lt;a href="http://heroku.com/pages/quickstart"&gt;simplified quickstart here&lt;/a&gt;. I already had an existing Sinatra-based app that I wanted to test on Heroku, so here were my steps:&lt;br /&gt;&lt;br /&gt;1. Install heroku gem&lt;br /&gt;&lt;pre&gt;sudo gem install heroku&lt;/pre&gt;&lt;br /&gt;2. Setup Heroku account info, and upload public key&lt;br /&gt;&lt;pre&gt;heroku keys:add &lt;/pre&gt;&lt;br /&gt;This will prompt you for your Heroku account info. If you have not created one yet, better jump over to &lt;a href="http://heroku.com/signup"&gt;http://heroku.com/signup&lt;/a&gt; and create one&lt;br /&gt;&lt;br /&gt;3. Create Heroku app from my existing app&lt;br /&gt;I just changed so my current directory was the app I wanted to add to Heroku, then entered:&lt;br /&gt;&lt;pre&gt;heroku create myappname&lt;/pre&gt;&lt;br /&gt;This creates the new app on Heroku, and creates a remote branch so you can deploy just by pushing the code.&lt;br /&gt;&lt;br /&gt;4. Deploy my code&lt;br /&gt;&lt;pre&gt;git push heroku master&lt;/pre&gt;&lt;br /&gt;That's it! If you have a really simple app, with no database access, you are done. What, you are deploying a Ruby on Rails app and need a database setup? OK, then...&lt;br /&gt;&lt;br /&gt;5. Run database migrations&lt;br /&gt;&lt;pre&gt;heroku rake db:migrate&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;NOW, you are fully deployed and running on Heroku. Unless you are not. I still had a minor problem with my app. I was writing my log file into "logs/production.log" but Heroku does not normally allow write access to disk. The two exceptions to this are the "tmp" directory and "log" directory (notice singular). They do provide an easy way to view your most recent log entries, by typing &lt;pre&gt;heroku logs&lt;/pre&gt; which is how I figured out my problem with the log directory.&lt;br /&gt;&lt;br /&gt;So, here is my total time required to deploy this app on Heroku:&lt;br /&gt;- Reading quickstart = 3 minutes&lt;br /&gt;- Installing gem and entering account info = 2 minutes&lt;br /&gt;- Making my app a Heroku app = 1 minute&lt;br /&gt;- Deploying my app for the first time to Heroku = 2 minutes&lt;br /&gt;- Figuring out what I had done wrong from the Heroku documentation = 10 minutes&lt;br /&gt;TOTAL = 18 minutes&lt;br /&gt;&lt;br /&gt;Here were my bonus steps:&lt;br /&gt;- Reading Heroku docs on using a custom domain with Heroku = 1 minute&lt;br /&gt;- Realize I need to rename my app using Heroku command line = 1 minute&lt;br /&gt;- Rename my app using Heroku command line = 1 minute&lt;br /&gt;- Setting my DNS settings to point to Heroku = 5 minutes&lt;br /&gt;- Telling Heroku about my custom domain = 1 minute&lt;br /&gt;TOTAL = 9 minutes&lt;br /&gt;&lt;br /&gt;So there you have it... a fully deployed app, living in the Heroku grid and consequently the Amazon EC2 cloud, in less than 30 minutes, having never used their tools before, including troubleshooting a minor configuration problem. That may seem unfair... and it is. That is exactly the kind of unfair I like on my side!&lt;br /&gt;&lt;br /&gt;Much credit should go to the Heroku team for creating something extremely cool and functional. Important details are still not available, like pricing etc., but at least for now Heroku, is a great way to easily get your app up into the cloud within literally minutes.&lt;br /&gt;&lt;br /&gt;What is the future for Heroku? Funded by &lt;a href="http://ycombinator.com/"&gt;Y Combinator&lt;/a&gt;, they have been quietly working away, and now with Sinatra team leads &lt;a href="http://twitter.com/bmizerany"&gt;Blake Mizerany&lt;/a&gt; and &lt;a href="http://tomayko.com/"&gt;Ryan Tomayko&lt;/a&gt; onboard as well, I think we will be hearing a lot from this exciting little company.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-1317952744739432262?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/1317952744739432262/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=1317952744739432262' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/1317952744739432262'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/1317952744739432262'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2009/04/heroku-why-havent-i-been-using-you-till.html' title='Heroku, Why Haven&apos;t I Been Using You Till Now?'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-2865605080140766062</id><published>2009-04-08T10:12:00.000-07:00</published><updated>2009-04-12T18:38:42.668-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='larubyconf2009'/><category scheme='http://www.blogger.com/atom/ns#' term='los angeles rubyconf'/><category scheme='http://www.blogger.com/atom/ns#' term='larubyconf'/><category scheme='http://www.blogger.com/atom/ns#' term='keynote'/><title type='text'>LARubyConf 2009 - Jim Weirich - "The Grand Unified Thoery of Software Development</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://homepage.mac.com/michaelrevans/photos/tetron-cluster-front.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 240px; height: 192px;" src="http://homepage.mac.com/michaelrevans/photos/tetron-cluster-front.jpg" border="0" alt="" /&gt;&lt;/a&gt;As the 2009 &lt;a href="http://www.larubyconf.com/"&gt;Los Angeles Ruby Conference (LARubyConf)&lt;/a&gt; drew to a close, our keynote speaker &lt;a href="http://onestepback.org/"&gt;Jim Weirich&lt;/a&gt; took the podium. I have seen Jim speak several times, and he is both intelligent, as well as down to earth, which is a rare combination indeed.&lt;br /&gt;&lt;br /&gt;The subject of his keynote would be anything but down to earth. In fact, it would have to be one of the most ambitious talks I have ever seen at a Ruby conference. Only Jim could have pulled it off as he did, with both humor and insight.&lt;br /&gt;&lt;br /&gt;One thing Jim does is have to conduct Tech Interviews. One question he always asks is "What do you look for in a good design?" Most people's answer: "UMMMMMM..."&lt;br /&gt;&lt;br /&gt;Then Jim seemingly shifted themes abruptly, to physics. Specifically, subatomic particles.&lt;br /&gt;&lt;br /&gt;It is known that particles that are charged the same repulse each other. Furthermore, every time you change electric field, there is a changing magnetic field at 90 degree angle.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/James_Clerk_Maxwell"&gt;James Clerk Maxwell&lt;/a&gt;&lt;br /&gt;Maxwell discovered 4 equations that describe relation between electrical and magnetic fields. By describing these two entirely separate forces, combines into single force. Maxwell's work probably greatest contribution to science.&lt;br /&gt;&lt;br /&gt;Then, along came &lt;a href="http://en.wikipedia.org/wiki/Ernest_Rutherford"&gt;Ernest Rutherford&lt;/a&gt;'s famous &lt;a href="http://en.wikipedia.org/wiki/Geiger-Marsden_experiment"&gt;electron experiment&lt;/a&gt;. The one where electrons were supposed to evenly deflect onto a screen, but instead occasionally would deflect wildly. As a result, we now know that matter was mostly open space.&lt;br /&gt;&lt;br /&gt;There are four known forces&lt;br /&gt;- electromagnetic&lt;br /&gt;- gravity&lt;br /&gt;- strong nuclear&lt;br /&gt;- weak nuclear&lt;br /&gt;&lt;br /&gt;The search for the "Unified Field Theory" in physics is a search for a single explanation that accommodates all four forces.&lt;br /&gt;&lt;br /&gt;This is very much like the search for a single explanation for software design.&lt;br /&gt;&lt;br /&gt;Some Commonly Accepted Software Design Principles&lt;br /&gt;- &lt;a href="http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod"&gt;SOLID&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://en.wikipedia.org/wiki/Law_of_Demeter"&gt;Law of Demeter&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://en.wikipedia.org/wiki/Don%27t_repeat_yourself"&gt;DRY&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://clintshank.javadevelopersjournal.com/smallmethods.htm"&gt;Small Methods&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://en.wikipedia.org/wiki/Design_by_contract"&gt;Design by Contract&lt;/a&gt;&lt;br /&gt;  &lt;br /&gt;Lots of ideas about how to write software, but no grand unified theory.&lt;br /&gt;&lt;br /&gt;"The Grand Unified Theory of Software Development"  &lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/Composite-Structured-Design-Glenford-Myers/dp/0442805845"&gt;Composite/Structured Design&lt;/a&gt;&lt;br /&gt;- Glenford J Meyers - 1978&lt;br /&gt;  &lt;br /&gt;Coupling &amp; Cohesion - from best to worst&lt;br /&gt;- no coupling&lt;br /&gt;- data coupling - local data, simple&lt;br /&gt;- stamp coupling - local data, structured&lt;br /&gt;- control coupling&lt;br /&gt;- external coupling - global data, simple&lt;br /&gt;- common coupling - global data, structured&lt;br /&gt;- content coupling - when you reach inside of modules and mess with them from outside&lt;br /&gt;  &lt;br /&gt;control coupling&lt;br /&gt;- method has flag parameter&lt;br /&gt;- flag control which algorithm to use&lt;br /&gt;  &lt;br /&gt;Symptoms&lt;br /&gt;- word OR in description&lt;br /&gt;  &lt;br /&gt;Example:&lt;br /&gt;&lt;pre&gt;Array.instance_methods(true)&lt;/pre&gt; and&lt;br /&gt;&lt;pre&gt;Array.instance_methods(false)&lt;/pre&gt;&lt;br /&gt;    &lt;br /&gt;Which one lists only private methods?&lt;br /&gt;&lt;br /&gt;Another example, Rails does this:&lt;br /&gt;&lt;pre&gt;Customer.find(:all)&lt;/pre&gt; vs. &lt;br /&gt;&lt;pre&gt;Customer.find(:first)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Myers' classification were OK, however failed to extend well to objects and dynamic languages&lt;br /&gt;&lt;br /&gt;Meilir Page-Jones's book &lt;a href="http://www.amazon.com/Every-Programmer-Should-Object-Oriented-Design/dp/0932633315/ref=sr_1_2?ie=UTF8&amp;s=books&amp;qid=1239585961&amp;sr=1-2"&gt;"What Every Programmer Should Know About Object-Oriented Design"&lt;/a&gt; has 3 sections, two of which are not too useful, but the third is very interesting. It talks about the idea of Connascence in software design.&lt;br /&gt;&lt;br /&gt;Connascence - when two things are born and grow up together&lt;br /&gt;Two pieces of code share Connascence when a change in one module requires a corresponding change in the other.&lt;br /&gt;    &lt;br /&gt;CoN  - Connascence of Name&lt;br /&gt;- when code linked by name&lt;br /&gt;- can also apply to databases&lt;br /&gt;- class name is NOT, but parameters are&lt;br /&gt;  &lt;br /&gt;Locality Matters&lt;br /&gt;- if you have things grouped together, there is stronger connascence.&lt;br /&gt;- as dist increase, you reduce connect between them&lt;br /&gt;  &lt;br /&gt;Connescence of Position&lt;br /&gt;- when the order of the params matters&lt;br /&gt;&lt;br /&gt;Low/high degree of CoP&lt;br /&gt;  &lt;br /&gt;When you encounter CoP it is better to transform it to CoN&lt;br /&gt;&lt;br /&gt;Degree Matters&lt;br /&gt;&lt;br /&gt;CoP in test data example&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  User.find(:first)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;  &lt;br /&gt;CoM - Connescence of Meaning&lt;br /&gt;- when two bits of code have to agree on the meaning of data&lt;br /&gt;  &lt;br /&gt;When you encounter CoM it is better to transform it to CoN&lt;br /&gt;&lt;br /&gt;Contranesence is when things have to change opposite to each other&lt;br /&gt;- for example, collision of class names in two different modules&lt;br /&gt;- solution is to use namespaces&lt;br /&gt;  &lt;br /&gt;Another Example?&lt;br /&gt;- do not monkeypatch unless you have to, and if so use namespaces&lt;br /&gt;  &lt;br /&gt;Connascence of Algorithm&lt;br /&gt;- Two methods that do different things, but that are bound together by algorithm. For example, two different bits of code in two different languages that have to talk to each other. JavaScript client, Ruby server is good example.&lt;br /&gt;&lt;br /&gt;CoA -&gt; CoN  &lt;br /&gt;- also known as DRY&lt;br /&gt;  &lt;br /&gt;CoT - Connascence of Timing&lt;br /&gt;- for example, a race condition&lt;br /&gt;  &lt;br /&gt;Summary&lt;br /&gt;- Connascence is the 'quark' of software design  &lt;br /&gt;- Not really any tools to analyze code&lt;br /&gt;- Seems like there is a relation between connascence and design patterns&lt;br /&gt;&lt;br /&gt;Wow! Jim had taken us all the way from subatomic particles, to a start towards a unified theory of software design, and tied it all together nicely. And made it fun! It was a tremendous cap on an excellent conference, and we all had really appreciated Jim's contribution.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-2865605080140766062?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/2865605080140766062/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=2865605080140766062' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/2865605080140766062'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/2865605080140766062'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2009/04/larubyconf-2009-jim-weirich-grand.html' title='LARubyConf 2009 - Jim Weirich - &quot;The Grand Unified Thoery of Software Development'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-3535831316779042982</id><published>2009-04-07T12:19:00.000-07:00</published><updated>2009-04-07T12:41:37.993-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='larubyconf2009'/><category scheme='http://www.blogger.com/atom/ns#' term='los angeles rubyconf'/><category scheme='http://www.blogger.com/atom/ns#' term='larubyconf'/><category scheme='http://www.blogger.com/atom/ns#' term='sinatra'/><title type='text'>LARubyConf 2009 - Blake Mizerany - "Sinatra: the Ultimate Rack Citizen"</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_SgxaAaUGqzY/SduqsU4uYRI/AAAAAAAABuc/jJNFX8yokJk/s1600-h/Picture+1.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 160px; height: 200px;" src="http://1.bp.blogspot.com/_SgxaAaUGqzY/SduqsU4uYRI/AAAAAAAABuc/jJNFX8yokJk/s200/Picture+1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5322035063165968658" /&gt;&lt;/a&gt;I was very happy when the next presenter at the &lt;a href="http://www.larubyconf.com/"&gt;Los Angeles Ruby Conference 2009 (LARubyConf)&lt;/a&gt; was &lt;a href="https://twitter.com/bmizerany"&gt;Blake Mizerany&lt;/a&gt;, creator of the very cool Ruby micro-framework &lt;a href="http://sinatrarb.com"&gt;Sinatra&lt;/a&gt;. As long-time readers of this blog know, I am very into Sinatra. &lt;br /&gt;&lt;br /&gt;There has been an incredible amount of work going into Sinatra lately, so I was very interested to catch up on what the team has been up to.&lt;br /&gt;&lt;br /&gt;What is Sinatra? A Ruby Domain Specific Language (DSL) Mapping REST to simple actions&lt;br /&gt;&lt;br /&gt;Why?&lt;br /&gt;- small&lt;br /&gt;- fast&lt;br /&gt;- great rack and ruby citizen&lt;br /&gt;- strong focus on HTTP&lt;br /&gt;- HTTP caching helpers built in before it was cool&lt;br /&gt;- content negotiation&lt;br /&gt;- no boilerplate&lt;br /&gt;- dead simple config when the default are not enough&lt;br /&gt;- smart configuration&lt;br /&gt;- DOCS- sinatrarb.com&lt;br /&gt;- extending is easy&lt;br /&gt;- rack is the only dependency&lt;br /&gt;- very low WTF to LOC ratio (jeremy mcnally's rubyfringe talk)&lt;br /&gt;&lt;br /&gt;when?&lt;br /&gt;- a few controllers models and views&lt;br /&gt;- starting any web application&lt;br /&gt;- you need reusable apps and/or middleware and/or resources&lt;br /&gt;- you need speed&lt;br /&gt;&lt;br /&gt;who?&lt;br /&gt;- heroku&lt;br /&gt;- github&lt;br /&gt;- taps&lt;br /&gt;- integrity&lt;br /&gt;  &lt;br /&gt;sinatra in your gems&lt;br /&gt;- a mini-github for offline repo browsing&lt;br /&gt;- a local plugin and play wiki&lt;br /&gt;- memcached utilization graphs&lt;br /&gt;- config reusable github hook&lt;br /&gt;  &lt;br /&gt;Example: NotTwitter&lt;br /&gt;  &lt;br /&gt;As classic Sinatra&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;set :username,&lt;br /&gt;  Proc.new { fail "yo"}&lt;br /&gt;  &lt;br /&gt;get '/' do&lt;br /&gt;  ...&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Change&lt;br /&gt;&lt;pre&gt;  require 'sinatra'&lt;/pre&gt;&lt;br /&gt;to&lt;br /&gt;&lt;pre&gt;  require 'sinatra/base'&lt;/pre&gt;&lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;But I want to deploy to Passenger or Heroku! No problem.&lt;br /&gt;&lt;br /&gt;./bin/install-not-twitter&lt;br /&gt;  Copy example config.ru to cwd&lt;br /&gt;  Copy .gems file&lt;br /&gt;  &lt;br /&gt;.ru is a standard Rack config file.&lt;br /&gt;  &lt;br /&gt;.gems is a Heruku configuaration file that will handle any needed Ruby gems installations&lt;br /&gt;  &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  git init &amp;&amp; git add .&lt;br /&gt;  git commit&lt;br /&gt;  heroku craete&lt;br /&gt;  git push heku  aster&lt;br /&gt;  heroku &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;  &lt;br /&gt;3 Awesome Features in Sinatra&lt;br /&gt;  pass - I cannot handle this request, try the next route&lt;br /&gt;  forward - sinatra as middle ware... done my job, let the next app take over... pop in front of rails metal&lt;br /&gt;  use - Sinatra loves rack so much, we made sure not to hide it&lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;Resources&lt;br /&gt;&lt;a href="http://sinatrarb.com"&gt;http://sinatrarb.com&lt;/a&gt;&lt;br /&gt;&lt;a href="http://github.com/rack/rack"&gt;http://github.com/rack/rack&lt;/a&gt;&lt;br /&gt;&lt;a href="http://github.com/rack/rack-contrib"&gt;http://github.com/rack/rack-contrib&lt;/a&gt;&lt;br /&gt;&lt;a href="http://github.com/rtomayko/rack-cache"&gt;http://github.com/rtomayko/rack-cache&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If you are doing everything with Rails, you are probably using too much for the job. Sinatra is simple, fast, and extensible. I am using it in two production applications right now, along with Rails. Sinatra handles parts of the application better than how Rails does, so that is how I roll.&lt;br /&gt;&lt;br /&gt;Especially with the ever increasing momentum behind Rack, Sinatra is a good bet for getting things done. Combined with Rails Metal, and you really have it all.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-3535831316779042982?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/3535831316779042982/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=3535831316779042982' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/3535831316779042982'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/3535831316779042982'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2009/04/larubyconf-2009-blake-mizerany-sinatra.html' title='LARubyConf 2009 - Blake Mizerany - &quot;Sinatra: the Ultimate Rack Citizen&quot;'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_SgxaAaUGqzY/SduqsU4uYRI/AAAAAAAABuc/jJNFX8yokJk/s72-c/Picture+1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-8535399991281094998</id><published>2009-04-05T20:51:00.000-07:00</published><updated>2009-04-06T19:59:42.184-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='larubyconf2009'/><category scheme='http://www.blogger.com/atom/ns#' term='los angeles rubyconf'/><category scheme='http://www.blogger.com/atom/ns#' term='larubyconf'/><category scheme='http://www.blogger.com/atom/ns#' term='danny blitz'/><category scheme='http://www.blogger.com/atom/ns#' term='agile development'/><title type='text'>LARubyConf 2009 - Danny Blitz - "Herding Tigers: Software Development and the Art of War"</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://blog.herdingtigers.com/wp-content/uploads/2009/03/tigerheadonly3.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 250px; height: 181px;" src="http://blog.herdingtigers.com/wp-content/uploads/2009/03/tigerheadonly3.jpg" border="0" alt="" /&gt;&lt;/a&gt;I had no idea what I was about to experience at &lt;a href="http://www.larubyconf.com/"&gt;Los Angeles Ruby Conference 2009 (LARubyConf)&lt;/a&gt; when &lt;a href="http://blog.herdingtigers.com/"&gt;Danny Blitz&lt;/a&gt; took the podium as the next presenter. I had seen him hanging out with his distinctive pompadour, tattoos, and leather jacket. He is a big guy, and hard to miss. But he had been pretty quiet till then, which was about to change radically.&lt;br /&gt;&lt;br /&gt;Herding Cats is a term commonly used when describing the management of software teams. But when Danny Blitz says cats, he means big cats aka tigers. So who is this guy? He has done TONS of stuff, from DOD to Dell, to the DARPA autonomous vehicle challenge. Very cool stuff.&lt;br /&gt;&lt;br /&gt;Get Agility?&lt;br /&gt;&lt;br /&gt;"A good plan violently executed now is better than a perfect plan executed next week" - Patton&lt;br /&gt;&lt;br /&gt;Q. Why is software so difficult?&lt;br /&gt;A. We don't want to face the truth&lt;br /&gt;&lt;br /&gt;Q. Why don't we want to face the truth?&lt;br /&gt;A. We're afraid&lt;br /&gt;&lt;br /&gt;Q. What are we afraid of?&lt;br /&gt;A. We're afraid we do not know anything about end result&lt;br /&gt;&lt;br /&gt;Q. How can we deal with this?&lt;br /&gt;A. Admit the truth&lt;br /&gt;&lt;br /&gt;A tiger team is a small self improving team.&lt;br /&gt;&lt;br /&gt;What can you expect from a tiger team?&lt;br /&gt;Their first project was scheduled to take 5 weeks - took 5 days&lt;br /&gt;&lt;br /&gt;TIGERS ARE A TEAM!&lt;br /&gt;&lt;br /&gt;QA is part of tiger team&lt;br /&gt;&lt;br /&gt;Tigers show leadership&lt;br /&gt;&lt;br /&gt;Tigers self-improve&lt;br /&gt;&lt;br /&gt;Almost no meetings on a tiger team&lt;br /&gt;&lt;br /&gt;QA and test automation are the tip of the spear&lt;br /&gt;&lt;br /&gt;QA should be there from very beginning&lt;br /&gt;&lt;br /&gt;Shared psychology and intelligence&lt;br /&gt;&lt;br /&gt;Winning, boldness, excellence&lt;br /&gt;&lt;br /&gt;Not afraid of the dark&lt;br /&gt;&lt;br /&gt;Who is on team?&lt;br /&gt;- all staff needed to deliver product&lt;br /&gt;- leader, 4 devs, 1 automation engineer, 1 Q, product staff m,ember&lt;br /&gt;- in addition, architecture, system admins, any other support staff&lt;br /&gt;&lt;br /&gt;why warfare?&lt;br /&gt;- business is battle&lt;br /&gt;&lt;br /&gt;There are two kinds of warfare: attrition and maneuver&lt;br /&gt;&lt;br /&gt;Attrition warefare&lt;br /&gt;- traditional, tactical&lt;br /&gt;- clashing head-on&lt;br /&gt;&lt;br /&gt;Maneuver warfare&lt;br /&gt;- internet space&lt;br /&gt;- rapid modern violent&lt;br /&gt;- unexpected movements&lt;br /&gt;&lt;br /&gt;Speed&lt;br /&gt;- it is a competitive weapon&lt;br /&gt;- undeniable advantage in business&lt;br /&gt;&lt;br /&gt;Speed mitigates risk&lt;br /&gt;- not a guarantee&lt;br /&gt;- damage is contained by quickly compensating&lt;br /&gt;&lt;br /&gt;Speed improves the team&lt;br /&gt;&lt;br /&gt;Speed adds to job satisfaction&lt;br /&gt;&lt;br /&gt;Speed allows agile to function properly&lt;br /&gt;- max iteration length (usually 30 days)&lt;br /&gt;&lt;br /&gt;Speed builds credibility&lt;br /&gt;- shows a lot of work in short order&lt;br /&gt;&lt;br /&gt;Cows and tigers&lt;br /&gt;- cow is bigger, but who wins?&lt;br /&gt;&lt;br /&gt;Disease: using agile terms to describe non-agile project&lt;br /&gt;&lt;br /&gt;Corporate animal kingdom&lt;br /&gt;- Tiger&lt;br /&gt;  cautious, calculating, looks to win&lt;br /&gt;&lt;br /&gt;- Cow&lt;br /&gt;  herding&lt;br /&gt;  not known to be original&lt;br /&gt;  afraid of risk&lt;br /&gt;&lt;br /&gt;- Bear&lt;br /&gt;  big, usually mellow&lt;br /&gt;  awesome battle skills&lt;br /&gt;  live and let live attitude&lt;br /&gt;&lt;br /&gt;- Leopard&lt;br /&gt;  truly wild&lt;br /&gt;  will attack at any time&lt;br /&gt;&lt;br /&gt;- Elephant&lt;br /&gt;  huge and tough&lt;br /&gt;  invincible&lt;br /&gt;  best to avoid battle&lt;br /&gt;&lt;br /&gt;- Hyena&lt;br /&gt;  scavenger&lt;br /&gt;  steals food&lt;br /&gt;  evil&lt;br /&gt;&lt;br /&gt;"Tiger teams are like Hell's Programmers" - Danny Blitz&lt;br /&gt;  &lt;br /&gt;Leadership&lt;br /&gt;  this is what makes or breaks&lt;br /&gt;  faith &lt;br /&gt;  love&lt;br /&gt;  hope&lt;br /&gt;  success belongs to the team&lt;br /&gt;  failure belongs to the leader&lt;br /&gt;  buck stops here&lt;br /&gt;  fearlessness&lt;br /&gt;  listener and learner&lt;br /&gt;  protector&lt;br /&gt;    outside influences&lt;br /&gt;    internally too&lt;br /&gt;    team members themselves&lt;br /&gt;    &lt;br /&gt;US marine management techniques&lt;br /&gt;- manage by end state and intent&lt;br /&gt;- reward failure&lt;br /&gt;- demand to be questoned&lt;br /&gt;- glorify the lower levels of organization&lt;br /&gt;    &lt;br /&gt;Politeness and professionalism&lt;br /&gt;- that or poison&lt;br /&gt;    &lt;br /&gt;Agile is not a methodology, it is a mindset, it is inevitable&lt;br /&gt;&lt;br /&gt;Danny says he is working on the book called "Herding Tigers". He has also started a blog at &lt;a href="http://blog.herdingtigers.com"&gt;herdingtigers.com&lt;/a&gt;. All I can say is, he is a very dynamic and exciting speaker. Everyone was captivated, myself included. I'm still not sure how I took these notes.&lt;br /&gt;&lt;br /&gt;Rock on, Danny!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-8535399991281094998?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/8535399991281094998/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=8535399991281094998' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/8535399991281094998'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/8535399991281094998'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2009/04/larubyconf-2009-danny-blitz-herding.html' title='LARubyConf 2009 - Danny Blitz - &quot;Herding Tigers: Software Development and the Art of War&quot;'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-1773667782329100144</id><published>2009-04-05T20:22:00.000-07:00</published><updated>2009-04-05T20:42:25.225-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='larubyconf2009'/><category scheme='http://www.blogger.com/atom/ns#' term='los angeles rubyconf'/><category scheme='http://www.blogger.com/atom/ns#' term='larubyconf'/><category scheme='http://www.blogger.com/atom/ns#' term='sequel'/><title type='text'>LARubyConf 2009 - Jeremy Evans - "Sequel"</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.freeclassicimages.com/images/ghostbusters_2_1989.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 269px; height: 384px;" src="http://www.freeclassicimages.com/images/ghostbusters_2_1989.jpg" border="0" alt="" /&gt;&lt;/a&gt;The next session at the 2009 &lt;a href="http://www.larubyconf.com"&gt;Los Angeles Ruby Conference (LARubyConf)&lt;/a&gt; was &lt;a href="http://code.jeremyevans.net/sequel"&gt;Jeremy Evans&lt;/a&gt; presenting &lt;a href="http://sequel.rubyforge.org/"&gt;Sequel&lt;/a&gt;, which is a very powerful database toolkit for Ruby.&lt;br /&gt;&lt;br /&gt;Ruby originally had adapters for each database. The problem was that each was very database specific. This was a problem due to both SQL differences, as well as API differences.&lt;br /&gt;  &lt;br /&gt;no behavior&lt;br /&gt;&lt;br /&gt;1997 - ruby-postgres was first created. &lt;br /&gt;&lt;br /&gt;2000 - DBI&lt;br /&gt;&lt;br /&gt;2004 - Active Record&lt;br /&gt;Although AR made things easier, it had strong opinions. These opinions did not always map perfectly to any particular database.&lt;br /&gt;&lt;br /&gt;2007 - Sequel&lt;br /&gt;&lt;br /&gt;Completely DB independent API.&lt;br /&gt;&lt;br /&gt;Example is concatanating strings, which requires a completely different syntax in each flavor of SQL database.&lt;br /&gt;&lt;br /&gt;Concise&lt;br /&gt;&lt;br /&gt;Optional Behavior&lt;br /&gt;&lt;br /&gt;Opinions?&lt;br /&gt;&lt;br /&gt;Ruby should be like clay in a child's hands - Matz&lt;br /&gt;&lt;br /&gt;Sequel advantages:&lt;br /&gt;- Simple - as possible but no simpler  &lt;br /&gt;- Flexible - opinions, not dogma&lt;br /&gt;- Powerful&lt;br /&gt;- Lightweight - 1/2 memory usage as active record&lt;br /&gt;- Well maintained&lt;br /&gt;- Easy to Contribute&lt;br /&gt;- Easy to Understand&lt;br /&gt;- More Fun&lt;br /&gt;&lt;br /&gt;Show me the *** code!&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;require 'seq'&lt;br /&gt;DB = Sequal.sqlite('larun')&lt;br /&gt;DB[:attendees].count&lt;br /&gt;# =&gt; 1&lt;br /&gt;&lt;br /&gt;DB[:attendees].first&lt;br /&gt;# =&gt; {:name ='', :address =&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Transactions&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;DB.trans do&lt;br /&gt;  DB[:entry],insert(:account_id =&gt; 1)&lt;br /&gt;&lt;br /&gt;  ...&lt;br /&gt;&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;SQL Loggers&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;DB.loggers &lt;&lt; Logger.new($stdout)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Each DB has its own connection pool&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;DB[:table].all # or .each&lt;br /&gt;&lt;br /&gt;.update(:column =&gt; 'value)&lt;br /&gt;&lt;br /&gt;.delete&lt;br /&gt;&lt;br /&gt;DB[:table] # this is a dataset... like query cursor&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Sequel is a functional API, where object methods return copies of themselves.&lt;br /&gt;&lt;br /&gt;.select - while columns&lt;br /&gt;.filter&lt;br /&gt;.order&lt;br /&gt;&lt;br /&gt;This means you can easily chain function calls, like jQuery. Awesome!&lt;br /&gt;&lt;br /&gt;Sequel represents its internal objects using SQL's own internal representations&lt;br /&gt;&lt;br /&gt;Sequel has 'core' and 'model'&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class Attendee &lt; Sequel::Model&lt;br /&gt;  many_to_one&lt;br /&gt;  one_to_many&lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Hooks &amp; Validations - got 'em&lt;br /&gt;&lt;br /&gt;Sequel it built entirely out of plugins. That sounds interesting, but experience with DataMapper has shown me that too many plugins may not be a good thing. However, I do not have any direct experience with Sequel yet, so this may be a non-issue.&lt;br /&gt;&lt;br /&gt;13 - # of database adapters that Sequel supports today&lt;br /&gt;&lt;br /&gt;Database graphing&lt;br /&gt;&lt;br /&gt;Everything was going so well up to this point. However, Jeremy then tried to do his demo on Windows, just to show that if you are one of the poor souls using Windows, it can still work for you. He failed to account for the quirkiness of conference display adapters, and what that can do to a machine. Oh well, no demo.&lt;br /&gt;&lt;br /&gt;That said, I was really impressed by what I heard about Sequel. I think I will have to try it out on something, just to see how it does.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-1773667782329100144?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/1773667782329100144/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=1773667782329100144' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/1773667782329100144'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/1773667782329100144'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2009/04/larubyconf-2009-jeremy-evans-sequel.html' title='LARubyConf 2009 - Jeremy Evans - &quot;Sequel&quot;'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-2518010880636913213</id><published>2009-04-05T08:49:00.000-07:00</published><updated>2009-04-05T14:53:07.882-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='larubyconf2009'/><category scheme='http://www.blogger.com/atom/ns#' term='los angeles rubyconf'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='larubyconf'/><title type='text'>LARubyConf 2009 - Aaron Patterson - "Journey Thru A Pointy Forest, or You Suck At XML"</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_W1ueYt1O3xs/R0xGYiwAJNI/AAAAAAAAClQ/b7vhHdsJIG4/s320/Ice-covered%2BWillow%2BTrees.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_W1ueYt1O3xs/R0xGYiwAJNI/AAAAAAAAClQ/b7vhHdsJIG4/s320/Ice-covered%2BWillow%2BTrees.jpg" border="0" alt="" /&gt;&lt;/a&gt;The second presentation of the day at &lt;a href="http://www.larubyconf.com/"&gt;Los Angeles Ruby Conference 2009 (LARubyConf)&lt;/a&gt; was &lt;a href="http://tenderlovemaking.com/"&gt;Aaron Patterson&lt;/a&gt;, XML maniac. I had a run at hardcore XML/XSL a few years back, and it has been a while since I walked the razor's edge of the angle bracket. But Aaron is not just an aficionado, he is genuinely obsessed. Given that he is the maintainer of the &lt;a href="http://github.com/tenderlove/nokogiri/tree/master"&gt;Nokogiri&lt;/a&gt; and &lt;a href="http://mechanize.rubyforge.org/"&gt;Mechanize&lt;/a&gt; gems, this makes me happy.&lt;br /&gt;&lt;br /&gt;He covered four areas related to XML: &lt;br /&gt;- XML Processing&lt;br /&gt;- HTML Processing&lt;br /&gt;- Data Extraction&lt;br /&gt;- HTML Correction&lt;br /&gt;&lt;br /&gt;The XML Processing section was as thorough a synopsis of XML as one could possible fit into just a few minutes. He went over the four main XML processing styles:&lt;br /&gt;- SAX&lt;br /&gt;- Push&lt;br /&gt;- Pull&lt;br /&gt;- DOM&lt;br /&gt;&lt;br /&gt;SAX parsers are fast, and low on memory use.  However, searching is hard, doc handlers are verbose, and programmer expense high.&lt;br /&gt;&lt;br /&gt;Push Parsing works the same as SAX, the difference is the programmer controls document IO. Has low memory use, fast, fine control over IO.&lt;br /&gt;&lt;br /&gt;Pull Parsers are handed XML, and yield a node object. They work like cursors, moving thru the document, so you only get one chance to process data without starting over from the beginning again.&lt;br /&gt;&lt;br /&gt;DOM Interface is what most programmers are familiar with. Given XML, they build an in-memory tree. They can then be easily searched using XPath. DOM parsers provide easy data extraction, are programmer friendly, but have high memory use, and you pay a serious speed penalty.&lt;br /&gt;&lt;br /&gt;HTML Processing is just like XML parsing, but it limited to the HTML DOM.&lt;br /&gt;&lt;br /&gt;Data Extraction in XML can be done two different ways: &lt;br /&gt;- CSS selectors&lt;br /&gt;- XPath queries&lt;br /&gt;&lt;br /&gt;XPath basics:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  //foo &amp;lt;!-- start at absolute root --&amp;gt;&lt;br /&gt;  .//foo &amp;lt;!-- start a relative root --&amp;gt;&lt;br /&gt;  //foo[@bar] &amp;lt;!-- has bar attribute --&amp;gt;&lt;br /&gt;  //foo[@bar = 'baz'] &amp;lt;!-- has bar attribute with a value of 'baz' --&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Here is an example of a problem for parsers that support either CSS and XPath selector as parameter, like Hpricot:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;p[b]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The problem is that it is both valid XPath AND CSS. Nokugiri has separate methods for searching CSS or Xpath, so as to avoid this problem.&lt;br /&gt;&lt;br /&gt;XML Namespaces use URL's to remain globally unique, to avoid collisions between XML formats taht are different, but use the same node name. Here is an important point: XML Namespaces are as important as tag names.&lt;br /&gt;&lt;br /&gt;HTML Correction is taking some invalid HTML, and "fixing" it. For example, making sure that all tags are properly nested.&lt;br /&gt;&lt;br /&gt;Aaron wrote a tool called &lt;a href="http://github.com/tenderlove/tree_diff/tree/master"&gt;tree_diff&lt;/a&gt;, that compares XML trees, cause "they are interesting". With this tool he was able to process many HTML files with multiple HTML correctors/parsers, then compare the results to see if they matched. In many cases, they did not!&lt;br /&gt;&lt;br /&gt;Fonts are hard&lt;br /&gt;Attributes are harder&lt;br /&gt;&lt;br /&gt;29% of the time it works all of the time&lt;br /&gt;&lt;br /&gt;Seems like after all that, I will never use anything but Nokogiri for XML parsing again!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-2518010880636913213?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/2518010880636913213/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=2518010880636913213' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/2518010880636913213'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/2518010880636913213'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2009/04/larubyconf-2009-aaron-patterson-journey.html' title='LARubyConf 2009 - Aaron Patterson - &quot;Journey Thru A Pointy Forest, or You Suck At XML&quot;'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_W1ueYt1O3xs/R0xGYiwAJNI/AAAAAAAAClQ/b7vhHdsJIG4/s72-c/Ice-covered%2BWillow%2BTrees.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-7948924043512122841</id><published>2009-04-05T08:35:00.000-07:00</published><updated>2009-04-05T14:51:16.774-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='larubyconf2009'/><category scheme='http://www.blogger.com/atom/ns#' term='los angeles rubyconf'/><category scheme='http://www.blogger.com/atom/ns#' term='ruby waves'/><category scheme='http://www.blogger.com/atom/ns#' term='larubyconf'/><title type='text'>LARubyConf 2009 - Dan Yoder - "Resource Oriented Architectures and Why It Matters"</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://s.wsj.net/public/resources/images/NA-AW447_LA_G_20090312182513.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 277px; height: 185px;" src="http://s.wsj.net/public/resources/images/NA-AW447_LA_G_20090312182513.jpg" border="0" alt="" /&gt;&lt;/a&gt;Lead-off man &lt;a href="http://dev.zeraweb.com/blog/mousetrap-2"&gt;Dan Yoder&lt;/a&gt; started off the day's proceedings at the &lt;a href="http://www.larubyconf.com/"&gt;Los Angeles Ruby Conference (LARubyConf) 2009&lt;/a&gt;, with a presentation on &lt;a href="http://rubywaves.com/"&gt;Ruby Waves&lt;/a&gt; called "Resource Oriented Architectures and Why It Matters". Despite not getting the same attention that some Ruby frameworks have, the Waves team has been tirelessly working on it. According to Dan, the foundation of Waves has gotten pretty solid. Waves adds a lot of support for things over and above just handling http requests. So what is Waves really? It is a layer on top of &lt;a href="http://rack.rubyforge.org/"&gt;Rack&lt;/a&gt; for defining application frameworks.&lt;br /&gt;&lt;br /&gt;The next thing beyond MVC is to help developers write more rest compliant apps. &lt;br /&gt;&lt;br /&gt;But do the constraints in REST really buy anything? Actually, yes.&lt;br /&gt;&lt;br /&gt;One nice thing about internet-based development, is that the existing infrastructure is already there like proxies, load balancers etc.&lt;br /&gt;&lt;br /&gt;But why does it work? At the heart are the constraints.&lt;br /&gt;&lt;br /&gt;The web is NOT MVC&lt;br /&gt;- so why do we use it so often for web apps&lt;br /&gt;- piggybacking off of the web browser&lt;br /&gt;&lt;br /&gt;Example of busting out of the browser - RSS feeds from blogs and podcasts&lt;br /&gt;&lt;br /&gt;OAuth SMART Proxies&lt;br /&gt;&lt;br /&gt;Video Search&lt;br /&gt;- edge caching&lt;br /&gt;&lt;br /&gt;Resource Oriented Architecture (ROA) is just distributed objects, loosely based on Roy Fielding's definition&lt;br /&gt;&lt;br /&gt;ROA solves an old problem, that there have been many attempts at solving previously with CORBA, COM, etc. But this time will be different.&lt;br /&gt;&lt;br /&gt;Learning From Past Mistakes&lt;br /&gt;- be platform neutral&lt;br /&gt;- be wire neutral (any protocol)&lt;br /&gt;- define meta-object protocols&lt;br /&gt;- good performance, use edge and client caching&lt;br /&gt;- allow layered architectures&lt;br /&gt;&lt;br /&gt;Waves and ROA&lt;br /&gt;&lt;br /&gt;Rich DSL for HTTP Requests&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;on (:get, ['location'],&lt;br /&gt;  :query =&gt; {:lat =&gt; /\d{4}/, :long =&gt; /\d{4}/},&lt;br /&gt;  :accept =&gt; [:json, :xml])&lt;br /&gt;&lt;/pre&gt;  &lt;br /&gt;But it is still Ruby!&lt;br /&gt;&lt;br /&gt;The One File Waves App&lt;br /&gt;- influenced by Sinatra&lt;br /&gt;- not quite as clean as Sinatra&lt;br /&gt;&lt;br /&gt;Roadmap&lt;br /&gt;&lt;br /&gt;A Resource DSL Example&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class Blog&lt;br /&gt;  include Waves::Resource::Server&lt;br /&gt;  &lt;br /&gt;  resource :list, :expires =&gt; 3.days, ['blogs'] do&lt;br /&gt;    get { model.find_all}&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  ...&lt;br /&gt;  &lt;br /&gt;  schema :element, ['schema', 'blog', '2009-03'] do&lt;br /&gt;    attributes :title, String, :descriptions =&gt; String&lt;br /&gt;    link :entries, :list =&gt; Story&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  ...&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;What's with that "schema" block? This example also defines the RDF schema for the resource to provide machine-discoverability. That is one very cool aspect of ROA that I personally have not seen addressed much within the Ruby community.&lt;br /&gt;&lt;br /&gt;Waves is really coming along, and I am planning to explore it a bit in the coming weeks. For more info, go check out &lt;a href="http://rubywaves.org"&gt;http://rubywaves.com&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-7948924043512122841?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/7948924043512122841/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=7948924043512122841' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/7948924043512122841'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/7948924043512122841'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2009/04/larubyconf-2009-dan-yoder-resource.html' title='LARubyConf 2009 - Dan Yoder - &quot;Resource Oriented Architectures and Why It Matters&quot;'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-8817374980458373980</id><published>2009-04-05T07:48:00.001-07:00</published><updated>2009-04-12T18:42:42.778-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='larubyconf2009'/><category scheme='http://www.blogger.com/atom/ns#' term='los angeles rubyconf'/><category scheme='http://www.blogger.com/atom/ns#' term='larubyconf'/><title type='text'>LARubyConf 2009 Was A Big Success</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3448/3212016570_94c779a2e0.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 333px; height: 222px;" src="http://farm4.static.flickr.com/3448/3212016570_94c779a2e0.jpg" border="0" alt="" /&gt;&lt;/a&gt;Yesterday was the first ever &lt;a href="http://www.larubyconf.com"&gt;Los Angeles Ruby Conference&lt;/a&gt;. Despite being located a bit out of the way, down in Tustin, the venue was actually completely amazing. Called the &lt;a href="http://www.marconimuseum.org/"&gt;Marconi Automotive Museum&lt;/a&gt;, the place was like "Robin Master's garage" quipped one attendee, being that it was FULL of Ferrari's and other highly valuable and hot sports cars.&lt;br /&gt;&lt;br /&gt;Thanks to the tireless efforts of &lt;a href="http://www2.confreaks.com/"&gt;Coby Randquist&lt;/a&gt; and &lt;a href="http://www.jrfent.com/blog/"&gt;JR Fent&lt;/a&gt;, along with a host of others, this first conference was a tremendous success. There was an incredible lineup of speakers, with something for everyone. All of us who attended were really impressed by the quality of the event. There was even one guy who came all the way from Boston (this is great time of year to visit California from the east coast, people). After a short introduction, the program was off and running.&lt;br /&gt;&lt;br /&gt;The sessions were:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://deadprogrammersociety.blogspot.com/2009/04/larubyconf-2009-dan-yoder-resource.html"&gt;Dan Yoder - "Resource Oriented Architectures and Why It Matters"&lt;/a&gt;&lt;br /&gt;&lt;a href="http://deadprogrammersociety.blogspot.com/2009/04/larubyconf-2009-aaron-patterson-journey.html"&gt;Aaron Patterson - "Journey Thru A Pointy Forest, or You Suck At XML"&lt;/a&gt;&lt;br /&gt;&lt;a href="http://deadprogrammersociety.blogspot.com/2009/04/larubyconf-2009-jeremy-evans-sequel.html"&gt;Jeremy Evans - "Sequel"&lt;/a&gt;&lt;br /&gt;&lt;a href="http://deadprogrammersociety.blogspot.com/2009/04/larubyconf-2009-danny-blitz-herding.html"&gt;Danny Blitz - "Herding Tigers - Software Development and the Art of War"&lt;/a&gt;&lt;br /&gt;Wolfram Arnold - "Scaling 'most popular' lists: a plugin solution"&lt;br /&gt;&lt;a href="http://deadprogrammersociety.blogspot.com/2009/04/larubyconf-2009-blake-mizerany-sinatra.html"&gt;Blake Mizerany - "Sinatra: The Ultimate Rack Citizen"&lt;/a&gt;&lt;br /&gt;Michael Fairchild &amp; Ari Lerner - "Poolparty.rb"&lt;br /&gt;Bill Lapcevic - "Managing Ruby on Rails for High Performance"&lt;br /&gt;Ron Evans &amp; Damen Evans - "Flying Robot: Unmanned Aerial Vehicles using Ruby and Arduino"&lt;br /&gt;John Barnette &amp; Aaron Patterson - "Johnson"&lt;br /&gt;Pradeep Elankumaran - "Fast and Scalable Front/Back-end Services using Ruby, Rails, and XMPP"&lt;br /&gt;Brendan Lim - "Mobilize Your Rails Application"&lt;br /&gt;Adam Blum - "Rhodes Framework for Mobile Client Development"&lt;br /&gt;&lt;a href="http://deadprogrammersociety.blogspot.com/2009/04/larubyconf-2009-jim-weirich-grand.html"&gt;Jim Weirich - Keynote speech - "The Grand Unified Theory of Software Development"&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I took copious notes, and so I will be posting separately for each session, to avoid a massive blob post. The sessions were quite excellent, our demo of flying_robot was really well received, and Jim Weirich's keynote was by turns funny and thought provoking.&lt;br /&gt;&lt;br /&gt;Thank you to everyone who participated by organizing, presenting, and/or attending LARubyConf. The 110 or so people there really appreciated it! I had a great time, learned a lot, met some great new people, and got to see some old friends. I really look forward to the next one!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-8817374980458373980?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/8817374980458373980/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=8817374980458373980' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/8817374980458373980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/8817374980458373980'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2009/04/larubyconf-2009-was-big-success.html' title='LARubyConf 2009 Was A Big Success'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3448/3212016570_94c779a2e0_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-1141594029364773497</id><published>2009-03-31T12:28:00.000-07:00</published><updated>2009-03-31T13:06:26.329-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><title type='text'>The Twitter 1-2-3 Rule</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.crawlofthedead.com/images/uploads/sockzombies.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 263px; height: 225px;" src="http://www.crawlofthedead.com/images/uploads/sockzombies.jpg" border="0" alt="" /&gt;&lt;/a&gt;I just had a small realization: there is a perfect ratio for Twitter use. Wait, before you laugh and hit the back button, hear me out on the following idea. &lt;br /&gt;&lt;br /&gt;There is an emergent trend in optimal Twitter use:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;If you have X followers,&lt;br /&gt;You should have 2X people that YOU follow&lt;br /&gt;And have made 3X updates&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Get it? Twitter 1-2-3. Nice simple rule...&lt;br /&gt;&lt;br /&gt;Here is what is means if these ratios are out of whack:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Less then 2X people that you follow = who do you think you are, Shaq?&lt;/li&gt;&lt;br /&gt;&lt;li&gt;More than 2X people that you follow = perhaps you should do something besides Twitter?&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Less then 3X updates = why are so many people following you?&lt;/li&gt;&lt;br /&gt;&lt;li&gt;More than 3x updates = you really like to listen to yourself, don't you?&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-1141594029364773497?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/1141594029364773497/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=1141594029364773497' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/1141594029364773497'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/1141594029364773497'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2009/03/twitter-1-2-3-rule.html' title='The Twitter 1-2-3 Rule'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-7563943671341588038</id><published>2009-03-24T09:59:00.000-07:00</published><updated>2009-03-24T10:29:11.641-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AdaLovelaceDay09'/><title type='text'>Let's Celebrate The Female Side Of Tech</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://videodetective.com/photos/139/005871_7.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://videodetective.com/photos/139/005871_7.jpg" border="0" alt="" /&gt;&lt;/a&gt;It is &lt;a href="http://findingada.com/"&gt;Ada Lovelace Day today&lt;/a&gt;, and to support the women in technology, bloggers all over the world are celebrating the female side of tech. What do I mean? You may not know it from the throngs of hairy guys at tech events, but not only are there women in tech, they have done a lot to make YOUR life easier. Let's review a couple current ladies of technology that have been rocking my world.&lt;br /&gt;&lt;br /&gt;First of all, no mention of modern geek tech can even begin without another &lt;a href="http://www.ladyada.net"&gt;Ladyada&lt;/a&gt;, aka Limor Fried. As the proprietor of &lt;a href="http://www.adafruit.com/"&gt;Adafruit&lt;/a&gt;, she has done a lot to make physical computing with Arduino and other cool hardware a lot more accessible for novices, as well as helping out pros when they are stuck. As as engineer and MIT alumni, she is a great leader in the electronics community. We could not have made the progress we have on the flying_robot project, without her great hardware and helpful blogging.&lt;br /&gt;&lt;br /&gt;Another female developer I know is &lt;a href="http://www.oreillynet.com/pub/au/3253"&gt;Andrea O.K. Wright&lt;/a&gt;. Andrea is a very serious Rubyist, and did a really great talk on Ruby in gaming that I attended a while back. She was even kind enough to remember to send me a couple links to some of the tech she had mentioned in the presentation.&lt;br /&gt;&lt;br /&gt;We smelly guys have to be be a bit more welcoming to the women of tech. Why? Not even for any of the standard reasons related to social progressivism. Simply enough, we all need all the help we can get, and not encouraging women to explore their interests in technology, is like losing 50% of the potential advancement we could be collectively making.&lt;br /&gt;&lt;br /&gt;'Nuff Said!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-7563943671341588038?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/7563943671341588038/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=7563943671341588038' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/7563943671341588038'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/7563943671341588038'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2009/03/lets-celebrate-female-side-of-tech.html' title='Let&apos;s Celebrate The Female Side Of Tech'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-3720140739333408714</id><published>2009-03-21T13:47:00.000-07:00</published><updated>2009-03-21T14:10:51.881-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='flying robot'/><category scheme='http://www.blogger.com/atom/ns#' term='arduino'/><category scheme='http://www.blogger.com/atom/ns#' term='ruby arduino development'/><category scheme='http://www.blogger.com/atom/ns#' term='uav'/><category scheme='http://www.blogger.com/atom/ns#' term='unmanned aerial vehicles'/><title type='text'>Project Flying Robot: I Believe I Can Fly</title><content type='html'>&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Jbv6oNs3jdI&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/Jbv6oNs3jdI&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;At long last, after many obstacles to be surmounted, yesterday we achieved liftoff. The &lt;a href="http://github.com/deadprogrammer/flying_robot_rogue_one/tree/master"&gt;blimp prototype "Rogue 1"&lt;/a&gt; of our &lt;a href="http://github.com/deadprogrammer/flying_robot"&gt;flying_robot&lt;/a&gt; project to create a platform for &lt;a href="http://rad.rubyforge.org/"&gt;Ruby Arduino Development&lt;/a&gt; powered Unmanned Aerial Vehicles has achieved an important milestone.&lt;br /&gt;&lt;br /&gt;After our third complete rewiring of the main circuit board, two burned out &lt;a href="http://www.pololu.com/catalog/product/410"&gt;Pololu micro serial motor controllers&lt;/a&gt;, some time reviewing the schematics of the &lt;a href="http://diydrones.com/profiles/blog/show?id=705844%3ABlogPost%3A44817"&gt;Blimpduino&lt;/a&gt; project, and too many revisions to the basic software to list here, we had finally gotten everything ready for what would hopefully be a successful flight test.&lt;br /&gt;&lt;br /&gt;There were some major limitations to this test, which was mostly intended to verify proper functioning and integration of the hardware. Happening inside my brother's small apartment, we would not be able to really do much flying. Also, we were going to measure our maximum payload capacity, but not really planning on balancing the blimp to achieve a proper neutral buoyancy.&lt;br /&gt;&lt;br /&gt;The final assembly took place, we did a quick flight check, and you can see for yourself the results in this poorly shot and edited, but somehow still amusing video.&lt;br /&gt;&lt;br /&gt;Now, this thing is really starting to take off!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-3720140739333408714?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/3720140739333408714/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=3720140739333408714' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/3720140739333408714'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/3720140739333408714'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2009/03/project-flying-robot-i-believe-i-can.html' title='Project Flying Robot: I Believe I Can Fly'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-812538134998310510</id><published>2009-03-17T15:52:00.000-07:00</published><updated>2009-03-18T09:57:03.151-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='larubyconf2009'/><category scheme='http://www.blogger.com/atom/ns#' term='flying robot'/><category scheme='http://www.blogger.com/atom/ns#' term='larubyconf'/><title type='text'>Come Fly With Us At Los Angeles RubyConf 2009</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.cinepad.com/fs_covers/fs_fly.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 225px; height: 225px;" src="http://www.cinepad.com/fs_covers/fs_fly.jpg" border="0" alt="" /&gt;&lt;/a&gt;Yes, the rumors are true, our talk for &lt;a href="http://www.larubyconf.com"&gt;LARubyConf&lt;/a&gt; was accepted. If you want to see the first ever public live demonstration of &lt;a href="http://github.com/deadprogrammer/flying_robot"&gt;flying_robot&lt;/a&gt;, the real thing, actually flying around and such, come check it out live and direct at the first Los Angeles Ruby Conference on April 4. &lt;br /&gt;&lt;br /&gt;I do yet not know exactly what our demo will include, but from what we have been doing so far in the lab, you won't want to miss this one. Unless what you get to witness is massive fail. Either way, it will be spectacular.&lt;br /&gt;&lt;br /&gt;Not to mention, there are some really excellent presentations happening. Actually useful stuff you might put into daily practice. We're talking shining beacons of the Ruby community like &lt;a href="http://onestepback.org/"&gt;Jim Weirich&lt;/a&gt;, &lt;a href="http://code.jeremyevans.net//"&gt;Jeremy Evans&lt;/a&gt;, &lt;a href="http://tenderlovemaking.com/"&gt;Aaron Patterson&lt;/a&gt;, &lt;a href="http://www.danielphilpott.com"&gt;Daniel Philpott&lt;/a&gt;, &lt;a href="http://dev.zeraweb.com/blog/mousetrap-2"&gt;Dan Yoder&lt;/a&gt;, my boys &lt;a href="http://blog.xnot.org/"&gt;Ari Lerner&lt;/a&gt; &amp; &lt;a href="http://www.linkedin.com/in/cloudcompute"&gt;Michael Fairchild&lt;/a&gt;, and many, many more.  So if you have not registered yet, get with it!&lt;br /&gt;&lt;a href="http://www.larubyconf.com/registration_information"&gt;&lt;br /&gt;Click here RIGHT NOW and register for LARubyConf&lt;/a&gt;. Do it!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-812538134998310510?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/812538134998310510/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=812538134998310510' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/812538134998310510'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/812538134998310510'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2009/03/come-fly-with-us-at-los-angeles.html' title='Come Fly With Us At Los Angeles RubyConf 2009'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-1125553440057657299</id><published>2009-03-15T17:57:00.000-07:00</published><updated>2009-03-15T20:18:06.559-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flying robot'/><category scheme='http://www.blogger.com/atom/ns#' term='arduino'/><category scheme='http://www.blogger.com/atom/ns#' term='los angeles rubyconf'/><category scheme='http://www.blogger.com/atom/ns#' term='ruby arduino development'/><category scheme='http://www.blogger.com/atom/ns#' term='uav'/><category scheme='http://www.blogger.com/atom/ns#' term='rad'/><category scheme='http://www.blogger.com/atom/ns#' term='unmanned aerial vehicles'/><title type='text'>Project Flying Robot: Better To Burn Out Than Fade Away?</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.wired.com/images/article/full/2008/04/hindenburg_500px.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 250px; height: 196px;" src="http://www.wired.com/images/article/full/2008/04/hindenburg_500px.jpg" border="0" alt="" /&gt;&lt;/a&gt;We had &lt;a href="http://deadprogrammersociety.blogspot.com/2009/02/project-flying-robot-adventure-begins.html"&gt;made&lt;/a&gt; &lt;a href="http://deadprogrammersociety.blogspot.com/2009/02/project-flying-robot-getting-all-xbee.html"&gt;incredible&lt;/a&gt; &lt;a href="http://deadprogrammersociety.blogspot.com/2009/02/project-flying-robot-compass-two-motors.html"&gt;strides&lt;/a&gt; &lt;a href="http://deadprogrammersociety.blogspot.com/2009/02/project-flying-robot-flying-dorkboard.html"&gt;forward&lt;/a&gt; in our &lt;a href="http://deadprogrammersociety.blogspot.com/2009/03/project-flying-robot-by-your-command.html"&gt;construction&lt;/a&gt; of &lt;a href="http://github.com/deadprogrammer/flying_robot_rogue_one/tree/master"&gt;"Rogue 1"&lt;/a&gt; our autonomous blimp that we are building as the first implementation of &lt;a href="http://github.com/deadprogrammer/flying_robot_rogue_one/tree/master"&gt;flying_robot&lt;/a&gt;, our &lt;a href="http://www.arduino.cc"&gt;Arduino&lt;/a&gt;-framework for Unmanned Aerial Vehicles based on top of &lt;a href="http://rad.rubyforge.org/"&gt;Ruby Arduino Development (RAD)&lt;/a&gt;. We are also heavily influenced by the cool &lt;a href="http://diydrones.com/profiles/blog/show?id=705844%3ABlogPost%3A44817"&gt;Blimpduino&lt;/a&gt; project. We were finally ready for a live test... or so we thought. We inflated our envelope, and &lt;a href="http://myfirstairship.blogspot.com/"&gt;my brother&lt;/a&gt; attached the gondola that he has been carefully constructing.&lt;br /&gt;&lt;br /&gt;We had already done some testing of the software/hardware, so we were heady with our previous successes. "Let 'er rip," said Damen. Next thing you know, the blimp was careening about, as the motors pulsed wildly out of control, then stopped abruptly. "That is not a good sign from an electric motor controller, " said my brother glumly.&lt;br /&gt;&lt;br /&gt;We peeled the gondola off the envelope, and disassembled the components that had been connected so carefully, and yet not carefully enough. Multimeter in hand, Damen carefully traced each connection looking for power as I entered the commands into the serial interface.&lt;br /&gt;&lt;br /&gt;Finally, after a few moments we looked at each other. There was one more test... we rewired everything properly, but using the spare &lt;a href="http://www.pololu.com/catalog/product/410"&gt;Pololu Micro Dual Serial Controller&lt;/a&gt; and a breadboard. I entered the commands and the motors powered up. Now there was only one conclusion: we had fried our costly little Pololu.&lt;br /&gt;&lt;br /&gt;Ouch! After spending a while on post-mortem analysis of our dead little bird, Damen muttered something about power. "Huh?" I looked up from debugging the Arduino code for the differential thrust calculations.&lt;br /&gt;&lt;br /&gt;"Power. We need less power."&lt;br /&gt;&lt;br /&gt;"Less power? I thought the specs said that controller was rated for more than our LiPo battery and more?"&lt;br /&gt;&lt;br /&gt;"Specs lie."&lt;br /&gt;&lt;br /&gt;I had to acknowledge the simple truth of that statement, especially given the obviously dead chip. With a lot more knowledge about our bimps power requirements, learned the hard way, Damen began planning the third iteration of our main board wiring, with a new extra power regulator. And an external kill switch.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-1125553440057657299?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/1125553440057657299/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=1125553440057657299' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/1125553440057657299'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/1125553440057657299'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2009/03/project-flying-robot-better-to-burn-out.html' title='Project Flying Robot: Better To Burn Out Than Fade Away?'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-3974810775568423679</id><published>2009-03-10T13:52:00.000-07:00</published><updated>2009-03-10T13:53:02.511-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='flying robot'/><category scheme='http://www.blogger.com/atom/ns#' term='arduino'/><category scheme='http://www.blogger.com/atom/ns#' term='ruby arduino development'/><title type='text'>Project Flying Robot: By Your Command</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://paulsstarbasef22.homestead.com/files/Cylon_raider1.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 232px; height: 162px;" src="http://paulsstarbasef22.homestead.com/files/Cylon_raider1.jpg" border="0" alt="" /&gt;&lt;/a&gt;Our &lt;a href="http://github.com/deadprogrammer/flying_robot/tree/master"&gt;flying_robot&lt;/a&gt; project for Unmanned Aerial Vehicles has been underway for a few weeks now. Much soldering, and playing around with cool &lt;a href="http://www.arduino.cc/"&gt;Arduino&lt;/a&gt; tricks has been taking place. You can read more &lt;a href="http://deadprogrammersociety.blogspot.com/2009/02/project-flying-robot-adventure-begins.html"&gt;here&lt;/a&gt;, &lt;a href="http://deadprogrammersociety.blogspot.com/2009/02/project-flying-robot-getting-all-xbee.html"&gt;here&lt;/a&gt;, &lt;a href="http://deadprogrammersociety.blogspot.com/2009/02/project-flying-robot-compass-two-motors.html"&gt;here&lt;/a&gt;, and &lt;a href="http://deadprogrammersociety.blogspot.com/2009/02/project-flying-robot-flying-dorkboard.html"&gt;here&lt;/a&gt; if you need to catch up.&lt;br /&gt;&lt;br /&gt;One aspect that I have mentioned several times, but not gotten into much detail about, is our protocol for communicating with the UAV from the ground station. It is amazing to me, but there is still no dominant digital protocol for controlling UAV's. Many people are this using analog radio controllers, with some kind of sideband channel for autopilot commands.&lt;br /&gt;&lt;br /&gt;There are a few characteristics that seem essential to me for a proper ground control system design:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;A nice way to send control stick commands from a "virtual r/c" that can be used with any UAV&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Consistent way to send autopilot commands&lt;/li&gt;&lt;br /&gt;&lt;li&gt;A way to be able to read the instruments remotely, and display them as part of your "control surface"&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Another observation I have, is that there is every current Arduino UAV project has an entirely different code base. There also does not seem to be any practical way for these projects to share much, even though they are all targeting the same microcontroller. &lt;br /&gt;&lt;br /&gt;Certain characteristics seem essential for developing on-board UAV system programming, but are lacking in any of the projects I was able to find:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;A nice, modular way to put together the pieces you need in software that match the hardware configuration for that particular vehicle&lt;/li&gt; &lt;br /&gt;&lt;li&gt;A high-level domain specific language (DSL) to specify the UAV's behavior, and not just programming in C++ or assembly language&lt;/li&gt;&lt;br /&gt;&lt;li&gt;A consistent programming interface that corresponds to the protocol used by various ground controllers&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;With all of these design criteria in mind, I have been implementing the flying_robot command parser and interface. Here is an example of the minimum code required to create a UAV using the current implementation:&lt;br /&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/77115.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;As you can tell, there is not all that much to it. The base for a UAV in 34 lines of code.&lt;br /&gt;&lt;br /&gt;The most current code for the actual "Rogue 1" LTA vehicle is being committed to &lt;a href='http://github.com/deadprogrammer/flying_robot_rogue_one/tree/master'&gt;http://github.com/deadprogrammer/flying_robot_rogue_one/tree/master&lt;/a&gt; if you want to follow along with our progress. &lt;br /&gt;&lt;br /&gt;Next post, we test the main thrusters and vectoring controllers, and nearly start a fire...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-3974810775568423679?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/3974810775568423679/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=3974810775568423679' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/3974810775568423679'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/3974810775568423679'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2009/03/project-flying-robot-by-your-command.html' title='Project Flying Robot: By Your Command'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-9205388754598288316</id><published>2009-03-06T11:35:00.000-08:00</published><updated>2009-03-06T12:12:22.600-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web development'/><category scheme='http://www.blogger.com/atom/ns#' term='user interface'/><title type='text'>Playing With Hoops, or Every Step You Take</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.stpete.org/athletics/images/Basketball.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 400px; height: 306px;" src="http://www.stpete.org/athletics/images/Basketball.jpg" border="0" alt="" /&gt;&lt;/a&gt;I do not often pay full attention to &lt;a href="http://gilesbowkett.blogspot.com/"&gt;Giles Bowkett&lt;/a&gt;. That is the flip side of being the provocateur that he is, some people will occasionally tune out. However, when anyone plays the &lt;a href="http://www.sensible.com/"&gt;Steve Krug&lt;/a&gt; card, I am compelled to take a look.&lt;br /&gt;&lt;br /&gt;Yesterday, Giles posted a dead-on point about user registration, called &lt;a href="http://gilesbowkett.blogspot.com/2009/03/i-dont-care-about-your-hoops.html"&gt;"I Don't Care About Your Hoops"&lt;/a&gt;. When you compare the success of simplicity, as in the Google and Apple examples, to what we all tend to fall into, I hope you are as embarrassed as I was. Time for some self-examination.&lt;br /&gt;&lt;br /&gt;I was ready to hack down the user signup process to size. Here are my new rules:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;4 or more registration steps = FAIL&lt;/li&gt;&lt;br /&gt;&lt;li&gt;3 registration steps = A long shot, but you might make it&lt;/li&gt;&lt;br /&gt;&lt;li&gt;2 registration steps = At the top of the key, worth taking a shot, but no sure thing&lt;/li&gt;&lt;br /&gt;&lt;li&gt;1 registration step = A free throw, you should easily sink it&lt;/li&gt;&lt;br /&gt;&lt;li&gt;0 registration steps = Slamdunk ala Michael Jordan. Ain't no stopping us now.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-9205388754598288316?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/9205388754598288316/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=9205388754598288316' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/9205388754598288316'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/9205388754598288316'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2009/03/playing-with-hoops-or-every-step-you.html' title='Playing With Hoops, or Every Step You Take'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-8260619216035051592</id><published>2009-02-28T08:53:00.000-08:00</published><updated>2009-02-28T09:24:43.188-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flying robot'/><category scheme='http://www.blogger.com/atom/ns#' term='arduino'/><category scheme='http://www.blogger.com/atom/ns#' term='dorkboard'/><category scheme='http://www.blogger.com/atom/ns#' term='ruby arduino development'/><title type='text'>Project Flying Robot: The Flying Dorkboard</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_2iIswAD6O1U/SaRAXOWcBSI/AAAAAAAAAAw/t2qntX2W2lA/s320/Pictures+122.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 240px; height: 320px;" src="http://3.bp.blogspot.com/_2iIswAD6O1U/SaRAXOWcBSI/AAAAAAAAAAw/t2qntX2W2lA/s320/Pictures+122.jpg" border="0" alt="" /&gt;&lt;/a&gt;As we proceeded along with our &lt;a href="http://github.com/deadprogrammer/flying_robot/tree/master"&gt;flying_robot&lt;/a&gt; project, one thing became abundantly clear: weight matters. The &lt;a href="http://www.arduino.cc/en/Main/ArduinoBoardDiecimila"&gt;Arduino Diecimilla&lt;/a&gt; that we had been using up to this point, although a fine package for beginners, was just not going to make it when it came time to weigh in. Yes, there is the &lt;a href="http://www.arduino.cc/en/Main/ArduinoBoardNano"&gt;Arduino Nano&lt;/a&gt;, but it is not a cheap device. Also, it has a few options that were not important to us, like the integrated USB, since we planned on only using &lt;a href="http://www.digi.com/technology/wireless/products.jsp"&gt;XBee&lt;/a&gt; based communication with the blimp.&lt;br /&gt;&lt;br /&gt;I had been doing some research, and have learned a lot more about this whole Arduino ecosystem. There is incredible work being done by people like &lt;a href="http://www.ladyada.net/"&gt;ladyada&lt;/a&gt;, and many others too numerous to list here. There are many variations on the Arduino, like the &lt;a href="http://www.ladyada.net/make/boarduino/"&gt;Boarduino&lt;/a&gt;, &lt;a href="http://www.wulfden.org/TheShoppe/freeduino/sanguino.shtml"&gt;Sanguino&lt;/a&gt;, and so many others. &lt;br /&gt;&lt;br /&gt;However, one option in particular caught my attention, called the &lt;a href="http://dorkbotpdx.org/wiki/dorkboard"&gt;Dorkboard&lt;/a&gt;. This thing is small, I mean tiny. Especially considering that it does not use the surface mount version of the ATMega microcontroller. And it has almost nothing on the board itself. You need to provide both power, and an interface to communicate with it, in our case, using the XBee modems.&lt;br /&gt;&lt;br /&gt;This highly stripped down, minimalist approach was exactly what we had been looking for! Cheap, simple, light, and having everything that one needs from any Arduino/Freeduino platform. I ordered a few of the kits, and they were shipped from &lt;a href="http://www.wulfden.org/TheShoppe/products.shtml"&gt;Wulfden&lt;/a&gt; just a few days later.&lt;br /&gt;&lt;br /&gt;Once they came in, my brother was eager to get right into one. I dropped off the package, and he had soldered up one, plus the power supply, in less then an hour. We had the &lt;a href="http://wulfden.org/TheShoppe/pa/index.shtml"&gt;USB-BUB&lt;/a&gt; interface, so we just plugged it in. Once we had all the cable pinout correct, and we had downloaded the "hello, LED" code from &lt;a href="http://rad.rubyforge.org/"&gt;RAD&lt;/a&gt;, we were watching it flash under our command.&lt;br /&gt;&lt;br /&gt;The brain of our flying robot was ready! Now we needed a way to communicate with it, and update its code, all wirelessly. The next step, would be building an XBee breakout board, and doing some XBee hardware/firmware hacking...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-8260619216035051592?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/8260619216035051592/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=8260619216035051592' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/8260619216035051592'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/8260619216035051592'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2009/02/project-flying-robot-flying-dorkboard.html' title='Project Flying Robot: The Flying Dorkboard'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_2iIswAD6O1U/SaRAXOWcBSI/AAAAAAAAAAw/t2qntX2W2lA/s72-c/Pictures+122.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-3838179361000769149</id><published>2009-02-27T15:07:00.000-08:00</published><updated>2009-02-27T15:13:33.829-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby on rails'/><category scheme='http://www.blogger.com/atom/ns#' term='railsconf2009'/><category scheme='http://www.blogger.com/atom/ns#' term='railsconf 2009'/><title type='text'>RailsConf 2009 Program Is Looking Juicy</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.h4x3d.com/feat/themes/orange.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 150px;" src="http://www.h4x3d.com/feat/themes/orange.jpg" border="0" alt="" /&gt;&lt;/a&gt;I just noticed that there are already a whole bunch of the approved presentations for RailsConf 2009 on up the web site &lt;a href="http://en.oreilly.com/rails2009/public/schedule/presentations/General"&gt;here&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;It is looking really good already, go check it out. If you are into Ruby on Rails, you really should be going... I am!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-3838179361000769149?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/3838179361000769149/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=3838179361000769149' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/3838179361000769149'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/3838179361000769149'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2009/02/railsconf-2009-program-is-looking-juicy.html' title='RailsConf 2009 Program Is Looking Juicy'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-8348286934724149088</id><published>2009-02-26T11:01:00.000-08:00</published><updated>2009-07-15T07:31:21.531-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flying robot'/><category scheme='http://www.blogger.com/atom/ns#' term='arduino'/><category scheme='http://www.blogger.com/atom/ns#' term='pololu'/><category scheme='http://www.blogger.com/atom/ns#' term='uav'/><category scheme='http://www.blogger.com/atom/ns#' term='hmc6352'/><category scheme='http://www.blogger.com/atom/ns#' term='digital compass'/><category scheme='http://www.blogger.com/atom/ns#' term='unmanned aerial vehicles'/><category scheme='http://www.blogger.com/atom/ns#' term='instruments'/><title type='text'>Project Flying Robot: A Compass, Two Motors, And A Servo</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_SgxaAaUGqzY/SagUfS1A_dI/AAAAAAAABtw/eEnnwwY4kQc/s1600-h/IMG_0644.JPG"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 150px; height: 200px;" src="http://4.bp.blogspot.com/_SgxaAaUGqzY/SagUfS1A_dI/AAAAAAAABtw/eEnnwwY4kQc/s200/IMG_0644.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5307514688718831058" /&gt;&lt;/a&gt;Last weekend was a fantastic hardware/software jam session with &lt;a href="http://myfirstairship.blogspot.com/"&gt;my brother Damen&lt;/a&gt;, working on our autonomous &lt;a href="http://rad.rubyforge.org/"&gt;Ruby Arduino Development (RAD)&lt;/a&gt; powered blimp. Lots of little pieces had been coming in the mail, my brother had been soldering, and I had been programming away. Both of us were eager to start putting it all together.&lt;br /&gt;&lt;br /&gt;The first item of business was getting our bearings. We had acquired from Sparkfun a very cool &lt;a href="http://www.sparkfun.com/commerce/product_info.php?products_id=7915"&gt;HMC6352 digital compass&lt;/a&gt; module. Based on the Honeywell chip, this tiny but powerful breakout board is a very easy device to use with &lt;a href="http://www.arduino.cc/"&gt;Arduino&lt;/a&gt;, thanks to supporting the i2c protocol, also known as "two-wire interface" or TWI. No one had created a RAD plugin yet for this device, so I had whipped one together a couple days earlier using some Arduino code I found online, combining with the techniques used in some of the examples in RAD. Now, finally I would get a chance to see if it would work.&lt;br /&gt;&lt;br /&gt;We plugged in the unit to our handy breadboarding setup, downloaded the code to the Arduino via USB cable, and viola! Amazingly, it worked perfectly the first time... we were able to obtain the heading, and turning around the unit resulted in the compass data updating correctly. Naturally, we started to get a little excited. &lt;br /&gt;&lt;br /&gt;Of course, things would get a little bit trickier with our next item for integration: the &lt;a href="http://www.pololu.com/catalog/product/410"&gt;Pololu Micro Dual Serial Controller&lt;/a&gt;. The pricey but useful Pololu chip allows for extremely simple serial command of 2 DC motors. Why would we want to do this, when we already have the Arduino itself? The ease of commanding a separate device that handles monitoring and setting the motor speeds, allows us to focus on the important parts of our application: integrating it all together. Plus, there is only so much processing power available in the ATMega microcontroller, so offloading that part of the work to the separate Pololu microcontroller frees up our Arduino to process more sensor inputs, and also do other interesting things we have planned.&lt;br /&gt;&lt;br /&gt;Since the Pololu is a serial device, we used the Arduino's AFSoftSerial library to communicate with it. The soft serial library allows you to use any 2 of the Arduino's digital pins as a serial interface. Support is already in RAD for this library. With some more Google searching, and some assistance from the Pololu forums, I had written another RAD plugin. A few moments for Damen to wire things up, and we were ready for our test. We had only wired up one motor, and we had used the Arduino's own power to power both the Pololu's logic chip, as well as the motor. That would turn out to not be a very good idea.&lt;br /&gt;&lt;br /&gt;The Pololu works by sending it simple serial commands. You tell it which of the two motors, which direction, and what speed to set it to. We fired things up set our motor to "forward speed 10" and it started to move. Glorious! So, overwhelmed with enthusiasm, we decided to try "20". Much to our surprise, setting the speed to 20 caused the motor to stop entirely. Say what? We looked at each other blankly.&lt;br /&gt;&lt;br /&gt;You simply cannot power both the Arduino, and the motors, from the same power, unless you do some additional circuitry to provide both the higher voltage that the motors want, along with the 5V that the Arduino desires. Once we had thought about it for a few moments, it seemed obvious. We switched the motor supply to a separate battery, and the motor performed at 20. "Let's try full power", I said, and with a nod from my brother, I boosted the power to maximum. "Hey!" we both exclaimed at once a second later, as Damen grabbed for the now flying motor, which was trying it's best to lift the breadboard up by its power leads, and I frantically typed the commands that would shut down the motor. I wish we had THAT on video!&lt;br /&gt;&lt;br /&gt;We then decided to keep going, and integrate our servo. The servo is used to change the vector of the thrust motors, a design that is also used by the &lt;a href="http://diydrones.com/profiles/blogs/blimpduino-home-page"&gt;Blimpduino&lt;/a&gt;. Unlike the main thrusters, we are just using the Arduino itself to control the servo motor, using one of the digital pins. It is really easy to use the servo library to move a servo to a particular position. In this case, no new plugin for RAD was required, cause others have already figured it all our for us. Which is nice.&lt;br /&gt;&lt;br /&gt;We made the same mistake of connecting our servo to the same battery as the Arduino itself, due to the fact that the servo wanted the same voltage. By this point in the day, the poor thing just didn't have the force left in it. This caused the very odd side effect of resetting the Arduino itself when the servo would be ordered to move. We only realized that was what it was, once we tried getting power from the USB port. We had been testing using our wireless &lt;a href="http://www.digi.com/technology/wireless/products.jsp"&gt;XBee&lt;/a&gt; modems. Once the power problem was solved, the servo did exactly what we told it.&lt;br /&gt;&lt;br /&gt;It was a tremendous session, and we were now very satisfied that this project was, ahem, going to fly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-8348286934724149088?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/8348286934724149088/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=8348286934724149088' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/8348286934724149088'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/8348286934724149088'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2009/02/project-flying-robot-compass-two-motors.html' title='Project Flying Robot: A Compass, Two Motors, And A Servo'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_SgxaAaUGqzY/SagUfS1A_dI/AAAAAAAABtw/eEnnwwY4kQc/s72-c/IMG_0644.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-7179214169359960203</id><published>2009-02-25T17:28:00.001-08:00</published><updated>2009-02-25T17:42:47.210-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='railsconf'/><category scheme='http://www.blogger.com/atom/ns#' term='music'/><category scheme='http://www.blogger.com/atom/ns#' term='jazz'/><category scheme='http://www.blogger.com/atom/ns#' term='railsconf2009'/><category scheme='http://www.blogger.com/atom/ns#' term='railsconf 2009'/><title type='text'>Prepare For The RailsConf 2009 Jam Session</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://static.nameremoved.com/comics/2009-02-16-forceful-space-jazz.png"&gt;&lt;img style="margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 550px; height: 843px;" src="http://static.nameremoved.com/comics/2009-02-16-forceful-space-jazz.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;I will be &lt;a href="http://chadfowler.com/2009/2/8/one-more-week-for-railsconf-proposals"&gt;running the music BOF&lt;/a&gt; at &lt;a href="http://en.oreilly.com/rails2009/"&gt;RailsConf 2009&lt;/a&gt; in Las Vegas. What does that mean? We're gonna get down. All styles will be represented, so if you have an instrument or a voice, bring it.&lt;br /&gt;&lt;br /&gt;We have a Google group started &lt;a href="http://groups.google.ca/group/jazz-at-railsconf"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-7179214169359960203?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/7179214169359960203/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=7179214169359960203' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/7179214169359960203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/7179214169359960203'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2009/02/prepare-for-railsconf-2009-jam-session.html' title='Prepare For The RailsConf 2009 Jam Session'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-5528075927149073959</id><published>2009-02-25T09:38:00.000-08:00</published><updated>2009-02-25T10:16:27.851-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby on rails'/><category scheme='http://www.blogger.com/atom/ns#' term='open source development'/><category scheme='http://www.blogger.com/atom/ns#' term='capistrano'/><title type='text'>So Long, And Thanks For All The SSH</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.stevenkontos.com/images/dolphins_at_sunset.JPG"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 256px; height: 192px;" src="http://www.stevenkontos.com/images/dolphins_at_sunset.JPG" border="0" alt="" /&gt;&lt;/a&gt;I read &lt;a href="http://weblog.jamisbuck.org/2009/2/25/net-ssh-capistrano-and-saying-goodbye"&gt;Jamis Buck's posting&lt;/a&gt; late last night, about how he was retiring from involvement with &lt;a href="http://www.capify.org/"&gt;Capistrano&lt;/a&gt;, &lt;a href="http://net-ssh.rubyforge.org/"&gt;Net:SSH&lt;/a&gt; and a few other closely related projects. First of all, the community owes him a lot for doing so much work on these crucial parts of the &lt;a href="http://rubyonrails.org/"&gt;Ruby on Rails&lt;/a&gt; ecosystem.&lt;br /&gt;&lt;br /&gt;Seems like he has fallen victim to his own project's popularity. So many people using your code, and they start to expect things, and then demand them. I have seen friends in the Ruby community who are committers on a very popular tool, pretty much accosted at a conference, by fervent users of their project, who proceed to drag them off to the side to show them some obscure edge case. And like any good public servant, they go off to see whatever it is, regardless of whatever they were planning on doing the moment before.&lt;br /&gt;&lt;br /&gt;Jamis was for sure getting burned out. I know that from personal experience, when programming pal &lt;a href="http://blog.xnot.org/"&gt;Ari Lerner&lt;/a&gt; and I worked &lt;a href="http://github.com/jamis/net-ssh/commit/1e2834380e383fdada2ddf2c907c9b449b463181"&gt;some patches for Net:SSH&lt;/a&gt; that solved a &lt;a href="http://groups.google.com/group/capistrano/browse_thread/thread/1102208ff925d18"&gt;longstanding problem for public key authentication&lt;/a&gt;. Our first discovery on cloning the repo was that the original commit did not actually pass all of the unit tests. Then once we had corrected both that, and the original issue, and we contacted Jamis, he was pretty ambivalent. I am not knocking him here. Eventually, he accepted the patches. I think it was more that he had just had it with being a slave to his own creation.&lt;br /&gt;&lt;br /&gt;Now we are on own, people. However, there does need to be some organization to the community. &lt;a href="http://github.com"&gt;Github&lt;/a&gt; allows anyone to fork a project, sure. But having 25 different versions of the same project wandering around is too confusing for most people. New users would not know which version to install, the beauty of the standardization would be lost. &lt;br /&gt;&lt;br /&gt;Jamis, you need to pick a successor to inherit the main responsibility for these projects, if for no other reason than this. Anyhow, we thank you again for all your efforts, and we look forward to seeing what you get into next.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-5528075927149073959?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/5528075927149073959/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=5528075927149073959' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/5528075927149073959'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/5528075927149073959'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2009/02/so-long-and-thanks-for-all-ssh.html' title='So Long, And Thanks For All The SSH'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-1305784523541165413</id><published>2009-02-22T15:32:00.001-08:00</published><updated>2009-02-22T15:47:21.703-08:00</updated><title type='text'>Frankie Gets Some Fixes</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://neatorama.cachefly.net/images/2008-10/empire-state-building.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 250px; height: 199px;" src="http://neatorama.cachefly.net/images/2008-10/empire-state-building.jpg" border="0" alt="" /&gt;&lt;/a&gt;It has been very overdue to get &lt;a href="http://github.com/deadprogrammer/frankie/tree/master"&gt;Frankie&lt;/a&gt; updated to work with the latest versions of &lt;a href="http://www.sinatrarb.com/"&gt;Sinatra&lt;/a&gt; and &lt;a href="http://github.com/mmangino/facebooker/tree/master"&gt;Facebooker&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;But where I have been lagging, &lt;a href="http://blog.stepchangegroup.com/"&gt;mjfreshyfresh&lt;/a&gt; has stepped up, and submitted a patch that gives compatibility with Sinatra 0.9.x and Facebooker 1.0.2. Thanks, my main man!&lt;br /&gt;&lt;br /&gt;The Frankie gem has been updated to version 0.3, and it is available at your convenience. Note that you really do appear to need the 1.0.2 version of Facebooker for this release. Make sure you install facebooker using -v=1.0.2 to get only that version.&lt;br /&gt;&lt;br /&gt;Let's all go huge on &lt;a href="http://www.facebook.com"&gt;Facebook&lt;/a&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-1305784523541165413?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/1305784523541165413/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=1305784523541165413' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/1305784523541165413'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/1305784523541165413'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2009/02/frankie-gets-some-fixes.html' title='Frankie Gets Some Fixes'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-4765304039981231093</id><published>2009-02-22T10:38:00.000-08:00</published><updated>2009-02-22T12:01:10.535-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flying robot'/><category scheme='http://www.blogger.com/atom/ns#' term='zigbee'/><category scheme='http://www.blogger.com/atom/ns#' term='uav'/><category scheme='http://www.blogger.com/atom/ns#' term='unmanned aerial vehicles'/><category scheme='http://www.blogger.com/atom/ns#' term='wireless'/><category scheme='http://www.blogger.com/atom/ns#' term='xbee'/><title type='text'>Project Flying Robot: Getting All XBee With It</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_SgxaAaUGqzY/SaGtHgTCZeI/AAAAAAAABto/oQ4rSOtEeZs/s1600-h/IMG_0609.JPG"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 150px;" src="http://4.bp.blogspot.com/_SgxaAaUGqzY/SaGtHgTCZeI/AAAAAAAABto/oQ4rSOtEeZs/s200/IMG_0609.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5305712180459628002" /&gt;&lt;/a&gt;We have been making some amazing progress on our flying_robot project. This post is actually from almost a week ago, but I have not had time to catch up blogging with what we have been getting accomplished.&lt;br /&gt;&lt;br /&gt;As I had mentioned in my first posting, one of the reasons that we did not simply copy the &lt;a href="http://diydrones.com/profiles/blog/show?id=705844%3ABlogPost%3A44817"&gt;Blimpduino&lt;/a&gt;, is that we do not want to use a standard R/C controller for manual control. No, that would be too easy. Actually, it is because we have other kinds of ground control in mind... but I will get into that in future posts, once we have a working vehicle.&lt;br /&gt;&lt;br /&gt;One focus of our project is to create a fully digital protocol to communicate wirelessly with UAV's. Something like MIDI is to music, the flying_robot command set is to flying. In other words, flying_robot is intended to provide a device-independent way to communicate with various kinds of unmanned aerial vehicles. So we started looking at digital wireless solutions. WiFi is common, but does not have the range, plus it uses too much power. Bluetooth just lacks range, period. Sounds like a job for &lt;a href="http://www.digi.com/technology/rf-articles/wireless-zigbee.jsp"&gt;XBee&lt;/a&gt; to me.&lt;br /&gt;&lt;br /&gt;If you have not heard of it, XBee is a wireless data standard that has several priorities: it must have good range, use very low power, and be very cheap. The internet of things will likely be connected via XBee, since it it ideal for low-cost devices that wish to communicate with each other.&lt;br /&gt;&lt;br /&gt;XBee modems come in several different flavors, depending on the needed range and desired type of network topology. The simplest version supports the 802.15.4 protocol, which is probably best for most point to point type applications, like a ground control to a base station. This is what they sometimes refer to as the "Series 1" modems.&lt;br /&gt;&lt;br /&gt;The ZigBee modems, also sometimes called Series 2, add a protocol for mesh networking that looks to be very interesting. It could be used for a swarm of robots that communicate with each other, not just with a base station. This appealed to my inner geek, and so I ordered two of these modems, with the intention of experimenting with mesh networking in the near future.&lt;br /&gt;&lt;br /&gt;On that note, there is an &lt;a href="http://www.digi.com/products/wireless/point-multipoint/xbee-pro-868.jsp"&gt;amazing deal right now for experimenters directly from Digi&lt;/a&gt;. You can get a development kit for the super-powerful next-generation XBee 868, that includes a pair of the modems, for only $99. I could not resist, and just ordered a pair of these to play around with, as well as the &lt;a href="http://www.sparkfun.com/commerce/product_info.php?products_id=8768"&gt;XBee-Pro 2.5's I already had acquired from SparkFun&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;One thing I discovered quickly, was that the XBee modems I had purchased are really small. The next, was that I had to do some additional programming on them, before they would talk to each other. I found a &lt;a href="http://github.com/madrona/xbee-modem-setup/tree/master"&gt;useful Ruby script for configuring XBee modems&lt;/a&gt; from madrona, but it turned out to be a little more complicated, due to my choice of ZigBee over the simpler 802.15.4 protocol.&lt;br /&gt;&lt;br /&gt;Fortunately, others have already been blazing this wireless trail, so I found &lt;a href="http://antipastohw.blogspot.com/2009/01/xbee-shield-to-xbee-shield.html"&gt;these recent instructions&lt;/a&gt; on the Liquidware blog. It turns out that when dealing with ZigBee, one of the modems needs to be designated the "coordinator" for all the others in that mesh network, to hand out the all-important MY addresses. The coordinator needs different firmware than the individual nodes, which requires a utility provided by Digi, which is Windows only. Without this firmware on one of the modems in your mesh, you can send as many AT command as you like, the modems will never talk to each other. I dusted off a VM, and installed the Digi utility. Once I had updated the firmware, and updated the configurations of each modem using madrona's script, I was ready to go.&lt;br /&gt;&lt;br /&gt;With one XBee modem plugged into my Mac via the USB port thanks to the &lt;a href="http://www.sparkfun.com/commerce/product_info.php?products_id=8687"&gt;XBee Explorer&lt;/a&gt; adapter, and the other plugged into the Arduino via the &lt;a href="http://www.sparkfun.com/commerce/product_info.php?products_id=8471"&gt;XBee Shield&lt;/a&gt; from Sparkfun, serial communication "just worked". Now I was ready to start coding on the Arduino itself... but that is another story.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-4765304039981231093?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/4765304039981231093/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=4765304039981231093' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/4765304039981231093'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/4765304039981231093'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2009/02/project-flying-robot-getting-all-xbee.html' title='Project Flying Robot: Getting All XBee With It'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_SgxaAaUGqzY/SaGtHgTCZeI/AAAAAAAABto/oQ4rSOtEeZs/s72-c/IMG_0609.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-8451575890901569028</id><published>2009-02-20T00:08:00.000-08:00</published><updated>2009-02-20T01:10:15.588-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='los angeles'/><category scheme='http://www.blogger.com/atom/ns#' term='ruby on rails'/><category scheme='http://www.blogger.com/atom/ns#' term='merb'/><title type='text'>Should We Call It Mails, or Rurb? Yahuda Katz Clears Things Up At The LA Ruby Meetup</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_SgxaAaUGqzY/SZ5tt3Pc-bI/AAAAAAAABtU/IEk4Aou8KBg/s1600-h/IMG_0619.JPG"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 150px; height: 200px;" src="http://4.bp.blogspot.com/_SgxaAaUGqzY/SZ5tt3Pc-bI/AAAAAAAABtU/IEk4Aou8KBg/s200/IMG_0619.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5304798045779327410" /&gt;&lt;/a&gt;We just had a fun time at the latest LA Ruby Meetup, once again at UCLA. This time, we had presentations by &lt;a href="http://programminggems.wordpress.com/"&gt;James Foster&lt;/a&gt; from &lt;a href="http://www.gemstone.com"&gt;Gemstone&lt;/a&gt;, and &lt;a href="http://yehudakatz.com/"&gt;Yehuda Katz&lt;/a&gt; from &lt;a href="http://www.engineyard.com/"&gt;Engine Yard&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;James Foster was showing &lt;a href="http://maglev.gemstone.com/"&gt;MagLev&lt;/a&gt;, which is a Ruby VM based on top of the Gemstone Smalltalk VM. Not much to see here, just some Ruby code benchmarks running at about 4-5X faster than Ruby 1.8.6. That is, of course, not a very fair comparison, but no question that this is another Ruby VM to watch. His talk ended with the ever popular demo showing how &lt;a href="http://www.seaside.st/"&gt;Seaside&lt;/a&gt; does continuations, plus running the Smalltalk class browser right in the web browser and editing some code. Yes, this does kick serious butt, but it would be nice to see something new from the SmallTalk universe. I've seen all this from them two years ago, thanks to &lt;a href="http://www.avibryant.com/"&gt;Avi Bryant&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The second presentation was where things got a lot more interesting. Yehuda Katz is well known to hard-core developers, thanks to his work on &lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt; and &lt;a href="http://merbivore.com/"&gt;Merb&lt;/a&gt;. He has also been very vocal about his differences of philosophy with the Rails way of doing things. Given the fairly recent announcement of the Merb project merging with the &lt;a href="http://rubyonrails.org/"&gt;Ruby on Rails&lt;/a&gt; project, we all wanted to know, like, what's up?&lt;br /&gt;&lt;br /&gt;As explanation, Yehuda gave a really complete history of Ruby on Rails. He showed slides of DHH's first Mac, he had dates and times of the first SVN commits for Rails. He explained the back story of what was going on in DHH's life while he was creating  the first version of Rails. This was all ostensibly to justify that Ruby on Rails and Merb started with the same sort of motivations.&lt;br /&gt;&lt;br /&gt;OK, great. That was fun. But what about the real dirt? He did not say anything directly, but my take on it was: when you really look at it, Merb was already turning into Rails++ so why not just merge all that effort into Rails itself? Putting too much emphasis into a separate framework also did not help sell services to the million Rails users out there, which is what Engine Yard's investors need them to be doing.&lt;br /&gt;&lt;br /&gt;Yehuda was obviously comfortable with it, even thou he quipped about how many times he said "No!" when first presented with the concept of the great merge. But Merb seems to have the implementation, and Rails the sugar, plus the momentum, so &lt;a href="http://www.youtube.com/watch?v=93hxKtd4CdA"&gt;your peanut butter is now in my chocolate&lt;/a&gt;. And the big winner? Has to be &lt;a href="http://rack.rubyforge.org/"&gt;Rack&lt;/a&gt;, or the "Unix of web servers" as Yehuda called it. &lt;br /&gt;&lt;br /&gt;Personally, I think it sounds great. Adding some API rigor to Rails will make it a lot more stable of platform for long-term development. And let us not forget that &lt;a href="http://brainspl.at/"&gt;ezmobius&lt;/a&gt; has been contributing performance improvements back into Rails for a long time, so nothing shocking there. Just more good stuff for the Ruby web development community.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-8451575890901569028?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/8451575890901569028/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=8451575890901569028' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/8451575890901569028'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/8451575890901569028'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2009/02/should-we-call-it-mails-or-rurb-yahuda.html' title='Should We Call It Mails, or Rurb? Yahuda Katz Clears Things Up At The LA Ruby Meetup'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_SgxaAaUGqzY/SZ5tt3Pc-bI/AAAAAAAABtU/IEk4Aou8KBg/s72-c/IMG_0619.JPG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-4591694482939370040</id><published>2009-02-18T08:22:00.000-08:00</published><updated>2009-02-18T09:10:18.092-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='flying robot'/><category scheme='http://www.blogger.com/atom/ns#' term='arduino'/><category scheme='http://www.blogger.com/atom/ns#' term='ruby arduino development'/><category scheme='http://www.blogger.com/atom/ns#' term='uav'/><category scheme='http://www.blogger.com/atom/ns#' term='rad'/><category scheme='http://www.blogger.com/atom/ns#' term='unmanned aerial vehicles'/><title type='text'>Project Flying Robot: The Adventure Begins</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.johnnysokkoandhisflyingrobot.com/johnnysokkoandhisflyingrobot.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 325px; height: 174px;" src="http://www.johnnysokkoandhisflyingrobot.com/johnnysokkoandhisflyingrobot.jpg" border="0" alt="" /&gt;&lt;/a&gt;I love robots. OK, there, I've gone and gotten that out into the open. Like many programmers, I have long dreamed of dominating the world with my robot legions. Or failing that, at least getting my &lt;a href="http://en.wikipedia.org/wiki/RoboSapien"&gt;RoboSapien&lt;/a&gt; to walk around in a little circle by itself.&lt;br /&gt;&lt;br /&gt;Recently, my brother &lt;a href="http://myfirstairship.blogspot.com/"&gt;Damen Evans&lt;/a&gt; and I decided that we needed to realize our ambitions, and began work on a flying robot. Yes, that is what I said. &lt;b&gt;Flying robot&lt;/b&gt;. After many years of respective obsessions about Lighter Than Air (LTA) vehicles and autonomous control, we are combining our forces and actually building something.&lt;br /&gt;&lt;br /&gt;The "Rogue 1", as we are calling the airship, is heavily influenced (pun only, hopefully) by the very cool &lt;a href="http://diydrones.com/profiles/blog/show?id=705844%3ABlogPost%3A44817"&gt;Blimpduino&lt;/a&gt; project. It will be controlled by an &lt;a href="http://www.arduino.cc/"&gt;Arduino&lt;/a&gt; based system, like the Blimpduino. However, our focus is a bit different, which is why we are building our own hardware design, although also based on the open source Arduino hardware platform.&lt;br /&gt;&lt;br /&gt;One major concept that we are working on, is creating a digital protocol for controlling the airship from a ground station. Where the Blimpduino uses a standard radio control setup, we are creating a fully digital protocol for Unmanned Aerial Vehicles (UAV) similar to what MIDI does for music. For example, an LTA vehicle would have a different way to perform a command like "rudder left 10 degrees" than an airplane or helicopter would. Especially since neither an LTA nor a helicopter even have rudders!&lt;br /&gt;&lt;br /&gt;We have decided to use the &lt;a href="http://rad.rubyforge.org/"&gt;Ruby Arduino Development&lt;/a&gt; (RAD) project for creating the software needed for &lt;a href="http://github.com/deadprogrammer/flying_robot/tree/master"&gt;flying_robot&lt;/a&gt;. It is still a bit rough in some ways, but it allows us to take advantage of a slick Ruby DSL-like approach for implementing the flying_robot command set for a specific UAV, as well as for integrating a bunch of the hardware we will be needing, like motors and sensors.&lt;br /&gt;&lt;br /&gt;As the many small parts come in, both Damen and I will be blogging about the fun, so watch the skies... they're already here!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-4591694482939370040?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/4591694482939370040/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=4591694482939370040' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/4591694482939370040'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/4591694482939370040'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2009/02/project-flying-robot-adventure-begins.html' title='Project Flying Robot: The Adventure Begins'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-405322523571855523</id><published>2009-02-10T09:37:00.001-08:00</published><updated>2009-02-11T09:18:39.275-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='upload progress'/><category scheme='http://www.blogger.com/atom/ns#' term='jquery'/><category scheme='http://www.blogger.com/atom/ns#' term='passenger'/><category scheme='http://www.blogger.com/atom/ns#' term='apache'/><category scheme='http://www.blogger.com/atom/ns#' term='jsonp'/><category scheme='http://www.blogger.com/atom/ns#' term='json-p'/><title type='text'>JSON-P Makes Progress Cross Domains With Apache, Passenger, and jQuery</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.best-horror-movies.com/images/Jasonchainsmall.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 169px; height: 255px;" src="http://www.best-horror-movies.com/images/Jasonchainsmall.jpg" border="0" alt="" /&gt;&lt;/a&gt;As yet another part of the be-all, end-all media upload processing solution, my client wanted to provide a nice progress bar for tracking the status of file uploads. Let me note, that providing user feedback as to the state of an extended upload turns out to be a very important UI feature.&lt;br /&gt;&lt;br /&gt;Luckily, the problem of a nice way to track file upload progress had already been solved several times. My own platform of choice at the moment is &lt;a href="http://httpd.apache.org/"&gt;Apache&lt;/a&gt; running with &lt;a href="http://www.modrails.com/"&gt;Passenger&lt;/a&gt;, and cool dude &lt;a href="http://drogomir.com"&gt;Peter Sarnacki aka drogomir&lt;/a&gt; had kindly provided a handy version of the same JSON based file upload progress tracking that had been done so well on nginx, except this time for Apache in the form of &lt;a href="http://github.com/drogus/apache-upload-progress-module/tree/master"&gt;apache-upload-progress-module&lt;/a&gt;. He even had created a &lt;a href="http://github.com/drogus/jquery-upload-progress/tree/master"&gt;jquery-upload-progress&lt;/a&gt; plugin too, which is exactly what I needed.&lt;br /&gt;&lt;br /&gt;Only one small problem... those pesky cross-domain javascript calls. As in, browsers do not as a rule, allow them. Then again, browsers do turn out to know how to be promiscuous. Which is to say, execute arbitrary JavaScript code handed to them by strange servers. Say wha? Yes, that is correct.&lt;br /&gt;&lt;br /&gt;Enter &lt;a href="http://remysharp.com/2007/10/08/what-is-jsonp/"&gt;JSON-P&lt;/a&gt;, which is the JavaScript Object Notation you know and love, with an extra layer of "Padding". What does the P in JSON do? Sorry, I could not resist that. Anyhow, the padding consists of a special temporary javascript function created just to handle the data callback from a server that is not in the same domain as the calling server.&lt;br /&gt;&lt;br /&gt;Here is an example from our need for upload progress tracking. A normal JSON request to the upload component, like this:&lt;br /&gt;&lt;pre&gt;   http://www.yourdomain.com/progress?X-Progress-ID=1234&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Would return JSON data like this:&lt;br /&gt;&lt;pre&gt;   new Object({ 'state' : 'uploading', 'received' : 35587, 'size' : 716595, 'speed' : 35587 })&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;But if we are using JSON-P, the request would include the name of the 'magic' callback function, so that the data returned from the cross-domain request is available to the original calling page, even though it is in a different domain, or even just subdomain. &lt;br /&gt;&lt;br /&gt;For example, this request:&lt;br /&gt; &lt;br /&gt;&lt;pre&gt;   http://uploads.yourdomain.com/progress?callback=jsonp123&amp;X-Progress-ID=1234&lt;/pre&gt;  &lt;br /&gt;&lt;br /&gt;Would return the JSON-P function:&lt;br /&gt;&lt;pre&gt;   jsonp123(new Object({ 'state' : 'uploading', 'received' : 35587, 'size' : 716595, 'speed' : 35587 }));&lt;/pre&gt;  &lt;br /&gt;&lt;br /&gt;The calling page executes the 'jsonp123' function after the data is returned from the cross-domain request, and then the returned data is available to scripts on the original page. This is how Twitter and other Javascript API's are able to function with these cross-domain requests.&lt;br /&gt;  &lt;br /&gt;So I whipped up patches for each the &lt;a href="http://github.com/drogus/apache-upload-progress-module/commit/20fed47119d3ea70b91ccb6a91a9338c8f127304"&gt;apache-progress-module&lt;/a&gt;, and the &lt;a href="http://github.com/drogus/jquery-upload-progress/commit/a518b05fa85b1833bb3a8e8c2a0c8dfb9d6abaf1"&gt;jquery progress plugin&lt;/a&gt;, and now that drogomir has accepted them, we can all enjoy the benefits of cross-domain uploads, along with JSON-P powered shiny progress indicators. Well, as long as it is a jquery based progress indicator you seek. I will try to get around to looking at the &lt;a href="http://github.com/drogus/prototype-upload-progress/tree/master"&gt;Prototype progress plugin&lt;/a&gt;, but since I am mostly working with &lt;a href="http://jquery.com/"&gt;jquery&lt;/a&gt; now, perhaps someone else will jump into the fray.&lt;br /&gt;&lt;br /&gt;Have fun, and make some progress.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-405322523571855523?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/405322523571855523/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=405322523571855523' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/405322523571855523'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/405322523571855523'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2009/02/json-p-makes-progress-cross-domains.html' title='JSON-P Makes Progress Cross Domains With Apache, Passenger, and jQuery'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-3558749831524023639</id><published>2009-02-07T08:37:00.000-08:00</published><updated>2009-02-07T08:58:35.408-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='kids'/><category scheme='http://www.blogger.com/atom/ns#' term='kids programming'/><title type='text'>Introducing Net Grommit</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.videogamecritic.net/images/gba/kelly_slater%27s_pro_surfer.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 240px;" src="http://www.videogamecritic.net/images/gba/kelly_slater%27s_pro_surfer.jpg" alt="" border="0" /&gt;&lt;/a&gt;I have just begun a new blog called &lt;a href="http://netgrommit.com/"&gt;Net Grommit&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;It is a place that I can go off and explore my experiences with technology and being a 21st century parent. I will get into anything from video games, kids programming, tech toys, education, and whatever else appeals to me. As a father of two boys, and an obsessive technologist, I have plenty of personal experience to talk about, and I really look forward to the participation of some other people, as well.&lt;br /&gt;&lt;br /&gt;So, if you are a parent, or just find this as interesting as I do, please come over and join me at &lt;a href="http://netgrommit.com/"&gt;Net Grommit&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;And now, back to our irregularly scheduled programming topics.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-3558749831524023639?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/3558749831524023639/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=3558749831524023639' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/3558749831524023639'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/3558749831524023639'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2009/02/introducing-net-grommit.html' title='Introducing Net Grommit'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-426055623293614206</id><published>2009-01-31T09:27:00.000-08:00</published><updated>2009-01-31T10:06:59.458-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='larubyconf2009'/><category scheme='http://www.blogger.com/atom/ns#' term='los angeles rubyconf'/><category scheme='http://www.blogger.com/atom/ns#' term='los angeles'/><category scheme='http://www.blogger.com/atom/ns#' term='larubyconf'/><title type='text'>Los Angeles + Ruby = LARubyConf 2009</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.laruby.com/images/la-ruby-logo.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 312px; height: 279px;" src="http://www.laruby.com/images/la-ruby-logo.png" border="0" alt="" /&gt;&lt;/a&gt;It is with great excitement that I want to tell all of you about the first annual &lt;a href="http://www.larubyconf.com"&gt;Los Angeles Ruby Conference&lt;/a&gt;. Thanks to the fine efforts of a bunch of &lt;a href="http://www.laruby.com/"&gt;LA's hardworking Rubyists&lt;/a&gt;, and the generous financial support of AT&amp;T Interactive, we are preparing to bring the noise to Los Angeles on April 4, 2009.&lt;br /&gt;&lt;br /&gt;Too many of these wannabe cities have been smoking us with their regional conferences, but no more! Time for we Angelinos to step up and be counted among the world's important Ruby communities. All joking aside, it really is time for us to share our enthusiasm and experience, and grow beyond just the local scene.&lt;br /&gt;&lt;br /&gt;I am helping out with the organization of the conference, which means a good chance to showcase other people. We are recruiting presenters, sponsors, and most importantly attendees! There will for sure be something for everyone, at all levels of experience. &lt;br /&gt;&lt;br /&gt;Here is what you should do:&lt;br /&gt;&lt;br /&gt;Want to attend? &lt;a href="http://www.larubyconf.com/registration_information"&gt;Register now for the early bird price of $75&lt;/a&gt;&lt;br /&gt;Have something cool to talk about? &lt;a href="http://www.larubyconf.com/speakers"&gt;We want your proposal&lt;/a&gt;&lt;br /&gt;Want to sponsor the conference? &lt;a href="http://www.larubyconf.com/sponsors"&gt;Yes, we want you, click here&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;We need your support, people. Let's have a great time, learn from each other, and make it a big success. 'Nuff said.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-426055623293614206?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/426055623293614206/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=426055623293614206' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/426055623293614206'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/426055623293614206'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2009/01/los-angeles-ruby-larubyconf-2009.html' title='Los Angeles + Ruby = LARubyConf 2009'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-1174470145277928509</id><published>2009-01-28T10:31:00.000-08:00</published><updated>2009-01-30T15:53:12.936-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='async'/><category scheme='http://www.blogger.com/atom/ns#' term='spork'/><category scheme='http://www.blogger.com/atom/ns#' term='asynchronous processing'/><category scheme='http://www.blogger.com/atom/ns#' term='multithreading'/><category scheme='http://www.blogger.com/atom/ns#' term='sinatra'/><category scheme='http://www.blogger.com/atom/ns#' term='passenger'/><title type='text'>Getting Async With Sinatra And Passenger Using spork</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.trophybikes.com/content/Image/MISC%20GOODS/SPORK.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 350px; height: 257px;" src="http://www.trophybikes.com/content/Image/MISC%20GOODS/SPORK.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;Everyone wants it all. In the case of upload processing, this means we want both the convenience of &lt;a href="http://www.sinatrarb.com"&gt;Sinatra&lt;/a&gt; coding, plus the performance that a nice process/threading model gives us. Go off and do some work I just assigned you, and don't make me wait around to see you do it.&lt;br /&gt;&lt;br /&gt;If you are using &lt;a href="http://www.modrails.com"&gt;Passenger&lt;/a&gt;, it already is buffering your uploads, and not calling your Sinatra application until the upload is complete. That saves system resources for more important things, like even more uploads. Pretty nice.&lt;br /&gt;&lt;br /&gt;But a lot of work often has to take place after the upload is completed. A common example these days would be a video transcoding or image processing server. Once your user has uploaded their file, it would be considerate to let them go off and do something else. Sites like YouTube and Flickr have been doing exactly this for some time.&lt;br /&gt;&lt;br /&gt;For certain highly transactional system, a solid message queue would be essential. But more humble needs, like an upload/transcoding/image thumbnail server, does not really need all of those extra moving parts.&lt;br /&gt;&lt;br /&gt;Thanks to the power of the underlying Ruby language itself, it is very simple to fork off blocks of code into a separate process. Combining this with Passenger's already pretty robust process handling, and you get a pretty well performing solution with not much coding effort.&lt;br /&gt;&lt;br /&gt;But wait... it does not work?! Sure enough, there are issues in the underlying interaction between Passenger and &lt;a href="http://rack.rubyforge.org/"&gt;Rack&lt;/a&gt;, that you must address, or your long-running code will be just that, long-running, making the user sit there and wait for it to complete before Passenger allows Sinatra to return a response.&lt;br /&gt;&lt;br /&gt;Enter &lt;a href="http://github.com/deadprogrammer/spork"&gt;spork&lt;/a&gt;... a blatant ripoff of both the spoon and the fork... I mean of the &lt;a href="http://github.com/tra/spawn"&gt;Spawn&lt;/a&gt; plugin for Rails, except with no actual Rails stuff in it, of course. spork handles the monkeypatching required to get things working the way they should be, and also lets you run under thin with no code changes should you so wish, like when running in development mode locally.&lt;br /&gt;&lt;br /&gt;Anyhow, it may not be a glamorous implement, but it is a useful one. Have a look at spork if you are using Sinatra on Passenger, and you want to get all asynchronous on your users.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-1174470145277928509?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/1174470145277928509/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=1174470145277928509' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/1174470145277928509'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/1174470145277928509'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2009/01/getting-async-with-sinatra-and.html' title='Getting Async With Sinatra And Passenger Using spork'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-4691211140561164547</id><published>2009-01-28T08:21:00.000-08:00</published><updated>2009-01-28T09:13:04.607-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jury service'/><category scheme='http://www.blogger.com/atom/ns#' term='democracy'/><title type='text'>The Verdict Is In</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_SgxaAaUGqzY/SYCRN0R_YII/AAAAAAAABtI/UkEw6iU0GRY/s1600-h/IMG_0564.JPG"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 150px; height: 200px;" src="http://1.bp.blogspot.com/_SgxaAaUGqzY/SYCRN0R_YII/AAAAAAAABtI/UkEw6iU0GRY/s200/IMG_0564.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5296392828346130562" /&gt;&lt;/a&gt;For the last week or so, I have been serving on a jury in Department 45 of the Stanley Mosk Courthouse in downtown Los Angeles. Now that the trial is over, I am able to talk/blog/pontificate about my experience.&lt;br /&gt;&lt;br /&gt;This was my first time actually serving on a jury, despite having come close a couple of times in the past. The case itself was a canonical example of how ridiculous big companies can be when fighting over money. The dispute was about billings between two very large insurance companies. Like you probably just did, my first comment was "a plague on both their houses." However, after executing the mental gymnastics for days of maintaining &lt;a href="http://en.wikipedia.org/wiki/Equipoise"&gt;equipoise&lt;/a&gt;, once I had heard all of the evidence presented by both sides, I felt that the plaintiff had actually been wronged by the defendant. Both attorneys did an excellent job arguing their clients' positions, but the facts seemed reasonably clear to me from the evidence and testimony. At least as clear as anything can be almost ten years after the events had originally transpired.&lt;br /&gt;&lt;br /&gt;Anyhow, this post is not about the case. It is actually an ode to my fellow jurors, and the legal system. I have had a slightly negative view of our legal system, like many citizens. But a duty is a duty, and so when the summons arrives, we all must answer. However, most people view it as a kind of 'reverse lottery', and dread jury service like an impending root canal. &lt;br /&gt;&lt;br /&gt;The experience of actually serving on a jury, and seeing the legal system from the inside, has altered my perspective quite a bit. Despite coming from very different walks of life, all my fellow jurors had a real dedication to our task, as absurd as we all felt it to be. Nonetheless, we fell to our work with an amazing level of morale. We tried to smile at each other, and remain happy and attentive, even as the hours of hearing and seeing the evidence in the case wore on.&lt;br /&gt;&lt;br /&gt;Here I have to remark on an odd, and to me extremely entertaining, coincidence. Ruby programmer and father of &lt;a href="http://rubini.us/"&gt;Rubinius&lt;/a&gt; &lt;a href="http://blog.fallingsnow.net/"&gt;Evan Phoenix&lt;/a&gt; was on the same jury. We had known each other superficially from &lt;a href="http://rubyconf.org/"&gt;RubyConf&lt;/a&gt; etc., but had never had a chance to hang out together, despite living in the same city. Lunching every day together really relieved the boredom of enduring the testimony, and bad PowerPoint, of the trial. Thanks for putting up with my loud comments!&lt;br /&gt;&lt;br /&gt;The lawyers and judge projected a calm friendliness, even to each other, that defined 'professional courtesy'. Even after the cross-examination starting getting bloody. Yes, this was a kind of trial by combat, albeit one of words instead of arms, as I was slightly surprised to discover, after the pomp and ceremony of the opening statements, where the opposing counsel were merely thumping their chests and circling each other.&lt;br /&gt;&lt;br /&gt;When the time came that we jurors could finally discuss the facts in the case, after not being able to discuss it with anyone, including each other, it was an incredible release. This was the logic in not permitting us to speak openly until the deliberation had begun. We each had already really defined where we stood relative to the evidence we had seen. The level of mutual respect that we had during this special conversation known as deliberating, was remarkable.&lt;br /&gt;&lt;br /&gt;Credit to Evan who served as our lead juror. He did a great job keeping the forum open, and also moving us along to the final verdict.&lt;br /&gt;&lt;br /&gt;As I leave my jury experience behind me, and return to my normal slew of programming stuff, I am reminded of Churchill's quote about democracy "the worst form of government except all the others that have been tried." E Pluribus Unum!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-4691211140561164547?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/4691211140561164547/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=4691211140561164547' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/4691211140561164547'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/4691211140561164547'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2009/01/verdict-is-in.html' title='The Verdict Is In'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_SgxaAaUGqzY/SYCRN0R_YII/AAAAAAAABtI/UkEw6iU0GRY/s72-c/IMG_0564.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-3874966988664065681</id><published>2009-01-25T09:26:00.000-08:00</published><updated>2009-01-25T09:33:05.341-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='los angeles'/><category scheme='http://www.blogger.com/atom/ns#' term='kids programming'/><category scheme='http://www.blogger.com/atom/ns#' term='open source development'/><title type='text'>In My Hood</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_SgxaAaUGqzY/SXyiFMoqUVI/AAAAAAAABtA/YUPKqHEEvXA/s1600-h/IMG_0565.JPG"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 150px;" src="http://1.bp.blogspot.com/_SgxaAaUGqzY/SXyiFMoqUVI/AAAAAAAABtA/YUPKqHEEvXA/s200/IMG_0565.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5295285472055677266" /&gt;&lt;/a&gt;I was taking my morning constitutional with my youngest son, when I noticed my neighbor who programs at JPL had added a new placard to the artistic decor attached to his fence.&lt;br /&gt;&lt;br /&gt;And who says there is no software development in Los Angeles?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-3874966988664065681?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/3874966988664065681/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=3874966988664065681' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/3874966988664065681'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/3874966988664065681'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2009/01/in-my-hood.html' title='In My Hood'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_SgxaAaUGqzY/SXyiFMoqUVI/AAAAAAAABtA/YUPKqHEEvXA/s72-c/IMG_0565.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-7000550640690919916</id><published>2009-01-23T08:58:00.001-08:00</published><updated>2009-01-23T16:13:01.974-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grep'/><category scheme='http://www.blogger.com/atom/ns#' term='textmate'/><title type='text'>Get A Grep On TextMate</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.thefishgrip.com/images/CatfishInGripBig.JPG"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 307px; height: 231px;" src="http://www.thefishgrip.com/images/CatfishInGripBig.JPG" border="0" alt="" /&gt;&lt;/a&gt;I really wanted to be all cool and retro by going back to EMACS, but my usual workload has kept me from figuring out the right environment for my Mac. In the meantime, programming pal and fun blogger &lt;a href="http://www.danielfischer.com/"&gt;Daniel Fischer&lt;/a&gt; turned me on to just one more reason to stay lazy.&lt;br /&gt;&lt;br /&gt;TextMate is really quite a cool editor. However, one problem that annoys, especially when working on larger projects, is TextMate's "Find In Project". If you've ever literally had your entire machine lock up while doing a search, you know the pain.&lt;br /&gt;&lt;br /&gt;Why do such a crappy search, when grep is just waiting to serve you? You like the pretty colors and do not wish to leave TextMate? Lucky for us, a wonderful human being in Sweden named Henrik has created a &lt;a href="http://henrik.nyh.se/2007/06/grep-in-project-command-for-textmate"&gt;bundle that replaces TextMate's madness for a nice quick clean grep&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;You need to get this right now, if you are using TextMate. You will save a LOT of time and frustration.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-7000550640690919916?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/7000550640690919916/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=7000550640690919916' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/7000550640690919916'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/7000550640690919916'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2009/01/get-grep-on-textmate.html' title='Get A Grep On TextMate'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-2333428618094062091</id><published>2009-01-21T08:16:00.000-08:00</published><updated>2009-01-21T08:45:24.593-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='rack'/><category scheme='http://www.blogger.com/atom/ns#' term='sinatra'/><category scheme='http://www.blogger.com/atom/ns#' term='passenger'/><category scheme='http://www.blogger.com/atom/ns#' term='integrity'/><title type='text'>Sinatra and Passenger Back On The Rack</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://giniann.files.wordpress.com/2007/07/grilled-lamb-rack-with-herbs.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 450px; height: 337px;" src="http://giniann.files.wordpress.com/2007/07/grilled-lamb-rack-with-herbs.jpg" border="0" alt="" /&gt;&lt;/a&gt;There is a new release of the &lt;a href="http://sinatra.github.com/"&gt;Sinatra&lt;/a&gt; gem, version 0.9.1. This happens to work out well, since the newest &lt;a href="http://www.modrails.com/"&gt;Passenger&lt;/a&gt; 2.0.6 has a strong dependency on &lt;a href="http://rack.rubyforge.org/"&gt;Rack&lt;/a&gt; 0.9, and the previous Sinatra 0.3 simply did not work at all due to dependency on Rack 0.4. The last few days have had some of us apoplectic over Ruby gem version hell.&lt;br /&gt;&lt;br /&gt;And lots of interesting and even important things require all three. For example, I have been messing around with &lt;a href="http://integrityapp.com/"&gt;Integrity&lt;/a&gt;, a very cool little continuous integration server which is built using Sinatra. &lt;a href="http://foca.tumblr.com/"&gt;Foca&lt;/a&gt; and the rest of Team Integrity are still struggling with upgrading a morass of &lt;a href="http://datamapper.org"&gt;DataMapper&lt;/a&gt; gems, but this should help.&lt;br /&gt;&lt;br /&gt;The point here, is getting everything up on Rack 0.9 seem to have made these problems go away, at least for my own Sinatra-based projects. Thanks to everyone who worked on these new releases, and special thanks to the IRC dwellers that provide support for the community.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-2333428618094062091?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/2333428618094062091/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=2333428618094062091' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/2333428618094062091'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/2333428618094062091'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2009/01/sinatra-and-passenger-back-on-rack.html' title='Sinatra and Passenger Back On The Rack'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-2758043859597095618</id><published>2008-11-13T09:07:00.000-08:00</published><updated>2008-11-13T09:18:11.391-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='rubyconf2008'/><category scheme='http://www.blogger.com/atom/ns#' term='test-driven development'/><category scheme='http://www.blogger.com/atom/ns#' term='rubyconf 2008'/><title type='text'>RubyConf 2008 - Day 1 - Testing Heresies - Francis Hwang</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://media-2.web.britannica.com/eb-media/10/18910-004-7F8BCBE7.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 456px; height: 300px;" src="http://media-2.web.britannica.com/eb-media/10/18910-004-7F8BCBE7.jpg" border="0" alt="" /&gt;&lt;/a&gt;The sessions for RubyConf 2008 day one were nearly over, when I attending this highly entertaining and informative one. I had missed the chance to see a previous presentation by &lt;a href="http://fhwang.net/"&gt;Francis Hwang&lt;/a&gt;, and being as test-obsessed as I am, I was not going to make the same mistake twice.&lt;br /&gt;&lt;br /&gt;Many people are confused over mocks, stubs, and other fakes. Here are the real definitions.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://xunitpatterns.com/"&gt;Gerard Meszaros&lt;/a&gt; - Test Doubles&lt;br /&gt;- dummies - passed around but never used&lt;br /&gt;- fakes - work but unstable in production&lt;br /&gt;- stubs - provide canned answers to calls made during test&lt;br /&gt;- mocks - mostly concerned with surface interaction&lt;br /&gt;&lt;br /&gt;Classical TDD use real objects.&lt;br /&gt;Mockist TDD will always use a mock for any object with interesting behavior&lt;br /&gt;&lt;br /&gt;Problem #1 with mocks&lt;br /&gt;Cannot figure out problem and solution at same time&lt;br /&gt;&lt;br /&gt;Problem #2 with mocks&lt;br /&gt;Bugs can slip between layers&lt;br /&gt;&lt;br /&gt;Francis Hwang, TDD Clasiscist&lt;br /&gt;- test setup creates records in the db&lt;br /&gt;- no sqlite in test&lt;br /&gt;- when you use test doubles, it's always a big deal&lt;br /&gt;&lt;br /&gt;Real world example #1&lt;br /&gt;Ensure that an optimization is actually being used&lt;br /&gt;Redefine the actual surface interaction to 'scream' on error&lt;br /&gt;&lt;br /&gt;Real world example #2 &lt;br /&gt;Faking a real web service (not written by us)&lt;br /&gt;Best to use stub, to duplicate functionality&lt;br /&gt;Need test, stub, AND test for stub&lt;br /&gt;&lt;br /&gt;Dogma - if you tests do not run quickly, there's something wrong with you&lt;br /&gt;Heresy - I'd like my test to run 30 sec. I'd also like a pony&lt;br /&gt;&lt;br /&gt;Francis does not use autotest, because he does not want to run all of the tests every time he changes something. &lt;a href="http://blog.segment7.net/"&gt;Eric Hodel&lt;/a&gt; chimed in from the audience says that it can run only what changed. Only if it passes, will it run ALL tests. Me, I loves my &lt;a href="http://www.zenspider.com/ZSS/Products/ZenTest/"&gt;autotest&lt;/a&gt;... with growl notifications, it's all good.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://devver.net/"&gt;devver&lt;/a&gt;&lt;br /&gt;They say it is a ec2 based distributed test system...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://github.com/brynary/testjour/tree/master"&gt;testjour&lt;/a&gt;&lt;br /&gt;uses bonjour to trigger a farm of machines in your LAN to perform distributed tests&lt;br /&gt;&lt;br /&gt;Dogma -  you code should always be well-structured&lt;br /&gt;Heresy - under-structuring can be freeing&lt;br /&gt;&lt;br /&gt;Uses example of constantly cleaning small NYC apt. It was living on a boat, where you spent all your time putting things away.&lt;br /&gt;&lt;br /&gt;Dogma - Fine grained focus leads to high quality code&lt;br /&gt;Heresy - Never forget the unknown unknowns&lt;br /&gt;&lt;br /&gt;System design 101&lt;br /&gt;How likely fail&lt;br /&gt;What will fail look like&lt;br /&gt;How can I find out quickly&lt;br /&gt;How can I limit damage&lt;br /&gt;&lt;br /&gt;Dogma - testing makes my job easier&lt;br /&gt;Heresy - testing makes it easier for others to do my job - unless my job keeps growing&lt;br /&gt;&lt;br /&gt;Rails has made it so simple to implement simple business logic, so way more is expected now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-2758043859597095618?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/2758043859597095618/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=2758043859597095618' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/2758043859597095618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/2758043859597095618'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2008/11/rubyconf-2008-day-1-testing-heresies.html' title='RubyConf 2008 - Day 1 - Testing Heresies - Francis Hwang'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-2395526484865509872</id><published>2008-11-11T06:54:00.000-08:00</published><updated>2008-11-11T07:02:51.269-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='rubyconf2008'/><category scheme='http://www.blogger.com/atom/ns#' term='rubyconf 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='rush shell'/><category scheme='http://www.blogger.com/atom/ns#' term='rush'/><title type='text'>RubyConf 2008 - Day 1 - rush, a shell that will yield to you - Nicholas Schlueter</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.totalproductionus.com/images/july_Rush_6.gif"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 350px;" src="http://www.totalproductionus.com/images/july_Rush_6.gif" border="0" alt="" /&gt;&lt;/a&gt;I had previously blogged a bit about &lt;a href="http://rush.heroku.com/"&gt;Rush&lt;/a&gt;, the Ruby shell. Well, now Rush must now be its own force to be reckoned with, because this presentation was NOT by &lt;a href="http://adam.blog.heroku.com/"&gt;Adam Wiggins&lt;/a&gt;, the creator of Rush, but was instead by &lt;a href='http://www.simpltry.com/'&gt;Nicholas Schlueter&lt;/a&gt;, the creator of &lt;a href="http://github.com/schlueter/rushmate/tree/master"&gt;RushMate&lt;/a&gt;. If you've not heard of it, RushMate allows you to use Rush from within TextMate, which translates to being able to write custom commands much more easily. &lt;br /&gt;&lt;br /&gt;He showed some neat examples, including one that auto-generates an HTML page with links to all of the RDocs for all of the RubyGems you have installed locally. I have wanted something like that for times that I was not able to connect to the InterTubes, but still wanted to do some development.&lt;br /&gt;&lt;br /&gt;The entirety of his presentation is online &lt;a href='http://www.simpltry.com/2008/11/07/rubyconf-talk-complete/'&gt;here&lt;/a&gt; with a whole bunch of code examples that will be better than my ramblings, so you should rush over and check it out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-2395526484865509872?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/2395526484865509872/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=2395526484865509872' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/2395526484865509872'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/2395526484865509872'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2008/11/rubyconf-2008-rush-shell-that-will.html' title='RubyConf 2008 - Day 1 - rush, a shell that will yield to you - Nicholas Schlueter'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-3370605170037890525</id><published>2008-11-10T21:21:00.000-08:00</published><updated>2008-11-11T06:51:37.477-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rubyconf2008'/><category scheme='http://www.blogger.com/atom/ns#' term='rubyconf 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Rubinius'/><category scheme='http://www.blogger.com/atom/ns#' term='rubyconf'/><title type='text'>RubyConf 2008 - Rubinius - Evan Phoenix</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://hyperphysics.phy-astr.gsu.edu/hbase/Minerals/imgmin/rubyruf.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 297px; height: 293px;" src="http://hyperphysics.phy-astr.gsu.edu/hbase/Minerals/imgmin/rubyruf.jpg" border="0" alt="" /&gt;&lt;/a&gt;The Ruby VM wonkiness continued at RubyConf 2008 - Day 1. Next up we heard the "State of Rubinius" address on the status of the anointed heir to the Ruby federation. &lt;a href="http://blog.fallingsnow.net/"&gt;Evan Phoenix&lt;/a&gt; is a fun guy, and it proved to be a both informative and enjoyable session.&lt;br /&gt;&lt;br /&gt;Evan says &lt;a href="http://rubini.us/"&gt;Rubinius&lt;/a&gt; is "meta-circular-ish", and slow, but getting faster. They have a new VM that is written in C++, which is a sharp tool, and as such, it is possible to poke your eye out. However, he says it allows them to better model work. The three main advantages are:&lt;br /&gt;&lt;br /&gt;- type safety&lt;br /&gt;- organization&lt;br /&gt;- architecture&lt;br /&gt;&lt;br /&gt;What is type safety, may ask many Rubyists. Well, sometimes a duck actually IS a duck. The Rubinius code just feels better with OO nature of C++, as opposed to just plain C. Also, it is possible to make the VM class hierarchy that mirrors the Ruby class hierarchy.&lt;br /&gt;&lt;br /&gt;Exporting Methods - a day in the life of a primitive operation&lt;br /&gt;&lt;br /&gt;- things you cannot do in Ruby&lt;br /&gt;- small example&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class String : Object {&lt;br /&gt;  Fixnum* size();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class String&lt;br /&gt;  def size&lt;br /&gt;    Ruby.primitive :string_size&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;There was interesting question about why flatten out ala :string_size aka no namespacing. Evan did not seem to give a definitive answer...&lt;br /&gt;&lt;br /&gt;Method Dispatch - From resolution to execution&lt;br /&gt;&lt;br /&gt;Resolution&lt;br /&gt;- going from receiver and method name to actual method&lt;br /&gt;- three mechanisms&lt;br /&gt;  - hierarchical lookup&lt;br /&gt;  - global cache&lt;br /&gt;  - inline cache&lt;br /&gt;&lt;br /&gt;Execution&lt;br /&gt;- every method provide an execute function pointer&lt;br /&gt;  - each primitive is an executor&lt;br /&gt;  - Ruby methods use executor specialization&lt;br /&gt;  &lt;br /&gt;Ruby Methods&lt;br /&gt;- Specialized executors based on argument info&lt;br /&gt;  - Very simple fast version for majority of cases&lt;br /&gt;  - Slower fallback case for all cases&lt;br /&gt;  &lt;br /&gt;Critical Path&lt;br /&gt;- Populate message object&lt;br /&gt;- Call rep over trampoline&lt;br /&gt;  - Fill in more of message object&lt;br /&gt;- Call method executor&lt;br /&gt;&lt;br /&gt;Execution/Framing&lt;br /&gt;- Method context objects store info about each method&lt;br /&gt;- Chained together using refs (spaghetti stack)&lt;br /&gt;- MethodContext creation speed is crucial&lt;br /&gt;&lt;br /&gt;- Default contexts are allocated in special section of memory&lt;br /&gt;- Normal execution follows simple stack pattern&lt;br /&gt;  - We can exploit to allow for fast creation and deallocation&lt;br /&gt;  &lt;br /&gt;Calling to C&lt;br /&gt;Can you imaging life without ruby gems that use C extensions? For example:&lt;br /&gt;- hpricot&lt;br /&gt;- mongrel&lt;br /&gt;- mysql&lt;br /&gt;- sqlite&lt;br /&gt;Not a problem. A simple recompile == usable in Rubinius&lt;br /&gt;&lt;br /&gt;Tricky&lt;br /&gt;- GC interaction requires indirection&lt;br /&gt;- Uses 'quantum leap" stack jumping&lt;br /&gt;- Allows for semi-graceful recovery from extension segfaults&lt;br /&gt;&lt;br /&gt;Performance&lt;br /&gt;Rubinius is doing well on micro-benchmarks&lt;br /&gt;  - method dispatch&lt;br /&gt;  - GC&lt;br /&gt;- OK on macro-benchmarks&lt;br /&gt;- Poorly on mega-benchmarks&lt;br /&gt;&lt;br /&gt;Solutions&lt;br /&gt;- LLVM&lt;br /&gt;  - JIT&lt;br /&gt;  - AOT&lt;br /&gt;- Improve algorithmic efficiency&lt;br /&gt;&lt;br /&gt;Rubinius is concentrating on compatibility right now, but will then address performance. Just like Koichi-san said, it is a curve of improvements.&lt;br /&gt;&lt;br /&gt;Evan ended up with a nice quote from Woody Allen - "If you're not failing every now and again, it's a sign you're not doing anything very innovative."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-3370605170037890525?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/3370605170037890525/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=3370605170037890525' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/3370605170037890525'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/3370605170037890525'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2008/11/rubyconf-2008-rubinius-evan-phoenix.html' title='RubyConf 2008 - Rubinius - Evan Phoenix'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-6178379794940484439</id><published>2008-11-10T10:13:00.000-08:00</published><updated>2008-11-10T21:20:48.010-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby vm'/><category scheme='http://www.blogger.com/atom/ns#' term='rubyconf2008'/><category scheme='http://www.blogger.com/atom/ns#' term='rubyconf 2008'/><title type='text'>RubyConf 2008 - Future of RubyVM - Koichi Sasada</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.atariage.com/2600/hacks/screenshots/s_YarVsYar_Hack_3.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px;" src="http://www.atariage.com/2600/hacks/screenshots/s_YarVsYar_Hack_3.png" border="0" alt="" /&gt;&lt;/a&gt;The first session I attended at RubyConf 2008 was called "Future of RubyVM", and it began my ascent into "VM Wonkiness" as I started to call it. &lt;a href="http://en.wikipedia.org/wiki/YARV"&gt;Koichi-san&lt;/a&gt; is responsible for leading the team of Ruby 1.9 implementers, and is the authoritative source of info on its status. I was hoping to learn a few things, as well as to run into new acquaintance &lt;a href="http://rubyforge.org/users/nobu/"&gt;Nobuyoshi Nakada&lt;/a&gt;, one of the core team members.&lt;br /&gt;&lt;br /&gt;Techniques for VM Performance&lt;br /&gt;- Simple techniques&lt;br /&gt; - C level VM&lt;br /&gt; &lt;br /&gt;- Advanced techniques&lt;br /&gt; - Dynamic code generation&lt;br /&gt;  - Native compilation&lt;br /&gt;  - JIT compilation&lt;br /&gt;  - Polymorphic inline cache&lt;br /&gt;  - Selective inlining&lt;br /&gt;  &lt;br /&gt; - Online feedback opt.&lt;br /&gt;  - Hotspot JIT&lt;br /&gt;  - Tracing JIT&lt;br /&gt;  &lt;br /&gt;Pros/Cons of JRuby/IronRuby&lt;br /&gt;- Using an awesome VM&lt;br /&gt;- Pros&lt;br /&gt; - Many clever people working on the project&lt;br /&gt; - No code is good code&lt;br /&gt; - Many libraries already exist on each environment&lt;br /&gt; - Easy to use parallelism&lt;br /&gt;- Cons&lt;br /&gt; - Not only focused on ruby, so there is a semantics gap.&lt;br /&gt; - Cannot use C ext direct&lt;br /&gt; &lt;br /&gt;Pros/Cons of &lt;a href="http://rubini.us/"&gt;Rubinius&lt;/a&gt;&lt;br /&gt;- Most code in ruby&lt;br /&gt;- Pros&lt;br /&gt;  - Ruby in Ruby&lt;br /&gt;  - Says this is the *best way* to improve performance in the long run because we can easily analyze and make specific performance improvements.  &lt;br /&gt;- Cons&lt;br /&gt;  - Still a LONG way to get a high performance VM&lt;br /&gt;&lt;br /&gt;Pros/Cons of C Ruby&lt;br /&gt;- Pros&lt;br /&gt;  - Portability, using GCC&lt;br /&gt;  - C is well known language already&lt;br /&gt;  - Extensibility&lt;br /&gt;  - Performance improvement&lt;br /&gt;    - Easy to write simple extensions.  &lt;br /&gt;Cons of C Ruby&lt;br /&gt;- Extension libraries are written in C&lt;br /&gt;  - GC problem&lt;br /&gt;  - Inlining problem&lt;br /&gt;  - Limitations on program analysis&lt;br /&gt;  &lt;br /&gt;Our Performance Policy&lt;br /&gt;- CRuby is not best solution, but it is a GOOD one&lt;br /&gt;- They continue to improve the CRuby implementation&lt;br /&gt;- It is a pragmatic, practical selection&lt;br /&gt;- It will be the main implementation still for at least several years&lt;br /&gt;  &lt;br /&gt;Keywords for Success&lt;br /&gt;- Embedding&lt;br /&gt;- Parallelism&lt;br /&gt;&lt;br /&gt;Research&lt;br /&gt;The team is working on taking advantage of C some projects are running&lt;br /&gt;  - Hidden optimization techniques on YARV&lt;br /&gt;  - Ricsin&lt;br /&gt;  &lt;br /&gt;Hidden Optimization Techniques&lt;br /&gt;- turned off in 1.9.1 by default&lt;br /&gt;  - Tail call optimization&lt;br /&gt;  - Optimizing using unification&lt;br /&gt;  - Stack caching&lt;br /&gt;  &lt;br /&gt;- Left easy optimizations&lt;br /&gt;  - Efficient method caching&lt;br /&gt;  - Efficient fiber implementation using platform dependent way suvh as makcontext()&lt;br /&gt;- These optimizations will be merged in 1.9.2&lt;br /&gt;&lt;br /&gt;Ricsin; Mix-in C Ruby&lt;br /&gt;- Embed part of a C program into ruby&lt;br /&gt;- Like a RubyInline, but directly embedded&lt;br /&gt;- Usage&lt;br /&gt;  - Use C libs direct&lt;br /&gt;  - Replace all built-in classes and methods&lt;br /&gt;  - Test Ruby C API&lt;br /&gt;  - Continuous performance improvements&lt;br /&gt;  &lt;br /&gt;Ruby to C AOT Compiler&lt;br /&gt;- Translate Ruby scripts to C code ahead of time&lt;br /&gt;&lt;br /&gt;Related work&lt;br /&gt;- &lt;a href="http://rubyforge.org/projects/ruby2c/"&gt;ruby2c&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://d.hatena.ne.jp/rubynews/20080525/1211730562"&gt;yajit&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://github.com/miura1729/yarv2llvm/tree/master"&gt;yarv2llvm&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Atomic-Ruby project&lt;br /&gt;- Issue: ruby is too fat&lt;br /&gt;- EMBEDDED&lt;br /&gt;  - Embedded system can have special problems, such as resource limitations&lt;br /&gt;- Application embedded ruby&lt;br /&gt;  - Some applications need just a Ruby DSL engine, not the full ruby distribution.&lt;br /&gt;- We need a slim Ruby interpreter&lt;br /&gt;- Utilize CRuby portability&lt;br /&gt;- 3 subprojects&lt;br /&gt;  - Plugin/out&lt;br /&gt;  - Precompilation&lt;br /&gt;  - Swift core features  &lt;br /&gt;  &lt;br /&gt;Auto-write barrier detection&lt;br /&gt;- write barrier needed for several GC algorithms.&lt;br /&gt;- automatic WB detection system&lt;br /&gt;&lt;br /&gt;Generational GC&lt;br /&gt;1 but ref count&lt;br /&gt;&lt;br /&gt;Multi-VM (MVM) Project&lt;br /&gt;- Multi VM in 1 process&lt;br /&gt;- Watch runs in parallel&lt;br /&gt;- High speed inter VM communication&lt;br /&gt;- Sponsored by Sun&lt;br /&gt;&lt;br /&gt;Summary&lt;br /&gt;- CRuby/YARV is not "best solution", but it is best for right now. But eventually, Rubinius is the future. Which just so happened to be the next session I attended...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-6178379794940484439?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/6178379794940484439/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=6178379794940484439' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/6178379794940484439'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/6178379794940484439'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2008/11/rubyconf-2008-future-of-rubyvm-koichi.html' title='RubyConf 2008 - Future of RubyVM - Koichi Sasada'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-9198975172576871155</id><published>2008-11-10T09:58:00.000-08:00</published><updated>2008-11-13T09:19:06.444-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='rubyconf2008'/><category scheme='http://www.blogger.com/atom/ns#' term='rubyconf 2008'/><title type='text'>RubyConf 2008 - Day 1</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_SgxaAaUGqzY/SRh3jUkcqjI/AAAAAAAABsw/qLFzJ3-Q2JI/s1600-h/IMG_0065.JPG"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 150px; height: 200px;" src="http://4.bp.blogspot.com/_SgxaAaUGqzY/SRh3jUkcqjI/AAAAAAAABsw/qLFzJ3-Q2JI/s200/IMG_0065.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5267091212910504498" /&gt;&lt;/a&gt;The crowd of over 400 was happily awaiting the kickoff in Orlando of RubyConf 2008. After brief introductions from &lt;a href='http://richkilmer.blogs.com/'&gt;Rich Kilmer&lt;/a&gt; and &lt;a href='http://dablog.rubypal.com/'&gt;David Black&lt;/a&gt;, Matz took the stage for his opening keynote.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Opening Keynote - Matz&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Reasons Behind Ruby&lt;br /&gt;8 years ago was the 1st International Ruby Conference, and there were only 33 people there. Obviously since then, the community has grown. Matz said he was not going to talk about technical stuff.&lt;br /&gt;&lt;br /&gt;Question - Why Ruby?&lt;br /&gt;Matz joked that it is his beloved masterpiece. Really though, Matz loves languages, and also loves freedom. His reason for creating Ruby was to maximize freedom.&lt;br /&gt;&lt;br /&gt;There are still a few problems. Ruby is imperfect, slow, lacks features, and is complex. And there's more. Ruby is inconsistent, has a poor implementation, has memory issues, and embedding issues.&lt;br /&gt;&lt;br /&gt;So why do we love Ruby? "Programmers Strange Love, Or How I learned to Stop Worrying and Love Ruby"&lt;br /&gt;&lt;br /&gt;The greatest Reason behind Ruby is Love. It made programming fun again. Again? It used to be fun.&lt;br /&gt;&lt;br /&gt;In 1980, Matz began programming in &lt;a href="http://en.wikipedia.org/wiki/BASIC_programming_language"&gt;BASIC&lt;/a&gt;. He liked that he could make intelligence, and felt a sense of creation. But there was also great pain.&lt;br /&gt;&lt;br /&gt;The Basic Aristocracy&lt;br /&gt;There was a big difference between language designers, vs. lowly programmers. In BASIC you cannot add to the language, and there is no abstraction.&lt;br /&gt;&lt;br /&gt;Lisp&lt;br /&gt;Everything is opposite in &lt;a href="http://en.wikipedia.org/wiki/Lisp_programming_language"&gt;Lisp&lt;/a&gt; from BASIC. In Lisp, there is no discrimination and extreme abstraction.&lt;br /&gt;&lt;br /&gt;As &lt;a href="http://www.catb.org/~esr/"&gt;Eric Raymond&lt;/a&gt; said, "Lisp is worth learning for the profound enlightenment experience you will have when you finally get it; that experience will make you a better programmer for the rest of your days..."&lt;br /&gt;&lt;br /&gt;However, Lisp was great in a book, not in reality. Programming in Lisp did not make him happy. Was it all the parentheses? No. Was it the macros? Partially.&lt;br /&gt;&lt;br /&gt;It came down to the fact that smart people just underestimate the "ordinarity" of ordinary people.&lt;br /&gt;&lt;br /&gt;Aristocracy is OK, as long as I have POWER. Matz wants to be between "owelty" and freedom (none of us in the audience knew what he had meant by "owelty" either, but Matz was on a roll, so we went with it).&lt;br /&gt;&lt;br /&gt;BASIC gives you no power, Lisp gives you all power. But at both ends we lose popularity. If you stay in BASIC you are a coward, and if you go extreme, you are brave but you risk your life (or popularity).&lt;br /&gt;&lt;br /&gt;We all love power. You see, policy matters. We need philosophy and attitude.&lt;br /&gt;&lt;br /&gt;The community cannot live by love alone, power matters.&lt;br /&gt;&lt;br /&gt;Then along came Rails which turned Ruby into a web DSL. You see, Ruby is about vocabulary. It has rules, or syntax. There are others, for example Rake and RSpec.&lt;br /&gt;&lt;br /&gt;As &lt;a href="http://pragdave.pragprog.com/"&gt;Dave Thomas&lt;/a&gt; said - "Programming is a process of designing DSL for your own application"&lt;br /&gt;&lt;br /&gt;Ruby is really like a meta-DSL. It provides a foundation for DSL's, which increases our overall productivity.&lt;br /&gt;&lt;br /&gt;But beware of commercial success, because they will try to take your freedom away.&lt;br /&gt;&lt;br /&gt;Now there are better implementations or Ruby than MRI - YARV, JRuby, Rubinius. Matz says that the various implementations are competing, which is a good thing.&lt;br /&gt;&lt;br /&gt;Matz then mentions the 4X growth expected in Ruby programmers from the current 1 million to over 4 millions. There will be NEW people coming into the community, so welcome them and nourish them. Ruby can have the power to raise up people in the programming field, so feed them, and love them.&lt;br /&gt;&lt;br /&gt;He loves us all.&lt;br /&gt;&lt;br /&gt;We love you too, Matz.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Sessions - Day 1&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I attended a number of interesting sessions throughout RubyConf 2008 day 1. Per previous reader feedback (keep each post to a manageable size!), I will put each into a separate post. Here is what I will be covering:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://deadprogrammersociety.blogspot.com/2008/11/rubyconf-2008-future-of-rubyvm-koichi.html"&gt;Future of RubyVM - Koichi Sasada&lt;/a&gt;&lt;br /&gt;&lt;a href="http://deadprogrammersociety.blogspot.com/2008/11/rubyconf-2008-rubinius-evan-phoenix.html"&gt;State Of Rubinius - Evan Phoenix&lt;/a&gt;&lt;br /&gt;&lt;a href="http://deadprogrammersociety.blogspot.com/2008/11/rubyconf-2008-rush-shell-that-will.html"&gt;rush, a shell that yields to you - Nicholas Schlueter&lt;/a&gt;&lt;br /&gt;&lt;a href="http://deadprogrammersociety.blogspot.com/2008/11/rubyconf-2008-day-1-testing-heresies.html"&gt;Testing Heresies - Francis Hwang&lt;/a&gt;&lt;br /&gt;Lightning Talks&lt;br /&gt;&lt;br /&gt;I missed a few of the lightning talks while having a nice dinner with &lt;a href='http://dablog.rubypal.com/'&gt;David Black&lt;/a&gt;, &lt;a href='http://freeze.org/'&gt;Jim Freeze&lt;/a&gt;, and &lt;a href='http://rubystuff.org/'&gt;Paul Brannan&lt;/a&gt;. Hanging out with really smart people is like a continuous lightning talk, so I didn't feel deprived by any means. Thanks, guys!&lt;br /&gt;&lt;br /&gt;After the lightning, as it were, we had the second ever Ruby Jam Session. This time, about 5 people brought guitars, including Ruby Jams veterans like &lt;a href='http://onestepback.org/'&gt;Jim Weirich&lt;/a&gt; and &lt;a href='http://funkworks.blogspot.com/'&gt;Forrest Chang&lt;/a&gt;, and lots of new friends showed up as well. I was better prepared this time around, and had brought about 10 harmonicas with me. But the tastiest part of the jam, was at the very end when &lt;a href='http://blog.davidchelimsky.net/'&gt;David Chelimsky&lt;/a&gt; and &lt;a href='http://diegoscataglini.com/'&gt;Diego Scataglini&lt;/a&gt; played some really great jazz standards. A couple of tasty beers followed the music, and then it was off to rest up for RubyConf Day 2.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-9198975172576871155?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/9198975172576871155/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=9198975172576871155' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/9198975172576871155'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/9198975172576871155'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2008/11/rubyconf-2008-day-1.html' title='RubyConf 2008 - Day 1'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_SgxaAaUGqzY/SRh3jUkcqjI/AAAAAAAABsw/qLFzJ3-Q2JI/s72-c/IMG_0065.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-4974285668034320084</id><published>2008-11-04T13:50:00.000-08:00</published><updated>2008-11-04T15:33:06.167-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vote'/><title type='text'>My Vote Was Easy</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://upload.wikimedia.org/wikipedia/commons/6/64/1900_New_York_polling_place.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 400px;" src="http://upload.wikimedia.org/wikipedia/commons/6/64/1900_New_York_polling_place.jpg" border="0" alt="" /&gt;&lt;/a&gt;Despite a massive line of people waiting for the polls to open this morning, when I went to vote just now I discovered... no line whatsoever. What a letdown! I wanted to do some sacrificing like hard struggling adherents to the cause of freedom the world over have done, just to get to the polling place, let alone cast their vote. But no, everything had to go quickly and smoothly.&lt;br /&gt;&lt;br /&gt;After accepting my offering in Halloween chocolate (stolen from my son, I might add) the friendly poll-workers ushered me to my individualized voting booth, and afterward counted my vote extra-specially well before bidding me farewell.&lt;br /&gt;&lt;br /&gt;Democracy is great, and kudos to the people that humbly and with no applause watch over our freedoms at the ground level... your friendly neighborhood poll-workers.&lt;br /&gt;&lt;br /&gt;If you haven't done it yet... go! Now!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-4974285668034320084?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/4974285668034320084/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=4974285668034320084' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/4974285668034320084'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/4974285668034320084'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2008/11/my-vote-was-easy.html' title='My Vote Was Easy'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-8265110151272577012</id><published>2008-11-04T10:50:00.000-08:00</published><updated>2008-11-04T11:19:42.909-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='ruby on rails'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='comatose'/><title type='text'>I Think I'm Comatose</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://images.publicradio.org/content/2006/05/09/20060509_killbill_2.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 300px; height: 225px;" src="http://images.publicradio.org/content/2006/05/09/20060509_killbill_2.jpg" border="0" alt="" /&gt;&lt;/a&gt;This last weekend, I upgraded a pretty complex application to the latest &lt;a href="http://www.rubyonrails.org/"&gt;Ruby on Rails&lt;/a&gt;, and consequently had to upgrade a bunch of the plugins. In the case of &lt;a href="http://github.com/darthapo/comatose/tree/master"&gt;Comatose 2.0&lt;/a&gt;, this was well timed, as there is a new release.&lt;br /&gt;&lt;br /&gt;If you have never heard of Comatose, it is a very cool mini-CMS that you add to your Rails app as a plugin. For cases where you have an applcation, and you want to put the 'static' pages under the control of the users, while still integrating with your application, Comatose is the best option I have discovered.&lt;br /&gt;&lt;br /&gt;If you are just discovering Comatose, just go check it out. Now. If, on the other hand, you are running into any problems going to the new version, read on.&lt;br /&gt;&lt;br /&gt;Since this application had been running the 0.8 version of Comatose, I ran into a little problem, which has been documented on Google Groups &lt;a href="http://groups.google.com/group/comatose-plugin/browse_thread/thread/e6402c29de92edc7/db9d2dd0fa9ac9d7?#db9d2dd0fa9ac9d7"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;If you are running the older version of Comatose, you have a migration that contains this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; module Comatose&lt;br /&gt;   class Page &lt; ActiveRecord::Base&lt;br /&gt;     set_table_name 'comatose_pages'&lt;br /&gt;     acts_as_versioned :if_changed =&gt; [:title, :slug, :keywords, :body]&lt;br /&gt;   end&lt;br /&gt; end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The new version of Comatose, however requires this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; class ComatosePage &lt; ActiveRecord::Base&lt;br /&gt;   set_table_name 'comatose_pages'&lt;br /&gt;   acts_as_versioned :if_changed =&gt; [:title, :slug, :keywords, :body]&lt;br /&gt; end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;What I did was, go and change the original migration to match the newly required format. This will allow a new clean installation to work correctly. Then, to handle upgrade installs, I created a separate rake task to perform the migration steps as described &lt;a href="http://locomotivation.com/2008/06/16/updating-comatose-to-rails-2-1"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Voila. Now this app is happily running the latest Rails, Comatose, &lt;a href="http://activescaffold.com/"&gt;ActiveScaffold&lt;/a&gt;, &lt;a href="http://www.activemerchant.org/"&gt;ActiveMerchant&lt;/a&gt;, and a few other plugins too. Life is good.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-8265110151272577012?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/8265110151272577012/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=8265110151272577012' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/8265110151272577012'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/8265110151272577012'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2008/11/i-think-im-comatose.html' title='I Think I&apos;m Comatose'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-5453494378552428802</id><published>2008-10-31T09:24:00.000-07:00</published><updated>2008-10-31T09:32:06.860-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='halloween'/><title type='text'>Oh, The Horror</title><content type='html'>&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/ddIK3CIMzFs&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/ddIK3CIMzFs&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;I was forwarded a link to the original, left on the cutting room floor ending of the Roger Corman classic horror film &lt;a href="http://www.imdb.com/title/tt0054033/"&gt;"Little Shop of Horrors"&lt;/a&gt; and not only was it a timely tidbit for Halloween, but it was also strangely appropriate for the election.&lt;br /&gt;&lt;br /&gt;Enjoy your candy...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-5453494378552428802?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/5453494378552428802/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=5453494378552428802' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/5453494378552428802'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/5453494378552428802'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2008/10/oh-horror.html' title='Oh, The Horror'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-3395294803797095997</id><published>2008-10-26T10:15:00.000-07:00</published><updated>2008-10-26T11:41:08.931-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='git'/><category scheme='http://www.blogger.com/atom/ns#' term='subversion'/><category scheme='http://www.blogger.com/atom/ns#' term='svn'/><category scheme='http://www.blogger.com/atom/ns#' term='msysgit'/><title type='text'>The Great Git Migration</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.naknekfish.com/images/salmon.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 400px; height: 259px;" src="http://www.naknekfish.com/images/salmon.jpg" border="0" alt="" /&gt;&lt;/a&gt;I have been using &lt;a href="http://git.or.cz/"&gt;git&lt;/a&gt; for a while, not quite as long as the &lt;a href="http://www.rubini.us/"&gt;really&lt;/a&gt; &lt;a href="http://peepcode.com"&gt;cool&lt;/a&gt; &lt;a href="http://www.gitcasts.com/"&gt;kids&lt;/a&gt;, but long enough to have become a git snob. As such, having to work on existing projects that were using that nasty old &lt;a href="http://subversion.tigris.org/"&gt;subversion&lt;/a&gt; was just like, a drag, man.&lt;br /&gt;&lt;br /&gt;I kept saying, "I'm going to migrate everything over to git." Somehow, I just never seemed to find the time. Another little problem was the underwhelming level of support for git on Windows. Yes, a couple of projects I am involved with have Windows code for client applications in there.&lt;br /&gt;&lt;br /&gt;So when the &lt;a href="http://code.google.com/p/msysgit/"&gt;msysgit&lt;/a&gt; project was announced, I followed it with great interest. The most recent versions are actually quite usable. I was able to install on a Vista VM (I use &lt;a href="http://www.vmware.com/products/fusion/"&gt;VMWare Fusion&lt;/a&gt; on OS X to keep the Windows thing to a minimum) and connect to several repositories on both &lt;a href="http://github.com/"&gt;github&lt;/a&gt; and &lt;a href="http://unfuddle.com/"&gt;Unfuddle&lt;/a&gt; with ease.&lt;br /&gt;&lt;br /&gt;A couple of hours waiting on git-svn to &lt;a href="http://github.com/guides/import-from-subversion"&gt;import&lt;/a&gt; the old repositories (under OS X, cause mysysgit does not appear to support git-svn), and it was all git all the time. No more svn on any of the projects I am actively working on. And I was able to preserve the entire version history of each repo, too.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-3395294803797095997?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/3395294803797095997/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=3395294803797095997' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/3395294803797095997'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/3395294803797095997'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2008/10/great-git-migration.html' title='The Great Git Migration'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-5933377282965920892</id><published>2008-10-25T16:15:00.000-07:00</published><updated>2008-10-25T16:15:00.518-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='rspec'/><category scheme='http://www.blogger.com/atom/ns#' term='ruby on rails'/><category scheme='http://www.blogger.com/atom/ns#' term='cucumber'/><category scheme='http://www.blogger.com/atom/ns#' term='bdd'/><title type='text'>Cool Like Cucumber</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.la2day.com/files/imagecache/full_article_image/files/cucumbereyes.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 440px; height: 295px;" src="http://www.la2day.com/files/imagecache/full_article_image/files/cucumbereyes.jpg" border="0" alt="" /&gt;&lt;/a&gt;Ever since I discovered &lt;a href="http://fitnesse.org/"&gt;Fitnesse&lt;/a&gt; a few years back, I have been increasingly obsessed with the idea of executable specifications and testable requirements. As far as I am concerned, &lt;a href="http://en.wikipedia.org/wiki/Behavior_driven_development"&gt;Behavior Driven Development&lt;/a&gt; (BDD) is a very appealing way to get the "people who need the software" and the "people who build the software" to understand each other.&lt;br /&gt;&lt;br /&gt;For about 2 years, give or take, many &lt;a href="http://www.rubyonrails.org/"&gt;Ruby on Rails&lt;/a&gt; developers have been switching to &lt;a href="http://rspec.info/"&gt;RSpec&lt;/a&gt;, or at least paying lip-service (giving rspec?). This is simply because, as far as automated testing, ye olde test::unit is getting a bit long in the tooth. The somewhat less ambitious &lt;a href="http://www.thoughtbot.com/projects/shoulda"&gt;shoulda&lt;/a&gt; project takes a much more minimal approach to RSpec, preferring to be a better test:unit and not going all the way to the executable specification. Maybe they did not drink the whole glass of kool-aid? Well, I did... a while back. But I digress.&lt;br /&gt;&lt;br /&gt;There have been various attempts to introduce a more readable, less "code-oriented" way to work with the users themselves to define the requirements for their solution. This led to RBehave, later merged into the RSpec story runner. Now, there is an even better tool emerging for human-readable yet testable requirements, called &lt;a href="http://github.com/aslakhellesoy/cucumber/tree/master"&gt;Cucumber&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Cucumber is the brainchild of RSpec contributor and super smart fellow &lt;a href="http://blog.aslakhellesoy.com/"&gt;Aslak Hellesoy&lt;/a&gt;. Taking the basic idea of the StoryRunner and, ahem, "running with it", Aslak has not only rewritten the entire thing using the treetop parsing engine, but he has also improved on the paradigm both for expressing the user needs, as well as the coding required to turn the requirements into executable tests.&lt;br /&gt;&lt;br /&gt;Here is a small example:&lt;br /&gt;&lt;pre class="textmate-source"&gt;&lt;span class="text text_cucumber text_cucumber_feature"&gt;&lt;span class="keyword keyword_language keyword_language_rspec keyword_language_rspec_story"&gt;Feature:&lt;/span&gt;&lt;span class="string string_language string_language_rspec string_language_rspec_story string_language_rspec_story_title"&gt; Log-in&lt;/span&gt;&lt;br /&gt;  In order to view my profile&lt;br /&gt;  &lt;span class="keyword keyword_language keyword_language_rspec keyword_language_rspec_story keyword_language_rspec_story_description"&gt;As a&lt;/span&gt;&lt;span class="string string_language string_language_rspec string_language_rspec_story string_language_rspec_story_description"&gt; Registered member&lt;/span&gt;&lt;br /&gt;  &lt;span class="keyword keyword_language keyword_language_rspec keyword_language_rspec_story keyword_language_rspec_story_description"&gt;I want&lt;/span&gt;&lt;span class="string string_language string_language_rspec string_language_rspec_story string_language_rspec_story_description"&gt; to be required to log-in&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class="keyword keyword_language keyword_language_rspec keyword_language_rspec_story keyword_language_rspec_story_scenario"&gt;Scenario&lt;/span&gt;&lt;span class="string string_language string_language_rspec string_language_rspec_story string_language_rspec_story_scenario string_language_rspec_story_scenario_title"&gt;: Proper login&lt;/span&gt;&lt;br /&gt;    &lt;span class="keyword keyword_language keyword_language_rspec keyword_language_rspec_story keyword_language_rspec_story_scenario keyword_language_rspec_story_scenario_line"&gt;Given&lt;/span&gt; I am the registered member "quire"&lt;br /&gt;    &lt;span class="keyword keyword_language keyword_language_rspec keyword_language_rspec_story keyword_language_rspec_story_scenario keyword_language_rspec_story_scenario_line"&gt;And&lt;/span&gt; I am on the login page&lt;br /&gt;    &lt;span class="keyword keyword_language keyword_language_rspec keyword_language_rspec_story keyword_language_rspec_story_scenario keyword_language_rspec_story_scenario_line"&gt;When&lt;/span&gt; I fill in "email" with "quire@example.com"&lt;br /&gt;    &lt;span class="keyword keyword_language keyword_language_rspec keyword_language_rspec_story keyword_language_rspec_story_scenario keyword_language_rspec_story_scenario_line"&gt;And&lt;/span&gt; I fill in "password" with "quire69"&lt;br /&gt;    &lt;span class="keyword keyword_language keyword_language_rspec keyword_language_rspec_story keyword_language_rspec_story_scenario keyword_language_rspec_story_scenario_line"&gt;And&lt;/span&gt; I press "Login"&lt;br /&gt;    &lt;span class="keyword keyword_language keyword_language_rspec keyword_language_rspec_story keyword_language_rspec_story_scenario keyword_language_rspec_story_scenario_line"&gt;Then&lt;/span&gt; I should see "Account Activity"&lt;br /&gt;&lt;br /&gt;  &lt;span class="keyword keyword_language keyword_language_rspec keyword_language_rspec_story keyword_language_rspec_story_scenario"&gt;Scenario&lt;/span&gt;&lt;span class="string string_language string_language_rspec string_language_rspec_story string_language_rspec_story_scenario string_language_rspec_story_scenario_title"&gt;: Bad password&lt;/span&gt;&lt;br /&gt;    &lt;span class="keyword keyword_language keyword_language_rspec keyword_language_rspec_story keyword_language_rspec_story_scenario keyword_language_rspec_story_scenario_line"&gt;Given&lt;/span&gt; I am the registered member "quire"&lt;br /&gt;    &lt;span class="keyword keyword_language keyword_language_rspec keyword_language_rspec_story keyword_language_rspec_story_scenario keyword_language_rspec_story_scenario_line"&gt;And&lt;/span&gt; I am on the login page&lt;br /&gt;    &lt;span class="keyword keyword_language keyword_language_rspec keyword_language_rspec_story keyword_language_rspec_story_scenario keyword_language_rspec_story_scenario_line"&gt;When&lt;/span&gt; I fill in "email" with "quire@example.com"&lt;br /&gt;    &lt;span class="keyword keyword_language keyword_language_rspec keyword_language_rspec_story keyword_language_rspec_story_scenario keyword_language_rspec_story_scenario_line"&gt;And&lt;/span&gt; I fill in "password" with "bad password"&lt;br /&gt;    &lt;span class="keyword keyword_language keyword_language_rspec keyword_language_rspec_story keyword_language_rspec_story_scenario keyword_language_rspec_story_scenario_line"&gt;And&lt;/span&gt; I press "Login"&lt;br /&gt;    &lt;span class="keyword keyword_language keyword_language_rspec keyword_language_rspec_story keyword_language_rspec_story_scenario keyword_language_rspec_story_scenario_line"&gt;Then&lt;/span&gt; I should see "Simply enter the credentials you signed up with."&lt;br /&gt;    &lt;span class="keyword keyword_language keyword_language_rspec keyword_language_rspec_story keyword_language_rspec_story_scenario keyword_language_rspec_story_scenario_line"&gt;And&lt;/span&gt; I should see "Couldn't log you in as 'quire@example.com'"&lt;br /&gt;  &lt;br /&gt;  &lt;span class="keyword keyword_language keyword_language_rspec keyword_language_rspec_story keyword_language_rspec_story_scenario"&gt;Scenario&lt;/span&gt;&lt;span class="string string_language string_language_rspec string_language_rspec_story string_language_rspec_story_scenario string_language_rspec_story_scenario_title"&gt;: Bad email&lt;/span&gt;&lt;br /&gt;    &lt;span class="keyword keyword_language keyword_language_rspec keyword_language_rspec_story keyword_language_rspec_story_scenario keyword_language_rspec_story_scenario_line"&gt;Given&lt;/span&gt; I am the registered member "quire"&lt;br /&gt;    &lt;span class="keyword keyword_language keyword_language_rspec keyword_language_rspec_story keyword_language_rspec_story_scenario keyword_language_rspec_story_scenario_line"&gt;And&lt;/span&gt; I am on the login page&lt;br /&gt;    &lt;span class="keyword keyword_language keyword_language_rspec keyword_language_rspec_story keyword_language_rspec_story_scenario keyword_language_rspec_story_scenario_line"&gt;When&lt;/span&gt; I fill in "email" with "quire@example.co"&lt;br /&gt;    &lt;span class="keyword keyword_language keyword_language_rspec keyword_language_rspec_story keyword_language_rspec_story_scenario keyword_language_rspec_story_scenario_line"&gt;And&lt;/span&gt; I fill in "password" with "password"&lt;br /&gt;    &lt;span class="keyword keyword_language keyword_language_rspec keyword_language_rspec_story keyword_language_rspec_story_scenario keyword_language_rspec_story_scenario_line"&gt;And&lt;/span&gt; I press "Login"&lt;br /&gt;    &lt;span class="keyword keyword_language keyword_language_rspec keyword_language_rspec_story keyword_language_rspec_story_scenario keyword_language_rspec_story_scenario_line"&gt;Then&lt;/span&gt; I should see "Simply enter the credentials you signed up with."&lt;br /&gt;    &lt;span class="keyword keyword_language keyword_language_rspec keyword_language_rspec_story keyword_language_rspec_story_scenario keyword_language_rspec_story_scenario_line"&gt;And&lt;/span&gt; I should see "Couldn't log you in as 'quire@example.co'" &lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now THAT is a nice clear way to define what a system is supposed to do. Furthermore, actually implementing the "steps" that exercise the system functionality is very simple as well:&lt;br /&gt;&lt;pre class="textmate-source"&gt;&lt;span class="source source_ruby source_ruby_rspec source_ruby_rspec_cucumber source_ruby_rspec_cucumber_steps"&gt;&lt;span class="keyword"&gt;Given&lt;/span&gt; &lt;span class="keyword keyword_operator keyword_operator_arithmetic keyword_operator_arithmetic_ruby"&gt;/&lt;/span&gt;&lt;span class="variable variable_other variable_other_constant variable_other_constant_ruby"&gt;I&lt;/span&gt; am the registered member &lt;span class="string string_quoted string_quoted_double string_quoted_double_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;"&lt;/span&gt;quire&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="keyword keyword_operator keyword_operator_arithmetic keyword_operator_arithmetic_ruby"&gt;/&lt;/span&gt; &lt;span class="keyword keyword_control keyword_control_start-block keyword_control_start-block_ruby"&gt;do&lt;br /&gt;&lt;/span&gt;  &lt;span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby"&gt;@&lt;/span&gt;user&lt;/span&gt; &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby"&gt;=&lt;/span&gt; &lt;span class="support support_class support_class_ruby"&gt;User&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;&lt;span class="keyword keyword_other keyword_other_special-method keyword_other_special-method_ruby"&gt;new&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_ruby"&gt;{&lt;/span&gt;&lt;span class="meta meta_syntax meta_syntax_ruby meta_syntax_ruby_start-block"&gt; &lt;/span&gt;&lt;span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby"&gt;:&lt;/span&gt;login&lt;/span&gt; &lt;span class="punctuation punctuation_separator punctuation_separator_key-value"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="string string_quoted string_quoted_single string_quoted_single_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;'&lt;/span&gt;quire&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; &lt;span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby"&gt;:&lt;/span&gt;email&lt;/span&gt; &lt;span class="punctuation punctuation_separator punctuation_separator_key-value"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="string string_quoted string_quoted_single string_quoted_single_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;'&lt;/span&gt;quire@example.com&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; &lt;span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby"&gt;:&lt;/span&gt;password&lt;/span&gt; &lt;span class="punctuation punctuation_separator punctuation_separator_key-value"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="string string_quoted string_quoted_single string_quoted_single_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;'&lt;/span&gt;quire69&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; &lt;span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby"&gt;:&lt;/span&gt;password_confirmation&lt;/span&gt; &lt;span class="punctuation punctuation_separator punctuation_separator_key-value"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="string string_quoted string_quoted_single string_quoted_single_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;'&lt;/span&gt;quire69&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; &lt;span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby"&gt;:&lt;/span&gt;terms_of_service&lt;/span&gt; &lt;span class="punctuation punctuation_separator punctuation_separator_key-value"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="constant constant_language constant_language_ruby"&gt;true&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; &lt;span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby"&gt;:&lt;/span&gt;primary_talent_id&lt;/span&gt; &lt;span class="punctuation punctuation_separator punctuation_separator_key-value"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="constant constant_numeric constant_numeric_ruby"&gt;1&lt;/span&gt; &lt;span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_ruby"&gt;}&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;)&lt;/span&gt;&lt;br /&gt;  &lt;span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby"&gt;@&lt;/span&gt;user&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;save!&lt;br /&gt;&lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="keyword"&gt;Given&lt;/span&gt; &lt;span class="string string_quoted string_quoted_single string_quoted_single_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;'&lt;/span&gt;I am on the login page&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class="keyword keyword_control keyword_control_start-block keyword_control_start-block_ruby"&gt;do&lt;br /&gt;&lt;/span&gt;  visits &lt;span class="string string_quoted string_quoted_double string_quoted_double_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;"&lt;/span&gt;/login&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="keyword"&gt;Then&lt;/span&gt; &lt;span class="string string_quoted string_quoted_single string_quoted_single_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;'&lt;/span&gt;I should be taken to my dashboard page&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class="keyword keyword_control keyword_control_start-block keyword_control_start-block_ruby"&gt;do&lt;br /&gt;&lt;/span&gt;  response&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;request&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;path&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;should &lt;span class="keyword keyword_operator keyword_operator_comparison keyword_operator_comparison_ruby"&gt;==&lt;/span&gt; user_path&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;&lt;span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby"&gt;@&lt;/span&gt;user&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Since &lt;a href="http://github.com/brynary/webrat/tree/master"&gt;WebRat&lt;/a&gt; is fully integrated into Cucumber, and there are already a group of useful steps included, you can get surprisingly far while defining fairly few steps of your own. And when you do have to, working with Cucumber really is quite superior to  the old StoryRunner.&lt;br /&gt;&lt;br /&gt;I am working on two projects right now that are using BDD and Cucumber, and we are very happy with it. We now have a lot of visibility into how complete a feature is, and it helps everyone understand what a feature does, and how it is supposed to work.&lt;br /&gt;&lt;br /&gt;Once again, great work from the RSpec crew. Thanks, guys!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-5933377282965920892?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/5933377282965920892/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=5933377282965920892' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/5933377282965920892'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/5933377282965920892'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2008/10/cool-like-cucumber.html' title='Cool Like Cucumber'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-5433540078732840100</id><published>2008-09-10T16:54:00.000-07:00</published><updated>2008-09-10T17:10:11.750-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rubyconf2008'/><category scheme='http://www.blogger.com/atom/ns#' term='rubyconf 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='rubyconf'/><title type='text'>Going To RubyConf 2008</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://media.tbo.com/photos/trib/2008/feb/021808derby.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px;" src="http://media.tbo.com/photos/trib/2008/feb/021808derby.jpg" border="0" alt="" /&gt;&lt;/a&gt;Yes, it has been quite a while since I last posted. I have been busy with several interesting code things I will be talking about soon, along with my family's annual trip to Spain (lots of good times, but no posting about that).&lt;br /&gt;&lt;br /&gt;Busy, yes. but not TOO busy to make my plans to go to &lt;a href="http://www.rubyconf.org/"&gt;RubyConf 2008&lt;/a&gt;. November in Florida, I can just imagine it now... hard core Ruby coding, jam sessions in the hotel, and maybe even some post-election riots. Plus roller disco. Damn, I'm there!&lt;br /&gt;&lt;br /&gt;And if you want to be there, better get it together and &lt;a href="https://www.regonline.com/rubyconf2008"&gt;register now&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-5433540078732840100?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/5433540078732840100/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=5433540078732840100' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/5433540078732840100'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/5433540078732840100'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2008/09/going-to-rubyconf-2008.html' title='Going To RubyConf 2008'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-2122444355554061919</id><published>2008-06-08T21:14:00.000-07:00</published><updated>2008-06-08T22:55:45.912-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='railsconf'/><category scheme='http://www.blogger.com/atom/ns#' term='railsconf 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='railsconf2008'/><title type='text'>RailsConf 2008 - Day 2</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_SgxaAaUGqzY/SEzEQxsxKAI/AAAAAAAABMw/F65ZTrMgTb0/s1600-h/05-31-08_0744.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_SgxaAaUGqzY/SEzEQxsxKAI/AAAAAAAABMw/F65ZTrMgTb0/s200/05-31-08_0744.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5209754661458880514" /&gt;&lt;/a&gt;Day 2 of RailsConf 2008 began with a keynote from &lt;a href="http://bitsweat.net/"&gt;Jeremy Kemper&lt;/a&gt;, uber-committer and now main man behind Ruby on Rails. According to the brief introduction by DHH, Jeremy did around one third of the Rails 1.0 release himself, cares deeply about the "whole thing", and has been busy helping get RoR running on Ruby 1.9 and other platforms.&lt;br /&gt;&lt;br /&gt;That must explain why Jeremy kept yawning incessantly during his presentation... he is the reason DHH is able to get more sleep! There was some speculation that Jeremy was actually suffering from a hangover... I have no idea, I was asleep the night before.&lt;br /&gt;&lt;br /&gt;Anyhow, Jeremy gave an overview of going from Rails 1.0 to the new 2.1 release. Basically, in his opinion 1.2 was "out for a while and got stale". In 2.0, we got all these foxy and sexy things, plus shed a lot of fat and gained speed. But the real story was the growth of the movement behind Rails from a fairly small group of core people, to a massive community of interested contributors. Here are some amazing stats:&lt;br /&gt;&lt;br /&gt;From the 2.0 release in Dec 2007 to the 2.1 release in June 2008&lt;br /&gt;&lt;br /&gt;&gt; 1400 contributors (Trac, Lighthouse, and Github users combined... obviously a bunch are duplicates, but even 450+ is a large number!)&lt;br /&gt;&gt; 1600 patches&lt;br /&gt;&gt; 9000 comments&lt;br /&gt;&lt;br /&gt;I cannot imagine the chaos of having THAT MANY people harassing me over getting their pet patches into the Rails trunk. No wonder they seem a little preoccupied... they are actually thinking about how many patches that will have to reviewed by later tonight! Much respect to the team just for dealing with that many crazed developers. This is to a large extent the key benefit of moving &lt;a href="http://github.com/rails/rails/tree/master"&gt;RoR on to Github&lt;/a&gt;: the much easier process of managing all these people's contributions.&lt;br /&gt;&lt;br /&gt;Here are a few brief highlights of the new 2.1 features:&lt;br /&gt;&lt;br /&gt;* New merged migrations - helps deal with keeping migrations synched throughout the development team. It does this by a new naming system, and now making sure that all unapplied migrations have been handled, instead of the old simple schema_info table, RoR now keeps track of all migrations, and makes sure that all migrations have been applied&lt;br /&gt;&lt;br /&gt;* Time zone support - there were several plugins for time zone support. RoR has now included a fairly simple way of handling this with some baked in logic that extends both the Time class as well as some new ActiveSupport hotness. &lt;br /&gt;&lt;br /&gt;* Ruby gem dependencies - now you can specify exactly which gems and versions are needed for your Rails app, instead of playing "one of these gems is not like the others" when trying to install or deploy a Rails app.&lt;br /&gt;&lt;br /&gt;* Memcache - support for the ultra powerful memcache is now baked in, making fragment caching work nicely... made memcache a first class member of framework, and the memcache client is now bundled with the code distribution.&lt;br /&gt;&lt;br /&gt;* ActiveRecord Dirty - now a way of track what has changed in a AR instance. This improves performance slightly by eliminating unnecessary database writes, but even more importantly results in much cleaner log files.&lt;br /&gt;&lt;br /&gt;* Smarter :include - avoids combinatorial explosion with out of control includes, that result in too many left outer joins on every DB access. Instead, will just perform two queries to DB, with resulting database performance improvements. For example:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Msg.find(:all, :include =&gt; :user) # two queries&lt;br /&gt;Msg.find(:all, :include =&gt; :user, :order_by =&gt; 'users.created_at) # uses outer join&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;* Named scopes - with complex models, you will have repeated convenience associations. For example:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;user.recent_messages&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;You would prefer:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;user.messages.recent&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;especially if you can pick it up "for free". Here is a tiny example:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class User&lt;br /&gt; has_many :messages&lt;br /&gt; ...&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;class Messages&lt;br /&gt; named_scope :recent, :order =&gt; 'created_by DESC'&lt;br /&gt; ...http://www2.blogger.com/img/gl.link.gif&lt;a href="http://www.ironruby.net/"&gt;&lt;/a&gt;&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;An Embarrassment Of Riches In Ruby VM-land&lt;/b&gt;&lt;br /&gt;Rails is now running in  (milestone achieved just before the conference, thanks to heroic efforts by &lt;a href="http://www.iunknown.com/"&gt;John Lam&lt;/a&gt;, and the rest of what is a very under-appreciated team within the Ruby community at-large). Rails has been running in &lt;a href="http://jruby.codehaus.org/"&gt;JRuby&lt;/a&gt; for months. Also, RoR has been running in &lt;a href="http://rubini.us/"&gt;Rubinius&lt;/a&gt; since about two weeks before RailsConf.&lt;br /&gt;&lt;br /&gt;And adding to the fun, &lt;a href="http://www.ruby-lang.org/en/"&gt;Ruby 1.87 is now released&lt;/a&gt;, which includes a bunch of performance related backports from the once and future Ruby 1.9 release.&lt;br /&gt;&lt;br /&gt;Just to show all of this multi-platform hotness, Jeremy did a little Rails 2.1 demo, showing the a minimal Rails app running on JRuby, Rubinius, and Ruby 1.9. That was amazing really, that we are actually here. Sure, Rubinius was kinda slow at starting up, but it &lt;i&gt;worked&lt;/i&gt;, that is what counts.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Ruby 1.9 on Rails&lt;/b&gt;&lt;br /&gt;Yes, you can actually run Rails on Ruby 1.9, at least somewhat. ruby-1.9 script/server&lt;br /&gt;&lt;br /&gt;In Ruby 1.9, string encoding is huge change. According to Jeremy, 1.9 looks really fast... despite no formal benchmarks. He sees modest performance improvements on typical pages, and really notices it on bigger ERB pages. The typical page is about 20% faster. He says all rails tests are running on ruby 1.9.&lt;br /&gt;&lt;br /&gt;Despite all of the yawning, I was not put to sleep at all by seeing some cool new Rails features, and even more importantly a few huge milestones in the Ruby VM race.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;"Getting Git" - Scott Chacon&lt;/b&gt;&lt;br /&gt;The keynote was good, but it had only whetted my appetite for even more substance. After a tip from a friend, I went to check out &lt;a href="http://jointheconversation.org/"&gt;Scott Chacon&lt;/a&gt;'s presentation on git. If you knew nothing about git, this was not the place for you. Scott really got into the internals of git, which many of us found captivating.&lt;br /&gt;&lt;br /&gt;The room was pretty packed, and the crowd was held in rapt attention. Several of us remarked afterwards that it was the most organized presentation we had ever seen. It somewhat mimicked the format used during &lt;a href="http://identity20.com/media/OSCON2005/"&gt;Dick Hardt's presentation on "Identity 2.0" at OSCON 2005&lt;/a&gt;, if you have seen that one. Each section of the presentation was precisely timed, and amount of material covered was massive. I took copious notes, but there was no way to try to capture that much info. Check it out online &lt;a href="http://www.gitcasts.com/git-talk"&gt;here&lt;/a&gt;, if you want to dive deeply into the glory that is git.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;"Advanced RESTful Rails" - Ben Scofield&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Next, I went to &lt;a href="http://www.culann.com/"&gt;Ben Scofield&lt;/a&gt;'s presentation on REST. Surprisingly a lot of people are not yet using REST. Or if they are, there appears to be some confusion over exactly how to implement things correctly. It was a decent presentation, but "Intermediate" would have been slightly more accurate. I mean, where was the discussion about polymorphic RESTful controllers? Now THAT would have been advanced.&lt;br /&gt;&lt;br /&gt;It was still a good, if not great presentation. Ben knows what he is talking about, I would just suggest raising the bar as far as use of the word "advanced". That suggestion applies across the board to all RailsConf presentations.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;"StoryRunner" - David Chemlisky&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blog.davidchelimsky.net/"&gt;David Chelimsky&lt;/a&gt; is the closest thing we have to a test guru in the Ruby community. Here I am using the word guru in a precise way, "any person who counsels or advises; mentor". No single person has had as much impact on introducing best test practices like behavior-driven development to the Ruby community. Even the way that plain old test-driven development is done, is heavily influenced by &lt;a href="http://rspec.info/"&gt;RSpec&lt;/a&gt;. Not to mention the clones like &lt;a href="http://rubyforge.org/projects/test-spec/"&gt;Test::Spec&lt;/a&gt; and &lt;a href="http://www.thoughtbot.com/projects/shoulda"&gt;shoulda&lt;/a&gt;. All of the cooler projects I work on have test specs, and not just unit tests. The projects that I work on that are not as precisely thought out, turn out to not have test specs, but only unit tests.&lt;br /&gt;&lt;br /&gt;Coincidence? I think not. The reason for going through the process of really defining what is to be done is to provide a common understanding between the people in the project. But if that was the whole story, BDUF might work. The problem is you need to apply test-driven development principals &lt;i&gt;to the specifications themselves&lt;/i&gt; in your project, not just the code. And you need to be doing this as the project goes on, not just once in the beginning.&lt;br /&gt;&lt;br /&gt;Behavior-driven development is about closing the gap between the "customer" (the system/site/application user, if you work in something other than a consulting firm) and the "developer" (that would be you). And that is where StoryRunner comes in.&lt;br /&gt;&lt;br /&gt;StoryRunner makes it easy to create a kind of simple parser for a very english language oriented, simple text based way to write specs, requiring far less structure that the current RSpec format. It is really like a DSL that customers can use themselves to define their needs. As David put it, "Ruby code is very readable, but you will not be getting customers to send you emails with new requirements in the form of Ruby code."&lt;br /&gt;&lt;br /&gt;So BDD is about helping the customer/user formalize their thoughts about exactly what solution they need. Can you imaging a future, where an initial RFP is put out in the form of test specs? That might provide a lot better basis for estimating, than the pages and pages of static docs that seem to still be getting cranked out inside large development organizations.&lt;br /&gt;&lt;br /&gt;Have the requirements been changing? Just do a diff on the specs. There are so many advantages to this approach, that once you get the customer "spec-obsessed", just like developers who become "test-obsessed" the game is totally changed. You can't go back, at least willingly.&lt;br /&gt;&lt;br /&gt;David talked about a couple of other tools that fit nicely in the RSpec stack. One very cool way to use it for full-stack integration testing is using &lt;a href="http://github.com/brynary/webrat/tree/master"&gt;Webrat&lt;/a&gt;. Another is doing true browser testing using &lt;a href="http://selenium-rc.openqa.org/"&gt;Selenium-RC&lt;/a&gt;. David showed a demo of this, and remarked on how happy it made customers to be able to actually see their web site being tested, not just get the results back.&lt;br /&gt;&lt;br /&gt;Note that RSpec is for use with Ruby, not just Rails, so if you are using Merb or Sinatra, or whatever, you can still write test specs using RSpec and StoryRunner.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_SgxaAaUGqzY/SEzEc9zpt7I/AAAAAAAABM4/YAJ7D0J1yiE/s1600-h/05-31-08_1855.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_SgxaAaUGqzY/SEzEc9zpt7I/AAAAAAAABM4/YAJ7D0J1yiE/s200/05-31-08_1855.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5209754870867408818" /&gt;&lt;/a&gt;&lt;b&gt;Keynote - Kent Beck&lt;/b&gt;&lt;br /&gt;During Chad Fowler's introduction, Chad said he was "like one of the superdelegates, getting to cast his vote about what we would get for presentations regardless of what we thought we wanted." All I can say is, Chad, keep it up. Some of these people might not get it, but if they continue to stay in this game long enough, they will. &lt;br /&gt;&lt;br /&gt;At last, the moment I had been waiting for, and the biggest attraction for me personally in the RailsConf 2008 schedule: &lt;a href="http://en.wikipedia.org/wiki/Kent_Beck"&gt;Kent Beck&lt;/a&gt;, one of the extremes, the Saturday night keynote. &lt;br /&gt;&lt;br /&gt;Kent's presentation on the surface appeared highly informal, just a bunch of stories. It actually consisted of a serious of overlapping arcs on three topics that he knows a little about, because he helped create them: test-driven development, design patterns, and Extreme Programming. These stories took place over a 20 year timeline, stretching back to the origins of the work that the whole Rails community indirectly rides on today. This was before a bunch of RailsConf attendees were born, or at best were still in diapers. &lt;br /&gt;&lt;br /&gt;I was pretty immersed in Kent's storytelling. I was too young to have been part of that original movement, but I'm old enough to want to learn all I can from the great masters, before they are all retired or just inaccessible. Amazing to have access to a couple of the extremes, like Ward Cunningham who was just hanging out on Day 1, at a fairly small conference like RailsConf, where most of the people do not even know who they are. For me, it is like a dream come true. If a bunch of other people are passing up the equivalent of intellectual caviar to stuff themselves with potato chips, well, good for them.&lt;br /&gt;&lt;br /&gt;Enough ranting, back to Kent's &lt;a href="http://www.amazon.com/Beelzebubs-Tales-His-Grandson-Everything/dp/0140194738"&gt;"Tales to His Grandson"&lt;/a&gt;. The unifying theme that emerged to me was that Kent is a true 60's radical who chose software as his weapon of choice to use in order to achieve social change. Like many great thinkers, Kent is a reader of books. Yes, those old things. Here are a few that he specifically mentioned that were instrumental in the development of his philosophies:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/Timeless-Way-Building-Christopher-Alexander/dp/0195024028"&gt;Christopher Alexander - "The Timeless Way Of Building"&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/Naked-Cartoonist-Enhance-Your-Creativity/dp/1579122361"&gt;Robert Mankoff - "The Naked Cartoonist: A New Way to Enhance Your Creativity"&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/WORDS-THAT-WORK-WHAT-PEOPLE/dp/1401302599"&gt;Dr. Frank Luntz - "WORDS THAT WORK: IT'S NOT WHAT YOU SAY, IT'S WHAT PEOPLE HEAR"&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The last question in the Q&amp;A was really telling. When asked "do you think that you accomplished the political changes you set out to?" he responded that "No, he had not. And that he really did not fully understand why". Oh, those idealistic baby boomers! Kent, you may not have achieved all you set out to do directly, but the forces you set in motion are still going. Even though many of the attendees at RailsConf do not know you, they have grown up in a world where they expect more freedom and openness, and that is in part thanks to you, and fighting the good fight back then. Thanks, Kent, for staying true to the movement.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;RailsConf - The Jam Session&lt;/b&gt;&lt;br /&gt;After that very high level of intellectual brilliance, what could possibly top it off? How about a fantastic musical jam session. Chad had arranged the Musical BoF, and somehow &lt;a href="http://onestepback.org/"&gt;Jim Weirich&lt;/a&gt; had talked a &lt;a href="http://www.artichokemusic.com"&gt;very generous and cool local music store&lt;/a&gt; into loaning him a perfectly playable acoustic guitar. Chad had his ukulele, &lt;a href="http://www.chariotsolutions.com/"&gt;Andrea Wright&lt;/a&gt; a recorder, and &lt;a href="http://blog.almostaspacegame.com/"&gt;Dan Tripp&lt;/a&gt;, a portable folding guitar. I had brought a couple of my harmonicas with me, though not enough, of course. There were a bunch of other fun musical things, like a flute, and an impromptu Brazilian song or two from actual Brazilians. Not to mention a very creative approach toward an impromptu percussion setup by &lt;a href="http://funkworks.blogspot.com/"&gt;Forrest Chang&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Anyhow, great fun was had by all! We are already planning the RubyConf 2008 Jam, so it you will be coming, bring your ax! I will commit right now to the Dead Programmer Society helping sponsor having some instruments and/or PA system... plus some beer! &lt;br /&gt;&lt;br /&gt;As I headed back to my room, I felt the smug contentment that comes from having had a really good time. Thanks everyone, for having made RailsConf 2008 "worth it" by the end of Day 2. Day 3 was still coming, and would have a few surprises of its own...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-2122444355554061919?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/2122444355554061919/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=2122444355554061919' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/2122444355554061919'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/2122444355554061919'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2008/06/railsconf-2008-day-2.html' title='RailsConf 2008 - Day 2'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_SgxaAaUGqzY/SEzEQxsxKAI/AAAAAAAABMw/F65ZTrMgTb0/s72-c/05-31-08_0744.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-8217543135673929961</id><published>2008-06-04T13:49:00.000-07:00</published><updated>2008-06-04T19:54:28.449-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='railsconf'/><category scheme='http://www.blogger.com/atom/ns#' term='railsconf 2008'/><title type='text'>RailsConf 2008 - Day 1</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_SgxaAaUGqzY/SEdG7hwJ-RI/AAAAAAAABMo/YxS6n7MViO4/s1600-h/05-31-08_0740.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_SgxaAaUGqzY/SEdG7hwJ-RI/AAAAAAAABMo/YxS6n7MViO4/s200/05-31-08_0740.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5208209482563844370" /&gt;&lt;/a&gt;As &lt;a href="http://en.oreilly.com/rails2008"&gt;RailsConf 2008&lt;/a&gt; - Day 1 began, there was no avoiding a sense of just how large the community was growing. With over 2000 attendees, the physical presence was bigger than ever. But, unlike the first two conferences, the growth of the community had triggered inexorable changes. Unbeknownst to most attendees at RailsConf 2008, a rebel alliance had formed itself. The &lt;a href="http://caboo.se/"&gt;caboo.se&lt;/a&gt; crew, longtime Ruby on Rails committers, had decided to stick it to the MAN. Or as &lt;a href="http://conference.caboose.org/2008/1/30/launch"&gt;Courteney&lt;/a&gt; put it:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;In May, if you don't want to cough up almost a thousand dollars to go learn things you already know, but want to come to Portland to network with skilled Rails coders from all over the world, instead of hanging out in the lobby at the Lloyd Center like I did last year, come to Caboose Conf.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;The spawning impulse must have been too great for the cool kids. They were heavily conflicted when O'Reilly took over for RailsConf 2007. Not being one of them, I can only surmise how they felt. But no one likes to pay for something that once was free. And it is unpleasant to have a bunch of strangers running around what was once their private garden. But this was deeper, a sense that something had shifted, and would never return.&lt;br /&gt;&lt;br /&gt;You can take the caboose out of the ghetto, but you cannot take the ghetto out of the caboose. Many people at RailsConf felt your absence, comrades, if any of you are reading this! As I mentioned earlier, the vast majority of attendees, including repeat ones, were totally unaware of the specifics. But they sensed something missing, some crucial element lacking.&lt;br /&gt;&lt;br /&gt;At the same time, the community is now larger. And there are tremendous advantages to the incursions of the money people into the private reserve. The people who were saying to each other in 2006, "I wish I could program in Rails full-time, and quit programming in Java/C#/WTFLang" were now saying "I wish recruiters would stop harassing me!"&lt;br /&gt;&lt;br /&gt;That all said, the Rails community needs the caboose crew, like we need our gall bladders. It is just a little organ compared to the overall size of the body, but without it, you will not survive long, and if you do, you will be feeling so well.&lt;br /&gt;&lt;br /&gt;It would appear that the rebels had struck their first blow. But more about that would be revealed on Day 3.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://chadfowler.com/"&gt;Chad Fowler&lt;/a&gt; still had the his job leading off the proceedings in the new, more corporate RailsConf. As such, the ukelele would be banished from the main stage, along with any other musical instruments during presentations. &lt;a href="http://www.joeydevilla.com/"&gt;Joey&lt;/a&gt;, we miss your accordion, too.&lt;br /&gt;&lt;br /&gt;Chad mentioned that there were over ten times more proposals for RailsConf 2008, than attendees at RailsConf 2006. That certainly explains why &lt;i&gt;my&lt;/i&gt; proposal was not accepted... of course, the title being "Pedal To The Metal: Alternatives To Rails"  might also have had something to do with it.&lt;br /&gt;&lt;br /&gt;Anyhow, Chad was almost apologetic as he explained how people were pissed off about RailsConf 2006 because it had sold out so quickly, and now that they had increased the size enough, people complained that the conference was "losing it's luster." You can't win, dude! But I still support what you're doing.&lt;br /&gt;&lt;br /&gt;At that point, he introduced &lt;a href="http://www.joelonsoftware.com/"&gt;Joel Spolsky&lt;/a&gt;. Now, when I had read that Joel would be the opening keynote for RailsConf 2008, I had been fairly surprised. Although the penchant of the Ruby/Ruby on Rails community IS to reach out to others for ideas and technology, with the well-publicized spat between Joel and DHH, the choice seemed a curious one.&lt;br /&gt;&lt;br /&gt;Joel was funny, and entertaining. He had slides, and seemed like he was leading up to some big point. But after the dog and pony show was over, I felt like I had drunk an extra-large zero calorie soda: a feeling of fullness, but no actual nutritional value to it. I was not exactly disappointed, but I was far from impressed.&lt;br /&gt;&lt;br /&gt;Next, I headed into the Entrepreneurs on Rails session by &lt;a href="http://hivelogic.com/"&gt;Dan Benjamin&lt;/a&gt;. The presentation was probably worthwhile if you have never formed a business before, but my attention wandered, which is why I will not be writing anything else about it here.&lt;br /&gt;&lt;br /&gt;So far, I was zero for two on my personal "&lt;a href="http://deadprogrammersociety.blogspot.com/2008/05/railsconf-2008-better-be-good.html"&gt;RailsConf 2008 was worth it&lt;/a&gt;" scale. Hmmm.&lt;br /&gt;&lt;br /&gt;I got a bit more enthused at &lt;a href="http://blog.8thlight.com/articles/tag/micah"&gt;Micah Martin&lt;/a&gt;'s session "10 Things I Hate About Web Development", where I finally got to see the long awaited demo of &lt;a href="limelight.8thlight.com"&gt;Limelight&lt;/a&gt;, which Micah had been dropping hints about at RubyConf last year. I have a separate posting I will put up with info on that session.&lt;br /&gt;&lt;br /&gt;After that, with my energy picking up, I went to "Rubinius: Under The Hood and Behind the Curtain" presented by &lt;a href="http://blog.fallingsnow.net/"&gt;Evan Phoenix&lt;/a&gt;, &lt;a href="http://blog.brightredglow.com/"&gt;Brian Ford&lt;/a&gt;, &amp; &lt;a href="http://metaclass.org/"&gt;Wilson Bilkovich&lt;/a&gt;. This was a fun and informative session about the current state of &lt;a href="http://rubini.us/"&gt;Rubinius&lt;/a&gt;, although if you have been following the various blogs/IRC/github you already knew what he was talking about. Still, it was nice to see the core Rubinius team in person, and to get the sense of the crowd's excitement about Rubinius. I will be posting separately about this session.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm3.static.flickr.com/2074/2539395079_6d1f05b6b7.jpg?v=0"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px;" src="http://farm3.static.flickr.com/2074/2539395079_6d1f05b6b7.jpg?v=0" border="0" alt="" /&gt;&lt;/a&gt;There was a great moment that is really representative of what I get out of RailsConf. Walking between sessions, I ran into &lt;a href="http://en.wikipedia.org/wiki/Ward_Cunningham"&gt;Ward Cunningham&lt;/a&gt;. Not only did I get to introduce myself, and take another fanboy picture with one of the extremes, but we also stood around for a few moments and chatted about his experiences migrating &lt;a href="http://www.mediawiki.org/wiki/MediaWiki"&gt;MediaWiki&lt;/a&gt; to Rails.&lt;br /&gt;&lt;br /&gt;Afterwards, I hung out doing a little pairing with programming buddy/collaborator &lt;a href="http://www.xnot.org/"&gt;Ari Lerner&lt;/a&gt; trying to help out with &lt;a href="http://poolpartyrb.com"&gt;pool-party&lt;/a&gt; before his upcoming BoF about it later that night. I know you have not yet heard about pool-party, which is an auto-scaling solution for Amazon's EC2 service, since the first version was put up on github there at RailsConf. What makes pool-party unique is that it is a pure Ruby and open source solution to the cloud computing thing. Plus it is cool.&lt;br /&gt;&lt;br /&gt;By the time we were done, we had already missed any chance of eating dinner, and also most of &lt;a href="http://headius.blogspot.com/"&gt;Charles Nutter&lt;/a&gt;'s talk. I walking in to see a slide "You Are The Enterprise" from his presentation. That sounded silly to me, but without any context, I probably do not know what I am talking about here.&lt;br /&gt;&lt;br /&gt;Next were the &lt;a href="http://www.railsenvy.com/"&gt;RailsEnvy&lt;/a&gt; guys presenting the "Ruby Heroes Awards". I have to say, those guys from RailsEnvy are pretty funny... and brilliant self-promoters. Plenty of people have already blogged about this, so no need to go on and on about it here, except to say they made some pretty good choices with the winners:&lt;br /&gt;&lt;a href="http://blog.evanweaver.com/"&gt;Evan Weaver&lt;/a&gt;, &lt;a href="http://tomcopeland.blogs.com/"&gt;Tom Copeland&lt;/a&gt;, &lt;a href="http://blog.grayproductions.net/"&gt;James Edward Gray II&lt;/a&gt;, &lt;a href="http://www.igvita.com/"&gt;Ilya Grigorik&lt;/a&gt;, &lt;a href="http://yehudakatz.com/"&gt;Yehuda Katz&lt;/a&gt;, and &lt;a href="http://railscasts.com/"&gt;Ryan Bates&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Good job, guys!&lt;br /&gt;&lt;br /&gt;Then it was time for the big &lt;a href="http://www.loudthinking.com/"&gt;David Heinemeier Hansson&lt;/a&gt; keynote. After my tepid enthusiasm for the opening keynote in the morning, I hoped DHH would do something exciting. Well, that was not exactly what happened... but thought provoking, nonetheless.&lt;br /&gt;&lt;br /&gt;His speech was entitled "The Great Surplus". The salient point seemed to be that the highly leveraged productivity that Ruby on Rails gives the community (and the unreal demand) will not last forever, or perhaps for even that much longer.&lt;br /&gt;&lt;br /&gt;His prediction is that one of three things will happen:&lt;br /&gt;1. The mainstream copies Rails with something else&lt;br /&gt;2. Some other dramatic alternative arrives (new paradigm) that provides massive improvement&lt;br /&gt;3. Rails itself becomes mainstream&lt;br /&gt;&lt;br /&gt;So what to do about this? Invest in yourself. Regardless what happens with Ruby on Rails, if you better yourself it will last to next wave. And do something else beside programming! You need to train more than 1 muscle... same with non programming activities.. need to engage other parts of brain. And sleep more.&lt;br /&gt;&lt;br /&gt;It is well known that tired people take longer to do work, and that the output is not as good as a result. More importantly, it takes a toll on that individual that leads to a longer term reduction of output. So why do we consistently see investors/executives pushing their technology teams this way. And why do we allow it, when we already know better?&lt;br /&gt;&lt;br /&gt;I had seen a friend earlier in the day during the conference, who I had not seen since last year. His startup had become involved with a well-known incubator. But far from looking energized, my friend looked worn down. "I need a month with no electricity," he croaked. And this is where many, many people in the RoR community are actually hoping and praying to get to. This is what DHH was warning about.&lt;br /&gt;&lt;br /&gt;After DHH finished his keynote, I ran over to the BoF for pool-party. The turnout was actually pretty good! Ari did a great job with his presentation, and at the end a guy from Amazon came up and chatted us up for quite a while. I look forward to switching over my AWS application to the pool-party as soon as it is ready!&lt;br /&gt;&lt;br /&gt;My day complete, I crawled off to bed to take DHH's advice and rest up for RailsConf 2008 - Day 2.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-8217543135673929961?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/8217543135673929961/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=8217543135673929961' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/8217543135673929961'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/8217543135673929961'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2008/06/railsconf-2008-day-1.html' title='RailsConf 2008 - Day 1'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_SgxaAaUGqzY/SEdG7hwJ-RI/AAAAAAAABMo/YxS6n7MViO4/s72-c/05-31-08_0740.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-7661698837494655852</id><published>2008-06-04T11:31:00.000-07:00</published><updated>2008-06-04T13:49:36.820-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='going public'/><category scheme='http://www.blogger.com/atom/ns#' term='railsconf 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='railsconf2008'/><category scheme='http://www.blogger.com/atom/ns#' term='public transportation'/><title type='text'>Going Public: From Los Angeles To RailsConf 2008</title><content type='html'>&lt;iframe width="300" height="300" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="http://maps.google.com/maps?f=d&amp;amp;hl=en&amp;amp;geocode=&amp;amp;saddr=lax&amp;amp;daddr=portland,+or&amp;amp;sll=34.084442,-118.277819&amp;amp;sspn=0.01061,0.013969&amp;amp;ie=UTF8&amp;amp;s=AARTsJqVGl0C0DP6pKU0imAyxkq5P21Liw&amp;amp;ll=39.707187,-120.893555&amp;amp;spn=20.250778,26.367188&amp;amp;t=h&amp;amp;z=4&amp;amp;output=embed"&gt;&lt;/iframe&gt;&lt;br/&gt;&lt;br /&gt;With the high cost (and carbon!) of transportation, as well as the burden of the increased time it takes to fight your way through the congestion, we all need to change the way that we navigate thru our daily lives. I had decided to take public transportation to get from my house in Los Angeles, to RailsConf 2008 in Portland, OR. &lt;br /&gt;&lt;br /&gt;When I first mentioned my plans, several friends and family members were incredulous. "It takes too long, " stated one person. "There's no way to get to airport in LA except by car, " scoffed another. I set out to prove them wrong, and by doing so began a new chapter in how I approach personal transportation.&lt;br /&gt;&lt;br /&gt;I set out from my house in Silver Lake, walking down the hill to Sunset Blvd. I stopped at the delightful Cuban coffeehouse Cafe Tropical, which happened to be directly adjacent to the bus stop I would need to use. &lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_SgxaAaUGqzY/SEbyIRwJ-II/AAAAAAAABLg/LG6wdemRU3Y/s1600-h/05-29-08_0940.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_SgxaAaUGqzY/SEbyIRwJ-II/AAAAAAAABLg/LG6wdemRU3Y/s200/05-29-08_0940.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5208116243118815362" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I sipped a tasty cup and snacked on one of the delicious pastries while I awaited my first bus.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_SgxaAaUGqzY/SEbygBwJ-JI/AAAAAAAABLo/iC1jS0QewtU/s1600-h/05-29-08_0952.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_SgxaAaUGqzY/SEbygBwJ-JI/AAAAAAAABLo/iC1jS0QewtU/s200/05-29-08_0952.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5208116651140708498" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I jumped quickly (literally, they do not wait around) on the Route 704, which is a giant segmented affair. Despite that, the bus was almost completely filled until we reached the &lt;a href="http://www.lausd.k12.ca.us/Evans_CAS/"&gt;Evans Community Adult School&lt;/a&gt; (no relation), at which point almost the entire bus emptied out.&lt;br /&gt;&lt;br /&gt;One notable feature of the ride were the video screens filled with advertising prominently situated on the bus, an attempt to subsidize the cost of the public transportation system here in L.A.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_SgxaAaUGqzY/SEbzMRwJ-KI/AAAAAAAABLw/mrbNoEgXzJ8/s1600-h/05-29-08_1003.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_SgxaAaUGqzY/SEbzMRwJ-KI/AAAAAAAABLw/mrbNoEgXzJ8/s200/05-29-08_1003.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5208117411349919906" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;On reaching the Union Station stop, I exited the bus. I would need to walk to the FlyAway bus terminal to catch the non-stop shuttle to LAX. The way was clearly marked.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_SgxaAaUGqzY/SEbz6BwJ-LI/AAAAAAAABL4/txgoiZ2LKYA/s1600-h/05-29-08_1007.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_SgxaAaUGqzY/SEbz6BwJ-LI/AAAAAAAABL4/txgoiZ2LKYA/s200/05-29-08_1007.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5208118197328935090" /&gt;&lt;/a&gt;&lt;br /&gt;They wanted to make sure you could not make a wrong turn!&lt;br /&gt;&lt;br /&gt;I purchased my ticket at a friendly kiosk.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_SgxaAaUGqzY/SEb0NxwJ-MI/AAAAAAAABMA/HqJCyyJTwmI/s1600-h/05-29-08_1011.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_SgxaAaUGqzY/SEb0NxwJ-MI/AAAAAAAABMA/HqJCyyJTwmI/s200/05-29-08_1011.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5208118536631351490" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The bus arrived shortly thereafter.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_SgxaAaUGqzY/SEb0vRwJ-NI/AAAAAAAABMI/aeukAepaKJk/s1600-h/05-29-08_1016.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_SgxaAaUGqzY/SEb0vRwJ-NI/AAAAAAAABMI/aeukAepaKJk/s200/05-29-08_1016.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5208119112156969170" /&gt;&lt;/a&gt;&lt;br /&gt;While I waited to board, I asked a half-dozen of my fellow travelers if they had taken the FlyAway shuttle before. All except one were first-timers, like myself.&lt;br /&gt;&lt;br /&gt;We reached the airport quickly from the downtown Union Station. No having to drive, allowed me to check my email (GMail Mobile is still cool on my cheap phone) and daydream. Suddenly we had arrived at LAX. I noticed that my airline was in the very last terminal, and since the FlyAway shuttle would stop at each and every terminal first, I decided to get off there and cross the airport on foot.&lt;br /&gt;&lt;br /&gt;It would seem there is plenty of parking, and available charging terminals, if you have a plug-in electric car.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_SgxaAaUGqzY/SEb1NhwJ-OI/AAAAAAAABMQ/g9NgI7JFEDE/s1600-h/05-29-08_1100.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_SgxaAaUGqzY/SEb1NhwJ-OI/AAAAAAAABMQ/g9NgI7JFEDE/s200/05-29-08_1100.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5208119631848012002" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I had made it to the airport in about 1 hour and 15 minutes, which was about the same amount of time that it would have taken me to drive my car to the airport parking, park, get on a shuttle bus to the airport from the parking location. Except my cost for transportation had been $5.25 instead of the fuel, plus the $60-80 for parking. With a small portion of my savings, I smugly purchased a copy of Predictably Irrational at an overpriced airport bookstore to read on the flight. &lt;br /&gt;&lt;br /&gt;On exiting my plane in Portland, it turned out they were having a party to celebrate Portland having now become an international airport. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_SgxaAaUGqzY/SEb1nhwJ-PI/AAAAAAAABMY/qnM_hr8bPHI/s1600-h/05-29-08_1524.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_SgxaAaUGqzY/SEb1nhwJ-PI/AAAAAAAABMY/qnM_hr8bPHI/s200/05-29-08_1524.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5208120078524610802" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Politely refusing a multi-colored cupcake, I walked to the end of the terminal where the MAX, Portland's modern light rail system awaited. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_SgxaAaUGqzY/SEb8nhwJ-QI/AAAAAAAABMg/Oa_ppeb4joM/s1600-h/06-01-08_1809.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_SgxaAaUGqzY/SEb8nhwJ-QI/AAAAAAAABMg/Oa_ppeb4joM/s200/06-01-08_1809.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5208127775106005250" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I purchased a ticket from a automated kiosk, then hopped on the train. Around 15 minutes later, I had arrived at my destination.&lt;br /&gt;&lt;br /&gt;I had successfully arrived in Portland for RailsConf 2008 only using public transportation! After checking into my hotel, I dashed across the street to the convention center. Alas, the registration had closed for the day &lt;i&gt;exactly&lt;/i&gt; on time. Yes, these O'Reilly people are all business. More on that in my post on RailsConf 2008 - Day 1...&lt;br /&gt;&lt;br /&gt;My luck would turn around quickly. I immediately ran into friends &lt;a href="David Chelimsky"&gt;David Chelimsky&lt;/a&gt; and &lt;a href="http://blog.8thlight.com/articles/tag/micah"&gt;Micah Martin&lt;/a&gt;, who invited me to tag along for dinner. When you're hanging out with guys as smart as these, you absolutely cannot be bored, and you will learn a LOT! Plus, one thing about Chicagoans, we know how to pick a good place to eat. David led us on a brief journey to a great Thai place he knew of, and between the great food, beer, and conversation, we had a delightful time. Thanks guys, I appreciate it!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-7661698837494655852?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/7661698837494655852/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=7661698837494655852' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/7661698837494655852'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/7661698837494655852'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2008/06/going-public-from-los-angeles-to.html' title='Going Public: From Los Angeles To RailsConf 2008'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_SgxaAaUGqzY/SEbyIRwJ-II/AAAAAAAABLg/LG6wdemRU3Y/s72-c/05-29-08_0940.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-2263339147899944340</id><published>2008-05-27T18:40:00.000-07:00</published><updated>2008-05-27T18:58:50.972-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='electric car'/><category scheme='http://www.blogger.com/atom/ns#' term='oil dependency'/><title type='text'>Converting The US To Electric Vehicles: Priceless</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.defenselink.mil/dodcmsshare/homepagephoto/2007-05/hires_070525-D-7203T-012.JPG"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px;" src="http://www.defenselink.mil/dodcmsshare/homepagephoto/2007-05/hires_070525-D-7203T-012.JPG" border="0" alt="" /&gt;&lt;/a&gt;A non-scientific, but clearly well thought-out back-of-envelope calculation by MIT CS professor Philip Greenspun is food for thought: &lt;a href="http://blogs.law.harvard.edu/philg/2008/05/27/cost-of-converting-entire-us-to-electric-cars-zero/"&gt;the cost of replacing the entire fleet of U.S. passenger cars with electric ones would be zero&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Here are some of his numbers:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;* total spent per year: $1 trillion&lt;br /&gt;* percentage of oil consumed by passenger cars: 40&lt;br /&gt;* total spent per year on oil for passenger cars: $400 billion [refining into gasoline, distributing, and retailing add even more to this]&lt;br /&gt;* at 5 interest, how much we could we borrow and pay $400 billion every year in interest: $8 trillion&lt;br /&gt;* number of registered cars in the U.S.: 250 million (Wikipedia)&lt;br /&gt;* cost of a new electric car, if mass-produced: $20,000&lt;br /&gt;* value of a used car, if exported to Latin America or China: $5,000&lt;br /&gt;* cost to upgrade average existing American car to a brand-new electric car: $15,000&lt;br /&gt;* number that could be converted for $8 trillion: more than 500 million cars (i.e., twice as many as we have now)&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;And then here is the money quote:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Instead of sending $400 billion each year to countries such as Saudi Arabia and Venezuela, we could spend it on electric car production in the U.S., Mexico, and China. At current oil prices, it wouldn’t cost us a dime extra to stop importing and burning oil for passenger cars. In fact, if the goal were to end up with the same number of cars on the road, we would have a few trillion dollars left over. One or two trillion dollars would be sufficient to build nuclear, solar, or wind electric power plants to replace all of our plants that currently burn coal and oil (note that less than 1 percent of current electricity generation in the U.S. is from oil).&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Now THAT is what I talking about! Let's get on it people... and let's do better than just paying interest only on the bill while we are at it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-2263339147899944340?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/2263339147899944340/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=2263339147899944340' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/2263339147899944340'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/2263339147899944340'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2008/05/converting-us-to-electric-vehicles.html' title='Converting The US To Electric Vehicles: Priceless'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-6940867850297287909</id><published>2008-05-27T10:00:00.000-07:00</published><updated>2008-05-27T15:06:45.348-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='free'/><category scheme='http://www.blogger.com/atom/ns#' term='zero effect'/><category scheme='http://www.blogger.com/atom/ns#' term='behavioral finance'/><title type='text'>Zero Is Special</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://images.tvnz.co.nz/tvnz_images/tv2/movies/wk30_zero_effect_c_three.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px;" src="http://images.tvnz.co.nz/tvnz_images/tv2/movies/wk30_zero_effect_c_three.jpg" border="0" alt="" /&gt;&lt;/a&gt;I just read a &lt;a href="http://www.predictablyirrational.com/pdfs/zerofree.pdf"&gt;fascinating academic paper&lt;/a&gt; co-authored by Dan Ariely, author of new book &lt;a href="http://www.predictablyirrational.com"&gt;Predicably Irrational&lt;/a&gt;, a book I have heard about, but have not yet read.&lt;br /&gt;&lt;br /&gt;The paper presents results from a series of experiments into the nature of free pricing. Here is a juicy tidbit from the abstract:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;When faced with a choice of selecting one of several available products (or possibly buying nothing), according to standard theoretical perspectives, people will choose the option with the highest cost–benefit difference. However, we propose that decisions about free (zero price) products differ, in that people do not simply subtract costs from benefits but instead they perceive the benefits associated with free products as higher.&lt;/blockquote&gt;&lt;br /&gt;Yes, you read that correctly: people can consider something free as more valuable than something that costs money. The authors describe several interesting experiments using chocolate that appear to well prove their point.&lt;br /&gt;&lt;br /&gt;Bottom line, so to speak: I need to get this book and read it as soon as I can! Even if it does cost money... actually &lt;a href="http://www.predictablyirrational.com/?page_id=6"&gt;here are some free excerpts&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-6940867850297287909?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/6940867850297287909/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=6940867850297287909' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/6940867850297287909'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/6940867850297287909'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2008/05/zero-is-special.html' title='Zero Is Special'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-1713032656168284753</id><published>2008-05-27T08:23:00.000-07:00</published><updated>2008-05-27T08:59:57.887-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='railsconf'/><category scheme='http://www.blogger.com/atom/ns#' term='railsconf 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='oil dependency'/><title type='text'>RailsConf 2008 Better Be Good</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.nationalgeographic.com/traveler/images/st_airportlines0704/st_airportlines0704.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px;" src="http://www.nationalgeographic.com/traveler/images/st_airportlines0704/st_airportlines0704.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;a href="http://en.oreilly.com/rails2008/public/content/home"&gt;RailsConf 2008&lt;/a&gt; is later this week, as if you all did not know that. Interestingly, this year it has not sold out like it did for 1.0 and 2.0. Increased capacity by O'Reilly? Or perhaps something else at work here...&lt;br /&gt;&lt;br /&gt;If you are not aware for the cost of transport, you have been living on another planet. Just the massive increase in time required to make the pilgrimage has been substantial. Many of us have been working at home or within other time-flexible, location-unimportant arrangements for some time now. But we still gathered together unhesitatingly no matter the distance.&lt;br /&gt;&lt;br /&gt;Two recent blog postings stood out to me. The &lt;a href="http://sethgodin.typepad.com/seths_blog/2008/05/the-new-standar.html"&gt;first&lt;/a&gt;, from &lt;a href="http://sethgodin.typepad.com"&gt;Seth Godin&lt;/a&gt; said it nicely:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;If oil is $130 a barrel and if security adds two or three hours to a trip and if people are doing more and more business with those far afield...&lt;br /&gt;&lt;br /&gt;and if we need to bring together more people from more places when we get together...&lt;br /&gt;&lt;br /&gt;and if the alternatives, like video conferencing or threaded online conversations continue to get better and better, then...&lt;br /&gt;&lt;br /&gt;I think the standard for a great meeting or a terrific conference has changed.&lt;br /&gt;&lt;br /&gt;In other words, "I flew all the way here for this?" is going to be far more common than it used to be.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;The second was simply an link from from Rails community spokesmodel &lt;a href="http://obiefernandez.com/"&gt;Obie Fernandez&lt;/a&gt; to an &lt;a href="http://www.washingtonpost.com/wp-dyn/content/article/2008/05/23/AR2008052302456.html"&gt;article in the Washington Post&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;But the truth is that no combination of solar, wind and nuclear power, ethanol, biodiesel, tar sands and used French-fry oil will allow us to power Wal-Mart, Disney World and the interstate highway system -- or even a fraction of these things -- in the future. We have to make other arrangements.&lt;br /&gt;&lt;br /&gt;The public, and especially the mainstream media, misunderstands the "peak oil" story. It's not about running out of oil. It's about the instabilities that will shake the complex systems of daily life as soon as the global demand for oil exceeds the global supply.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Already, I was a little bummed out about &lt;a href="http://www.sfgate.com/cgi-bin/article.cgi?f=/c/a/2008/04/10/BAO6103NBB.DTL"&gt;not being able to eat a delicious Pacific salmon dinner this year&lt;/a&gt;. But these two postings really got me to thinking. It would be easy to expect the conference organizers to do all the work. But it is really up to us as attendees to put our hearts into it. Whether it be code drives, or Werewolf sessions, that does not really matter to me personally, although I will be attending the former.&lt;br /&gt;&lt;br /&gt;So, all I can say is, this better be good people. We better go up there and really make this thing count, to justify the time, expense, and environmental impact. The times they are a changing, and we need to do something special.&lt;br /&gt;&lt;br /&gt;As for me, I will be taking public transport to and from the conference... which is not easy to achieve from down here in L.A.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-1713032656168284753?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/1713032656168284753/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=1713032656168284753' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/1713032656168284753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/1713032656168284753'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2008/05/railsconf-2008-better-be-good.html' title='RailsConf 2008 Better Be Good'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-6521133793982757004</id><published>2008-05-25T16:58:00.000-07:00</published><updated>2008-05-25T17:06:19.619-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mars'/><category scheme='http://www.blogger.com/atom/ns#' term='space'/><title type='text'>The Phoenix Has Landed</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://phoenix.lpl.arizona.edu/images/gallery/sm_140.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px;" src="http://phoenix.lpl.arizona.edu/images/gallery/sm_140.jpg" border="0" alt="" /&gt;&lt;/a&gt;Earthlings, we have &lt;a href="http://phoenix.lpl.arizona.edu/"&gt;successfully landed another probe on the red planet&lt;/a&gt;. Congratulations to the team at JPL, University of Arizona, and everyone else who made this one happen!&lt;br /&gt;&lt;br /&gt;Man, I just love space exploration...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-6521133793982757004?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/6521133793982757004/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=6521133793982757004' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/6521133793982757004'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/6521133793982757004'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2008/05/phoenix-has-landed.html' title='The Phoenix Has Landed'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-4938138016083668010</id><published>2008-05-22T07:40:00.000-07:00</published><updated>2008-05-22T07:44:28.871-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='surveillance'/><category scheme='http://www.blogger.com/atom/ns#' term='police state'/><category scheme='http://www.blogger.com/atom/ns#' term='china'/><category scheme='http://www.blogger.com/atom/ns#' term='freedom'/><title type='text'>Got An Eye On You</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photoshopcontest.com/images/fullsize/qbq5u103bsj8z4grg3bfs2sn3t5y9ib9lbsh.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px;" src="http://photoshopcontest.com/images/fullsize/qbq5u103bsj8z4grg3bfs2sn3t5y9ib9lbsh.jpg" border="0" alt="" /&gt;&lt;/a&gt;Read this &lt;a href="http://www.rollingstone.com/politics/story/20797485/chinas_allseeing_eye/print"&gt;piece from Rolling Stone magazine&lt;/a&gt; on 24-7 surveillance coming soon to a neighborhood near you.&lt;br /&gt;&lt;br /&gt;Then be afraid. Very afraid.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-4938138016083668010?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/4938138016083668010/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=4938138016083668010' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/4938138016083668010'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/4938138016083668010'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2008/05/got-eye-on-you.html' title='Got An Eye On You'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-2216445244065909157</id><published>2008-05-19T15:09:00.000-07:00</published><updated>2008-05-22T09:08:54.455-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='ruby on rails'/><category scheme='http://www.blogger.com/atom/ns#' term='acts_as_ferret'/><category scheme='http://www.blogger.com/atom/ns#' term='postgres'/><category scheme='http://www.blogger.com/atom/ns#' term='thinking sphinx'/><category scheme='http://www.blogger.com/atom/ns#' term='sphinx'/><category scheme='http://www.blogger.com/atom/ns#' term='ferret'/><title type='text'>In Search Of Search</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://yourtech.typepad.com/main/WindowsLiveWriter/ThesearchforSTIIITheSearchforSpock_9B38/star_trek3_thumb1.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px;" src="http://yourtech.typepad.com/main/WindowsLiveWriter/ThesearchforSTIIITheSearchforSpock_9B38/star_trek3_thumb1.jpg" border="0" alt="" /&gt;&lt;/a&gt;My client was having troubles. The site was crashing, seemingly at random. QA was baffled, management concerned. After hunting thru logs, the culprit was found: the ferret search service. &lt;br /&gt;&lt;br /&gt;Despite having configured &lt;a href="http://projects.jkraemer.net/acts_as_ferret/"&gt;acts_as_ferret&lt;/a&gt; to use the DRb server option, the "whole thing" would fall apart on a regular basis whenever the ferret daemon would crash... which was pretty often. The ruby on rails plugin acts_as_ferret would revert to a local mode of operation, which would only make matters worse when competing mongrels would corrupt the index files on disk.&lt;br /&gt;&lt;br /&gt;Much has been &lt;a href="http://www.ruby-forum.com/topic/137629"&gt;written already about this&lt;/a&gt; by &lt;a href="http://www.robbyonrails.com/"&gt;more&lt;/a&gt; &lt;a href="http://brainspl.at/"&gt;famous&lt;/a&gt; Rubyists then myself, so the time had come to make the switch to &lt;a href="http://www.sphinxsearch.com/"&gt;Sphinx&lt;/a&gt; like all the rest of the cool kids. However, there were a few tricky issues that awaited.&lt;br /&gt;&lt;br /&gt;One is that the client site was using &lt;a href="http://www.postgresql.org/"&gt;PostgreSQL&lt;/a&gt; instead of the more common &lt;a href="http://www.mysql.com/"&gt;MySQL&lt;/a&gt;. This meant you had to have already downloaded the pgsql client libs, and also when compiling the sphinx server use the --with-pgsql flag. However, what they didn't mention was that you would need to also download and include the MySQL client libs AS WELL, even if you were not using MySQL. Good to know... seems like a big of baggage to carry, but whatever.&lt;br /&gt;&lt;br /&gt;That was one obstacle avoided. The next would prove to be more subtle and complex. There are four different choices of Ruby on Rails clients for Sphinx:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.datanoise.com/articles/2007/3/23/acts_as_sphinx-plugin"&gt;acts_as_sphinx&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://seattlerb.rubyforge.org/Sphincter/"&gt;Sphincter&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://blog.evanweaver.com/files/doc/fauna/ultrasphinx/files/README.html"&gt;UltraSphinx&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://ts.freelancing-gods.com/"&gt;Thinking Sphinx&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;I looked briefly at acts_as_sphinx, but my superficial prejudices against anything named "acts_as_" caused me to continue my search for search. Next, I tried Sphincter, just to prove that I could be accepting about project names. However, I was not successful as getting it working correctly, and project development seemed like it had slowed to near non-existence. The search moved on.&lt;br /&gt;&lt;br /&gt;My search was getting desperate as half of the options had been eliminated. I briefly perused UltraSphinx and I started to get a little excited. Development was active, and proper functionality with Postgres was claimed. But there was just one little problem: this client's site is still Rails 1.2.x. &lt;br /&gt;&lt;br /&gt;Now, before you all start throwing various disparaging comments my way, consider how much work some clients are willing to pay far vs. something that they can actually see. Multiply that by how long since they started their project, and you are starting to get the idea of where this thing is at. I probably should have MADE them upgrade at that point, but I'm just not that kind of guy.&lt;br /&gt;&lt;br /&gt;So that left Thinking Sphinx. I dove in with the manic desperation of someone looking to avoid major amounts of work. That rarely works out well, but in this case it wasn't so bad. The latest trunk of thinking sphinx had comments that said "basic postgres functionality" so perhaps it was possible after all.&lt;br /&gt;&lt;br /&gt;Several hours and some major hacking of the original plug-in to actually handle proper psql syntax later, and something was working! I will try to come up with patch to thinking-sphinx for &lt;a href="http://freelancing-gods.com/"&gt;freelancing-god&lt;/a&gt;, cause his work was a great help.&lt;br /&gt;&lt;br /&gt;Lastly, the delta index. By adding a single field (boolean for MySQL, integer for Postgres) you can remove the need to reindex all data every time a record is updated. Sphinx allows storing the changed records in a separate index (delta) that it will search along with the main index. This way, you do not have to wait for reindexing to be able to search, but you also do not have to reindex the entire data set every time any data within it is changed. You still need to do a complete reindex, but that can occur at off-peak hours, instead of constantly.&lt;br /&gt;&lt;br /&gt;The code was deployed, and now all was well with the world. My search was complete.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-2216445244065909157?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/2216445244065909157/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=2216445244065909157' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/2216445244065909157'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/2216445244065909157'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2008/05/in-search-of-search.html' title='In Search Of Search'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-5518386518872111326</id><published>2008-05-13T21:05:00.000-07:00</published><updated>2008-05-13T21:24:54.940-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='programming languages'/><title type='text'>Ain't No Stopping Us Now</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://fivestar.ne.jp/blog02/archives/mcfaddenandwhitehead.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px;" src="http://fivestar.ne.jp/blog02/archives/mcfaddenandwhitehead.jpg" border="0" alt="" /&gt;&lt;/a&gt;According to a &lt;a href="http://www.eweek.com/c/a/Application-Development/Ruby-is-on-the-Rise"&gt;recent eWeek article&lt;/a&gt;, there will be four times more Ruby programmers within five years. Before all the haters start making cracks about it going from one thousand to four thousand professional Rubyists, here is a juicy bit from Mark Driver, Gartner analyst:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;"There are under one million professional Ruby developers now and we're projecting there will be four million plus by 2013."&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;And oh yeah, what about that whole "Ruby is for hobbyists" misinformation campaign? Officially debunked by Gartner:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Driver later told eWEEK that Gartner's research shows "strong interest" in Ruby and that the percentage of developers that will be creating commercial systems versus those that are hobbyists will be even greater for Ruby than for other languages. "Ruby will be more interesting to commercial developers"&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Just imagine the power of one million people out there, right now. Developing, sharing, recruiting others... to use their favorite programming language! What did &lt;i&gt;you&lt;/i&gt; think I was talking about, politics?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-5518386518872111326?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/5518386518872111326/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=5518386518872111326' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/5518386518872111326'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/5518386518872111326'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2008/05/aint-no-stopping-us-now.html' title='Ain&apos;t No Stopping Us Now'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-428100456258810487</id><published>2008-05-02T14:29:00.000-07:00</published><updated>2008-05-02T14:33:50.020-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web development'/><category scheme='http://www.blogger.com/atom/ns#' term='softer side of development'/><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><title type='text'>Modern Web Design</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.changethethought.com/wp-content/webbreakdown.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px;" src="http://www.changethethought.com/wp-content/webbreakdown.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;This one pie chart says it all... &lt;br /&gt;&lt;br /&gt;From &lt;a href="http://www.changethethought.com/web-breakdown/"&gt;ChangeTheThought.com&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-428100456258810487?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/428100456258810487/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=428100456258810487' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/428100456258810487'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/428100456258810487'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2008/05/modern-web-design.html' title='Modern Web Design'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-656710785372391985</id><published>2008-04-23T18:50:00.000-07:00</published><updated>2009-09-13T16:24:05.609-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='softer side of development'/><category scheme='http://www.blogger.com/atom/ns#' term='user interface'/><title type='text'>Goldilocks and The Three Icons</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://upload.wikimedia.org/wikipedia/en/5/50/Apple_Macintosh_Desktop.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 256px; height: 171px;" src="http://upload.wikimedia.org/wikipedia/en/5/50/Apple_Macintosh_Desktop.png" border="0" alt="" /&gt;&lt;/a&gt;Once upon a time, there were three icons. A Poppa Application icon, a Momma Folder icon and a Baby Document icon. Life was good, and people were easily able to tell the difference between them, although very few visitors were known to go to that part of the forest.&lt;br /&gt;&lt;br /&gt;But then along came the Trashcan icon... and the dark times began. If you dragged a folder to the trash it went away back into the void. But if you dragged a Special kind of folder called a Disk icon, it was EJECTED. The trash had discovered "Free will" and their eden was never the same again.&lt;br /&gt;&lt;br /&gt;Suddenly, there were icons everywhere. Icons here, icons there. And all different kinds of icons, too. The icons not only overran the desktop, but they began to appear inside of applications. And they did so many different things! Where the poppa had once used WORDS to describe actions by way of MENUS, the icons stubbornly sat there silently.&lt;br /&gt;&lt;br /&gt;So then along came Goldilocks. She had wandered onto the desktop innocently enough, but suddenly was propelled into an incomprehensible world of mysterious iconography... in other words, she couldn't make heads or tails of the icons by which she was surrounded. The only icon she thought she recognized was that pesky trashcan that had started all the trouble, and she figured she wanted to stay away from that one.&lt;br /&gt;&lt;br /&gt;It was around this time that poor Goldilocks ran into the original Three Icons. "How could you have let this happen!" raged the girl. "It's not our fault, " moaned the icons. "We were never supposed to be a replacement for anything, we were just another way of looking at things!" they grumbled.&lt;br /&gt;&lt;br /&gt;"100% data compression means 0% information," howled the Baby Document. "That was the beauty of it. Don't you get it, 0% information. The trashcan is behind all of this. It was the trashcan!"&lt;br /&gt;&lt;br /&gt;Just then the trashcan showed up. "Hey kid, don't believe the hype. I deal with all of the things that no one wants, and look how they treat me."&lt;br /&gt;&lt;br /&gt;Goldilocks was impressed by the smooth animation of the trashcan, as well as its nice 3-D appearance. "Well, I wouldn't quite put it that way," she said politely. The Trashcan didn't seem at all like she had expected.&lt;br /&gt;&lt;br /&gt;"You wouldn't believe the things that people throw away. I'm talking some good stuff here!" said the Trashcan in a friendly tone. "Why just take a look at this..."&lt;br /&gt;&lt;br /&gt;Goldilocks' curiosity was piqued. She leaned closer to take a look, and before the warning cries of the Three Icons could reach her, she was swallowed up, and then before you could say "Empty Trash" the poor thing was gone.&lt;br /&gt;&lt;br /&gt;"How could you have deleted that poor innocent sweet girl!" sobbed the Momma Folder. "What girl?" burped the Trashcan.&lt;br /&gt;&lt;br /&gt;Later, the Poppa Application was alone with the Momma Folder. "Don't worry, baby," he smiled. "I have a backup and restore function. If I can just figure out which icon it is..."&lt;br /&gt;&lt;br /&gt;The End?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-656710785372391985?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/656710785372391985/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=656710785372391985' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/656710785372391985'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/656710785372391985'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2008/04/goldilocks-and-three-icons.html' title='Goldilocks and The Three Icons'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-8384136463773373746</id><published>2008-04-23T08:38:00.001-07:00</published><updated>2008-04-23T09:21:03.516-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='web development'/><category scheme='http://www.blogger.com/atom/ns#' term='facebooker'/><category scheme='http://www.blogger.com/atom/ns#' term='los angeles'/><category scheme='http://www.blogger.com/atom/ns#' term='grid computing'/><category scheme='http://www.blogger.com/atom/ns#' term='facebook'/><category scheme='http://www.blogger.com/atom/ns#' term='sinatra'/><category scheme='http://www.blogger.com/atom/ns#' term='ec2'/><category scheme='http://www.blogger.com/atom/ns#' term='frankie'/><title type='text'>April Is For AOL</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm1.static.flickr.com/146/368727427_77b077e480.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px;" src="http://farm1.static.flickr.com/146/368727427_77b077e480.jpg" border="0" alt="" /&gt;&lt;/a&gt;Last night was the always fun &lt;a href="http://web.meetup.com/34/"&gt;Los Angeles web application developer Meetup&lt;/a&gt;, this time at AOL in Beverly Hills. After navigating a veritable maze of cubes, we found ourselves in a fairly large screening room chock full of AV equipment, accompanied by a large pile of pizza boxes. A few moments later, the throng of LA-based developers shuffled in, ready for the latest and greatest. The prerequisites fulfilled, we got down to some serious techno-babble.&lt;br /&gt;&lt;br /&gt;First up was &lt;a href="http://secwatch.org/author/543/"&gt;Omer Singer from DigiTrust&lt;/a&gt;, talking about Web Application Firewalls. Although it strayed a little closely to a sales pitch, Omer was able to tie it together with his definition of "defense in depth", which is simply enough having multiple layers of overlapping protection. One good point that he raised which is often overlooked is the cost of "brand-damage" in the marketplace from a web application being hacked. There were several good security related question asked afterwards, so yes the crown was paying close attention.&lt;br /&gt;&lt;br /&gt;Next, was &lt;a href="http://mitchellhashimoto.com/"&gt;Mitch Hashimoto&lt;/a&gt; recent hire at &lt;a href="http://citrusbyte.com/"&gt;CitrusByte&lt;/a&gt;, with a brief overview of the newly beta released &lt;a href="http://code.google.com/appengine/"&gt;Google App Engine&lt;/a&gt;. Mitch took us on a brief tour of the main capabilities of the Python-based system, like a Datastore API (based on BigTable), and the Users API (based on the Goog's own account authentication database). If you like Python, and don't mind doing everything the Google Way and no other, then the App Engine might be for you.&lt;br /&gt;&lt;br /&gt;After Mitch, I did a presentation about &lt;a href="http://facethesinatra.com"&gt;Frankie&lt;/a&gt;, my newly released Ruby gem for easy development of Facebook applications. If you &lt;a href="http://deadprogrammersociety.blogspot.com/2008/04/frankie-goes-to-facebook.html"&gt;don't yet know&lt;/a&gt;, Frankie uses the &lt;a href="http://sinatrarb.com"&gt;Sinatra&lt;/a&gt; web server and the &lt;a href="http://facebooker.rubyforge.org/"&gt;Facebooker&lt;/a&gt; gem to allow you to create a basic Facebook application with only 10 lines of Ruby. I also did a brief demo of a new, super-secret web thing that I have been working on for a little while... more will be revealed soon!&lt;br /&gt;&lt;br /&gt;Last up was programming chum and Ruby expert &lt;a href="http://blog.xnot.org/"&gt;Ari Lerner&lt;/a&gt;, talking about &lt;a href="http://aws.amazon.com/ec2"&gt;Amazon's EC2 service&lt;/a&gt;, and showing a little of another upcoming pet project of ours called "Pool Party", which makes it easy to deploy an auto-scaling application to the EC2 cloud.&lt;br /&gt;&lt;br /&gt;It was a really great meetup, and the turnout was really good. Thanks to the persistent efforts of organizer Will Jessup, the community in LA is really thriving, and we were even able to keep the annoyance of non-technical recruiter sales pitches away. Great job, everyone!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-8384136463773373746?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/8384136463773373746/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=8384136463773373746' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/8384136463773373746'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/8384136463773373746'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2008/04/april-is-for-aol.html' title='April Is For AOL'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm1.static.flickr.com/146/368727427_77b077e480_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-6827185435962109135</id><published>2008-04-17T07:51:00.000-07:00</published><updated>2008-04-17T08:23:04.578-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cool stuff'/><category scheme='http://www.blogger.com/atom/ns#' term='knowledge'/><category scheme='http://www.blogger.com/atom/ns#' term='history'/><category scheme='http://www.blogger.com/atom/ns#' term='math'/><title type='text'>The Archimedes Codex</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_SgxaAaUGqzY/SAdqgbRCDSI/AAAAAAAABLY/28w38gFWf54/s1600-h/codex.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_SgxaAaUGqzY/SAdqgbRCDSI/AAAAAAAABLY/28w38gFWf54/s200/codex.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5190234200875339042" /&gt;&lt;/a&gt;Archimedes was a very cool dude. When you think of inventor/intellectuals these days, we have been trained to imagine a fairly wimpy, bookish kind of person. Not so for Archie, he was also a bad-ass who defended his beloved city of Syracuse to the death at the hands of Roman invaders. Archimedes invented what for the day, were some freaky &lt;a href="http://en.wikipedia.org/wiki/Archimedes%27_screw"&gt;advanced&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/Claw_of_Archimedes"&gt;technologies&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Well, new information has been discovered about him, thanks to the painstaking work by Will Noel at the Walters Art Museum of New York. A dilapidated tome that was recycled by a 13th century monk, has turned out to contain a treasure trove of amazing information regarding this famous but actually little-known giant.&lt;br /&gt;&lt;br /&gt;The Christian Science Monitor has a &lt;a href="http://www.csmonitor.com/2008/0415/p20s01-ussc.html?page=1"&gt;fascinating article about it&lt;/a&gt;. Here is a taste:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Most significant among the discoveries was the knowledge that "Archimedes was the first to calculate with actual infinity in the mathematics of the West." That is to say, he was operating at an intellectual level that didn't become common in the mathematical world until the 17th century, nearly 2,000 years after his time. The Archimedean texts, Noel writes, make the mathematics of Leonardo da Vinci "look like child's play."&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;The CS Monitor article is fun, and a short read. I really recommend it, if you want to  get a sense of the "Original Hacker" was all about.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-6827185435962109135?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/6827185435962109135/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=6827185435962109135' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/6827185435962109135'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/6827185435962109135'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2008/04/archimedes-codex.html' title='The Archimedes Codex'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_SgxaAaUGqzY/SAdqgbRCDSI/AAAAAAAABLY/28w38gFWf54/s72-c/codex.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-7527634832938979673</id><published>2008-04-08T22:04:00.000-07:00</published><updated>2008-04-12T20:01:08.465-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='facebooker'/><category scheme='http://www.blogger.com/atom/ns#' term='facebook'/><category scheme='http://www.blogger.com/atom/ns#' term='sinatra'/><category scheme='http://www.blogger.com/atom/ns#' term='frankie'/><title type='text'>Frankie Goes To Facebook</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.porthalcyon.com/features/200505/images/bacall_sinatra2.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px;" src="http://www.porthalcyon.com/features/200505/images/bacall_sinatra2.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;b&gt;UPDATED 4/12/2008: Now compatible with Sinatra 0.2.0&lt;/b&gt;&lt;br /&gt;So you want to create a small Facebook application... seems like it should be a small thing, right? But creating an entire Ruby on Rails application just for a tiny little Facebook application is, at the very least, a bit wasteful. In the case of a overly popular Facebook app you could end up with, as Marc Andreessen put it, a &lt;a href="http://blog.pmarca.com/2007/06/analyzing_the_f.html"&gt;"self-inflicted denial of service attack"&lt;/a&gt;, unless you have both a pretty serious infrastructure to support it, as well as lots of cash to keep that data center running.&lt;br /&gt;&lt;br /&gt;Wouldn't you rather be able to create a highly scalable "hello, world" Facebook application in around 13 lines of Ruby code? Say hello to &lt;a href="http://facethesinatra.com"&gt;Frankie&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre class="textmate-source"&gt;&lt;span class="source source_ruby source_ruby_rails"&gt;&lt;span class="meta meta_require meta_require_ruby"&gt;&lt;span class="keyword keyword_other keyword_other_special-method keyword_other_special-method_ruby"&gt;require&lt;/span&gt; &lt;span class="string string_quoted string_quoted_single string_quoted_single_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;'&lt;/span&gt;rubygems&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="meta meta_require meta_require_ruby"&gt;&lt;span class="keyword keyword_other keyword_other_special-method keyword_other_special-method_ruby"&gt;require&lt;/span&gt; &lt;span class="string string_quoted string_quoted_single string_quoted_single_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;'&lt;/span&gt;frankie&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;configure &lt;span class="keyword keyword_control keyword_control_start-block keyword_control_start-block_ruby"&gt;do&lt;br /&gt;&lt;/span&gt;  set_option &lt;span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby"&gt;:&lt;/span&gt;sessions&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; &lt;span class="constant constant_language constant_language_ruby"&gt;true&lt;/span&gt;&lt;br /&gt;  load_facebook_config &lt;span class="string string_quoted string_quoted_double string_quoted_double_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;"&lt;/span&gt;./config/facebooker.yml&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; &lt;span class="support support_class support_class_ruby"&gt;Sinatra&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;env&lt;br /&gt;&lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby"&gt;#&lt;/span&gt;# facebooker helpers&lt;br /&gt;&lt;/span&gt;before &lt;span class="keyword keyword_control keyword_control_start-block keyword_control_start-block_ruby"&gt;do&lt;br /&gt;&lt;/span&gt;  ensure_authenticated_to_facebook&lt;br /&gt;  ensure_application_is_installed_by_facebook_user&lt;br /&gt;&lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby"&gt;#&lt;/span&gt;# the site&lt;br /&gt;&lt;/span&gt;get &lt;span class="string string_quoted string_quoted_single string_quoted_single_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;'&lt;/span&gt;/&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class="keyword keyword_control keyword_control_start-block keyword_control_start-block_ruby"&gt;do&lt;br /&gt;&lt;/span&gt;  body &lt;span class="string string_quoted string_quoted_double string_quoted_double_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;"&lt;/span&gt;&amp;lt;h1&amp;gt;Hello &lt;span class="source source_ruby source_ruby_embedded source_ruby_embedded_source"&gt;&lt;span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_ruby"&gt;#{&lt;/span&gt;session&lt;span class="punctuation punctuation_section punctuation_section_array punctuation_section_array_ruby"&gt;[&lt;/span&gt;&lt;span class="string string_quoted string_quoted_single string_quoted_single_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;'&lt;/span&gt;facebook_session&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_array punctuation_section_array_ruby"&gt;]&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;user&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;name&lt;span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_ruby"&gt;}&lt;/span&gt;&lt;/span&gt; and welcome to frankie!&amp;lt;/h1&amp;gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Frankie is a plugin for the minimalist and very fast &lt;a href="http://sinatrarb.com/"&gt;Sinatra web framework&lt;/a&gt; that allows you to easily create a Facebook application by using the &lt;a href="http://facebooker.rubyforge.org/"&gt;Facebooker&lt;/a&gt; gem. Why would you want to use it? If your Facebook application needs to be highly scalable, is fairly small, or is really a mashup of other web-available resources, than Frankie could be a good solution.&lt;br /&gt;&lt;br /&gt;Frankie is available now for your enjoyment. Here is how to get started:&lt;br /&gt;&lt;br /&gt;- Install the Frankie gem, which will install the Sinatra and Facebooker gems if you do not already have them.&lt;br /&gt;&lt;pre&gt;sudo gem install frankie&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;- Create the application directories for your new app:&lt;br /&gt;&lt;pre&gt;mkdir myapp&lt;br /&gt;cd myapp&lt;br /&gt;mkdir config&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;- Put your facebooker.yml file into the /myapp/config directory, and set the values to your information. Here is a simple example of the file:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;-------&lt;br /&gt;development:&lt;br /&gt; api_key: apikeyhere &lt;br /&gt; secret_key: secretkeyhere&lt;br /&gt; canvas_page_name: yourcanvashere    &lt;br /&gt; callback_url: http://localhost:4567&lt;br /&gt;test:&lt;br /&gt; api_key: apikeyhere &lt;br /&gt; secret_key: secretkeyhere&lt;br /&gt; canvas_page_name: yourcanvashere    &lt;br /&gt; callback_url: http://localhost:4567&lt;br /&gt;production:&lt;br /&gt; api_key: apikeyhere &lt;br /&gt; secret_key: secretkeyhere&lt;br /&gt; canvas_page_name: yourcanvashere    &lt;br /&gt; callback_url: http://yourrealserver.com&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;- Make sure you have setup your facebook application on the facebook site. Google "setup new facebook application" if you are unsure how to do this. I recommend starting with an IFrame application, so that you can point a development version of your Facebook application to your local machine. This, like our example here, would use "http://localhost:4567" as the callback URL when configuring the Facebook app.&lt;br /&gt;&lt;br /&gt;- Create your application, based on the sample above, and run it:&lt;br /&gt;&lt;pre&gt;ruby sample.rb&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This will start the Sinatra Ruby web server running:&lt;br /&gt;&lt;pre&gt;== Sinatra has taken the stage on port 4567!&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;- Test it by pointing your browser to http://apps.facebook.com/yourappname. If you have things setup correctly then you should see your application appear inside of Facebook's site.&lt;br /&gt;&lt;br /&gt;Facebook is now your playground... have fun with &lt;a href="http://facethesinatra.com"&gt;Frankie&lt;/a&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-7527634832938979673?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/7527634832938979673/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=7527634832938979673' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/7527634832938979673'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/7527634832938979673'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2008/04/frankie-goes-to-facebook.html' title='Frankie Goes To Facebook'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-6156040916144263456</id><published>2008-03-13T17:42:00.000-07:00</published><updated>2008-03-13T18:13:21.868-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cool stuff'/><title type='text'>Excuse Me, While I Kiss The Sky</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.solarnavigator.net/music/music_images/Jimi_Hendrix_on_stage_fender_stratocaster.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px;" src="http://www.solarnavigator.net/music/music_images/Jimi_Hendrix_on_stage_fender_stratocaster.jpg" border="0" alt="" /&gt;&lt;/a&gt;The demo that Microsoft showed at TED of Robert Scoble crying, ahem, I mean their future &lt;a href="http://www.worldwidetelescope.org/"&gt;Microsoft Worldwide Telescope&lt;/a&gt; or whatever, looks really neat. In the meantime, those provocateurs over at Google have just put live &lt;a href="http://www.google.com/sky/"&gt;Google Sky&lt;/a&gt;, a fully browser based version of their Google Earth software that started this whole "star wars" virtual astronomy competition thing in the first place.&lt;br /&gt;&lt;br /&gt;I suppose since &lt;a href="http://www.gsfc.nasa.gov/scienceques2001/20011005.html"&gt;so many people cannot see the stars anymore&lt;/a&gt;, that we need virtual astronomy more than ever. In the meantime, it is pretty incredible to have such an educated introduction to the heavens. I could easily spend hours just like, &lt;a href="http://www.google.com/sky/#latitude=22.014465&amp;longitude=-96.366784&amp;zoom=13&amp;Spitzer=0.00&amp;ChandraXO=0.00&amp;Galex=0.00&amp;IRAS=0.00&amp;WMAP=0.00&amp;Cassini=0.00&amp;slide=3&amp;mI=1&amp;oI=1&amp;by=1"&gt;playing&lt;/a&gt; &lt;a href="http://www.google.com/sky/#latitude=-21.373002795184043&amp;longitude=-85.89797973632812&amp;zoom=14&amp;Spitzer=0.00&amp;ChandraXO=0.00&amp;Galex=0.00&amp;IRAS=0.00&amp;WMAP=0.00&amp;Cassini=0.00&amp;slide=3&amp;mI=1&amp;oI=1&amp;by=1"&gt;with&lt;/a&gt; &lt;a href="http://www.google.com/sky/#latitude=-60.835278&amp;longitude=39.899581&amp;zoom=10&amp;Spitzer=0.00&amp;ChandraXO=100.00&amp;Galex=0.00&amp;IRAS=0.00&amp;WMAP=0.00&amp;Cassini=0.00&amp;slide=8&amp;mI=1&amp;oI=4&amp;by=1"&gt;the&lt;/a&gt; &lt;a href="http://www.google.com/sky/#latitude=-33.7184857315714&amp;longitude=-170.57939529418945&amp;zoom=13&amp;Spitzer=0.00&amp;ChandraXO=100.00&amp;Galex=0.00&amp;IRAS=0.00&amp;WMAP=0.00&amp;Cassini=0.00&amp;slide=8&amp;mI=1&amp;oI=4&amp;by=1"&gt;universe&lt;/a&gt;, man.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-6156040916144263456?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/6156040916144263456/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=6156040916144263456' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/6156040916144263456'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/6156040916144263456'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2008/03/excuse-me-while-i-kiss-sky.html' title='Excuse Me, While I Kiss The Sky'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-8130174870696498863</id><published>2008-03-13T12:30:00.000-07:00</published><updated>2008-03-13T12:44:52.841-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source development'/><title type='text'>The U.S. Navy Goes Open Source</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://epguides.com/McHalesNavy/cast.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px;" src="http://epguides.com/McHalesNavy/cast.jpg" border="0" alt="" /&gt;&lt;/a&gt;That unwitting center of global innovation known as the United States Navy has made a bold announcement: from now on, they are only going to accept open source.&lt;br /&gt;&lt;br /&gt;I just &lt;a href="http://www.cnet.com/8301-13505_1-9893173-16.html?part=rss&amp;subj=news&amp;tag=2547-1_3-0-5"&gt;read about this on CNET&lt;/a&gt;, where they were linking to a &lt;a href="http://www.fcw.com/online/news/151858-1.html"&gt;recent story in Federal Computer Week&lt;/a&gt;. When I read this, I just about fell out of my seat. According to Vice Adm. Mark Edwards, deputy chief of naval operations for communications:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;“The days of proprietary technology must come to an end,” he said. “We will no longer accept systems that couple hardware, software and data.”&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Really. I am not making this up. Here is some more juicy stuff:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;“We can’t accept the increasing costs of maintaining our present-day capabilities,” Edwards said. “In the civilian marketplace, it’s just the opposite. Some private-sector concerns are cutting their costs by 90 percent while expanding their performance.”&lt;br /&gt;&lt;br /&gt;Edwards noted that the Navy has cut the number of databases and applications it maintains and has reduced its networks by 40 percent. “But it is not enough,” he added. “We would have to double our IT budget over the next several years just to run in place.”&lt;br /&gt;&lt;br /&gt;By using an open network architecture, the Navy could rapidly upgrade its capabilities and handle increases for demand, Edwards said.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;So what will be next? The U.S. Navy vs. The US Patent and Trademark Office? Wow, talk about getting bogged down in a conflict! Still, my money is on the Navy... I played on a soccer team with a Navy SEAL and a couple of Marines (also not kidding) and those guys really ARE tough!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-8130174870696498863?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/8130174870696498863/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=8130174870696498863' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/8130174870696498863'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/8130174870696498863'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2008/03/us-navy-goes-open-source.html' title='The U.S. Navy Goes Open Source'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-5836102157696326319</id><published>2008-03-13T11:00:00.000-07:00</published><updated>2008-03-13T11:18:40.020-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cool stuff'/><title type='text'>The Telepathy Machine Demo</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_SgxaAaUGqzY/R9luTjqDO1I/AAAAAAAABAA/otLrjQLL_K8/s1600-h/scanners.gif"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_SgxaAaUGqzY/R9luTjqDO1I/AAAAAAAABAA/otLrjQLL_K8/s200/scanners.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5177290528907279186" /&gt;&lt;/a&gt;I just saw an amazing demo of communication without speaking. No, not instant messaging, or sign language. Instead, scientists at Ambient Corporation have succeeded in tapping into the nervous system that control speech, and translate that into digitized speech. &lt;a href="http://www.youtube.com/watch?v=xyN4ViZ21N0&amp;eurl=http://technology.newscientist.com/article/dn13449-nervetapping-neckband-allows-telepathic-chat.html"&gt;Michael Callahan showed off their demo at the Texas Instruments developer conference&lt;/a&gt;. Wow, this is a long way from my TI-99/4!&lt;br /&gt;&lt;br /&gt;Applications for secret agents, people who suffer from ALS, and people who cannot shut up when on the subway will be forthcoming. The quality is "at the same level of recognition as the early days of speech to text", so it will be a little while till all those people staring off into space at cafes are actually talking to someone else.&lt;br /&gt;&lt;br /&gt;In the meantime, I would like to scan all of you in this room one at a time...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-5836102157696326319?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/5836102157696326319/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=5836102157696326319' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/5836102157696326319'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/5836102157696326319'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2008/03/telepathy-machine-demo.html' title='The Telepathy Machine Demo'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_SgxaAaUGqzY/R9luTjqDO1I/AAAAAAAABAA/otLrjQLL_K8/s72-c/scanners.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-8883171667842250768</id><published>2008-03-05T15:17:00.000-08:00</published><updated>2008-03-05T16:56:43.304-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='merb'/><title type='text'>Merb On The Virge</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.phoenix-fly.com/images/news/kj_rj_v1s.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px;" src="http://www.phoenix-fly.com/images/news/kj_rj_v1s.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;a href="http://www.merbivore.com/"&gt;Merb&lt;/a&gt;, the mighty challenger to the current Rails domination of the Ruby web framework conversation, races towards "getting very close to being stable api wise". That sounds like a 1.0 release to me!&lt;br /&gt;&lt;br /&gt;Ezra says that the &lt;a href="http://brainspl.at/articles/2008/03/05/merb-0-9-1-developer-release"&gt;0.9.1 developer release is ready to take thru its paces&lt;/a&gt;. One area where Merb really differs from Ruby on Rails is how Merb is based off of RubyGems. The refactored Merb architecture takes the Merb modularity to a massive 16 gems. You can really pick and choose what you want to include in your application.&lt;br /&gt;&lt;br /&gt;Luckily for the very lazy, or the undecided, there is a Merb gem that will install everything for you. All you have to do is:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;sudo gem install merb -y --source http://merbivore.com&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And away you go! Unfortunately, "you should uninstall all of your old Merb gems before you install the new version" but that is not so bad. If you have been Merbing for while, you are not afraid to get your hands a little dirty. And if not, Merb 1.0 (dare I say it?) is right around the corner.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-8883171667842250768?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/8883171667842250768/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=8883171667842250768' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/8883171667842250768'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/8883171667842250768'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2008/03/merb-on-virge.html' title='Merb On The Virge'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-8046411218531145822</id><published>2008-03-01T16:51:00.000-08:00</published><updated>2008-03-01T21:49:47.761-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='ec2'/><category scheme='http://www.blogger.com/atom/ns#' term='press'/><category scheme='http://www.blogger.com/atom/ns#' term='kill rock stars'/><title type='text'>Thanks For Paying Attention</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www-tc.pbs.org/wgbh/cultureshock/flashpoints/theater/images/clockwork_big.jpg?mii=1"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px;" src="http://www-tc.pbs.org/wgbh/cultureshock/flashpoints/theater/images/clockwork_big.jpg?mii=1" border="0" alt="" /&gt;&lt;/a&gt;This last week has brought some very nice and favorable attention to the Dead Programmer Society.&lt;br /&gt;&lt;br /&gt;The ever-popular &lt;a href="http://deadprogrammersociety.blogspot.com/2007/05/i-would-rather-be-jazz-programmer.html"&gt;"I'd Rather be A Jazz Programmer"&lt;/a&gt; post popped up again, this time in the stodgy old school publication Computerworld. They ran an &lt;a href="http://www.computerworld.com/action/article.do?command=viewArticleBasic&amp;articleId=9057899&amp;pageNumber=5"&gt;article on the "Rock Star Programmer" meme&lt;/a&gt;, and decided that my little post was part of the "Kill Rock Stars" contrarian perspective they were looking for. Thanks for making me look so good, guys!&lt;br /&gt;&lt;br /&gt;Actually it really is pretty amazing to make an article that also mentions &lt;a href="http://www.cs.helsinki.fi/u/torvalds/"&gt;Linus Torvalds&lt;/a&gt;, &lt;a href="http://www.joelonsoftware.com/"&gt;Joel Spolsky&lt;/a&gt;, &lt;a href="http://www.paulgraham.com/"&gt;Paul Graham&lt;/a&gt;, &lt;a href="http://blog.obiefernandez.com/"&gt;Obie Fernandez&lt;/a&gt;, &lt;a href="http://www.zedshaw.com/"&gt;Zed Shaw&lt;/a&gt;, and &lt;a href="http://whytheluckystiff.net/"&gt;"why the lucky"&lt;/a&gt; (sic). Hey, I told you Computerworld was stodgy. Sorry they mangled your handle, why!&lt;br /&gt;&lt;br /&gt;On to more recent work. &lt;a href="http://blog.xnot.org/"&gt;Ari Lerner&lt;/a&gt; and I have been getting some good attention to our introduction of the &lt;a href="http://rubyforge.org/projects/processorpool/"&gt;EC2 ProcessorPool gem&lt;/a&gt;. We managed to get covered in both &lt;a href="http://www.railsenvy.com/2008/2/27/rails-envy-podcast-episode-020-02-27-2008"&gt;Rails Envy&lt;/a&gt; and &lt;a href="http://www.rubyinside.com/interesting-ruby-tidbits-that-don%e2%80%99t-need-separate-posts-18-784.html"&gt;Ruby Inside&lt;/a&gt; this last week. Thank you to the editors for helping us let people know about this quite useful tool.&lt;br /&gt;&lt;br /&gt;Anyhow, that is about enough self-congratulation for one post. Next time, back to our irregularly scheduled programming.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-8046411218531145822?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/8046411218531145822/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=8046411218531145822' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/8046411218531145822'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/8046411218531145822'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2008/03/thanks-for-paying-attention.html' title='Thanks For Paying Attention'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-3320883331050451819</id><published>2008-02-20T14:20:00.000-08:00</published><updated>2008-02-20T15:12:49.321-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='rush shell'/><category scheme='http://www.blogger.com/atom/ns#' term='unix'/><category scheme='http://www.blogger.com/atom/ns#' term='rush'/><title type='text'>Rush The Shell</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.ferhiga.com/progre/portadas/rush-mpictures.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px;" src="http://www.ferhiga.com/progre/portadas/rush-mpictures.jpg" border="0" alt="" /&gt;&lt;/a&gt;I just read the &lt;a href="http://adam.blog.heroku.com/past/2008/2/19/rush_the_ruby_shell/"&gt;latest posting&lt;/a&gt; from Adam Wiggins, very cool dude, hard-core Rubyist, and friend. He has a new project called &lt;a href="http://rush.heroku.com/"&gt;Rush, the Ruby shell&lt;/a&gt;. Adam is one of the guys behind &lt;a href="http://heroku.com/"&gt;Heroku&lt;/a&gt;, which is a pretty amazing pure web browser-based IDE/deployment/hosting solution for Ruby on Rails, if you haven't seen that yet. &lt;br /&gt;&lt;br /&gt;Anyhow, like many of us, Adam seems like he just wants to use Ruby for everything. And when I say everything, I mean EVERYTHING. Writing bash scripts.... sucks. Destroying the sanctity of your Ruby code with &lt;pre&gt;`bash-shell-command /ugly /madness`&lt;/pre&gt; is not hardly any better. My man is trying to help us do away with all that, by applying a friendly familiar Rubyness, not just caging the ugliness away.&lt;br /&gt;&lt;br /&gt;Here is a little taste of Rush, from the Rush site:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;How about killing those pesky stray mongrels? Before:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;kill `ps aux | grep mongrel_rails | grep -v grep | cut -c 10-20`&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;After:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;processes.each { |p| p.kill if p.command == "mongrel_rails" }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;But rush is more than just an interactive shell and a library: it can also control any number of remote machines from a single location. Copy files or directories between servers as seamlessly as if it was all local. bash and ssh, we love you, but your era is past.&lt;br /&gt;&lt;br /&gt;Example of remote access:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;local = Rush::Box.new('localhost') &lt;br /&gt;remote = Rush::Box.new('my.remote.server.com')&lt;br /&gt;local_dir = local['/Users/adam/myproj/'] &lt;br /&gt;remote_dir = remote['/home/myproj/app/']&lt;br /&gt;local_dir.copy_to remote_dir &lt;br /&gt;remote_dir['**/.svn/'].each { |d| d.destroy }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;I have not had a chance to play with Rush yet, but I'm sure I will be. Unix shell scripting is not syntactical sugar, that is for sure, and Rush looks pretty sweet.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-3320883331050451819?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/3320883331050451819/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=3320883331050451819' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/3320883331050451819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/3320883331050451819'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2008/02/rush-shell.html' title='Rush The Shell'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-5926573495189636795</id><published>2008-02-20T11:18:00.000-08:00</published><updated>2008-02-20T12:29:25.326-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='grid computing'/><category scheme='http://www.blogger.com/atom/ns#' term='s3'/><category scheme='http://www.blogger.com/atom/ns#' term='sinatra'/><category scheme='http://www.blogger.com/atom/ns#' term='ec2'/><title type='text'>Everybody Into The Pool</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.ci.arcadia.ca.us/images/swimming_pool-county_park.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px;" src="http://www.ci.arcadia.ca.us/images/swimming_pool-county_park.jpg" border="0" alt="" /&gt;&lt;/a&gt;A few weeks back, I indulged my current obsession with grid computing, and &lt;a href="http://aws.amazon.com/ec2"&gt;Amazon's EC2&lt;/a&gt; and S3 services in particular, with a &lt;a href="http://deadprogrammersociety.blogspot.com/2008/01/on-grid-with-ec2.html"&gt;lengthy post&lt;/a&gt;. I mentioned how friend &lt;a href="http://blog.xnot.org/"&gt;Ari Lerner&lt;/a&gt; and I had built a really neat solution, and were going to put all of our processing farm goodness into a nice neat gemified package. Well, mostly thanks to Ari, we now have a new Ruby gem called &lt;a href="http://rubyforge.org/projects/processorpool/"&gt;ProcessorPool&lt;/a&gt; that uses EC2 and S3 to do all the hard work for you.&lt;br /&gt;&lt;br /&gt;Based on &lt;a href="http://sinatra.rubyforge.org/"&gt;Sinatra&lt;/a&gt;, with a bunch of S3 goodness mixed in, the ProcessorPool gem makes it staggeringly easy to exploit the power of the EC2 grid. More info about it is available at the &lt;a href="http://blog.citrusbyte.com/2008/2/20/effortlessly-farm-work-to-an-ec2-instance-without-batting-an-eye"&gt;Blog @ CitrusByte&lt;/a&gt;, and you can also check it out on RubyForge &lt;a href="http://rubyforge.org/projects/processorpool/"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;All kinds of fun applications await you in the pool... image processing, video/audio transcoding, heavy computational stuff, long crawls of content... and it is fun to delegate to a pool of worker machines in the EC2 cloud.&lt;br /&gt;&lt;br /&gt;Come on in... the pool is fine.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-5926573495189636795?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/5926573495189636795/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=5926573495189636795' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/5926573495189636795'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/5926573495189636795'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2008/02/everybody-into-pool.html' title='Everybody Into The Pool'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-1750969815242724418</id><published>2008-02-19T07:52:00.000-08:00</published><updated>2008-02-19T08:16:15.289-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web development'/><category scheme='http://www.blogger.com/atom/ns#' term='user interface'/><title type='text'>Getting To Usable</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www-kpno.kpno.noao.edu/2m-manual/images/console-control-panels.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px;" src="http://www-kpno.kpno.noao.edu/2m-manual/images/console-control-panels.jpg" border="0" alt="" /&gt;&lt;/a&gt;I read a great posting last night from Matt Rogers, founder of startup Aroxo, on a &lt;a href="http://www.aroxo.com/blog/mattr/index.php/2008/02/14/how-to-test-your-system-with-real-users"&gt;strategy for usability testing&lt;/a&gt;. Suddenly, I was flashing back a few years to the early salad days of web usability...  &lt;br /&gt;&lt;br /&gt;When I first read &lt;a href="http://www.sensible.com/"&gt;Steve Krug's&lt;/a&gt; tiny masterwork &lt;a href="http://www.amazon.com/exec/obidos/ASIN/0321344758/ref=nosim/advancedcommonse"&gt;"Don't Make Me Think"&lt;/a&gt;, I was very excited; at last, a nice practical approach! After the pedantic and overly academic work of guys like Jakob Neilson, Krug's book hit me like Dr. Seuss taking out Dick, Jane, and Spot.&lt;br /&gt;&lt;br /&gt;Somehow, Rogers' post reminded me of that sudden flash of clarity in the fog. Yes, we can DO this! Gentlemen and ladies, start your testing...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35868762-1750969815242724418?l=deadprogrammersociety.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deadprogrammersociety.blogspot.com/feeds/1750969815242724418/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35868762&amp;postID=1750969815242724418' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/1750969815242724418'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35868762/posts/default/1750969815242724418'/><link rel='alternate' type='text/html' href='http://deadprogrammersociety.blogspot.com/2008/02/getting-to-usable.html' title='Getting To Usable'/><author><name>Ron Evans</name><uri>http://www.blogger.com/profile/06754261780924273552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_SgxaAaUGqzY/SbbCqlNzh3I/AAAAAAAABt8/Cu8TvcW4XMs/S220/Photo2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35868762.post-3787039307423629362</id><published>2008-02-05T07:35:00.000-08:00</published><updated>2008-02-05T07:51:46.324-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cool stuff'/><category scheme='http://www.blogger.com/atom/ns#' term='robotics'/><title type='text'>You Got Your DS In My Robot</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.wanyrobotics.com/img/p_robots_silver.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px;" src="http://www.wanyrobotics.com/img/p_robots_silver.jpg" border="0" alt="" /&gt;&lt;/a&gt;The French press may be reeling in financial scandal, but the cool kids there are still concentrating on what is really important: drinking wine and &lt;a href="http://gizmodo.com/352595/robot-mod-uses-nintendo-ds-touchscreen-mic
