<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" xml:lang="en-US"><title type="text">::blowmage:: - Home</title><link rel="alternate" type="text/html" href="http://blowmage.com/" /><updated>2008-05-29T14:45:02+00:00</updated><generator uri="http://mephistoblog.com">Mephisto Noh-Varr</generator><id>tag:blowmage.com,2008:mephisto/</id><geo:lat>40.38584</geo:lat><geo:long>-111.733334</geo:long><link rel="self" href="http://feeds.feedburner.com/blowmage" type="application/atom+xml" /><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site, subject to copyright and fair use.</feedburner:browserFriendly><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry><title type="text">Alt.NET Podcast Launched</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blowmage/~3/yBCgbHMGWJk/altnetpodcast-launched" /><category term="alt.net" /><category term="podcast" /><author><name>blowmage</name></author><updated>2008-05-29T07:45:02-07:00</updated><id>tag:blowmage.com,2008-05-14:100</id><content type="html">
            &lt;p&gt;So we launched the &lt;a href="http://altnetpodcast.com/"&gt;Alt.NET Podcast&lt;/a&gt; yesterday, and we hope to have regular episodes released. I’m really excited about an Alt.NET podcast because I hope it lowers the barriers of entry into &lt;a href="http://altdotnet.org/"&gt;Alt.NET&lt;/a&gt; and clears up any confusion about what it is and why it was started.&lt;/p&gt;


	&lt;p&gt;The first episode is a conversation between &lt;a href="http://codebetter.com/blogs/david_laribee/"&gt;David Laribee&lt;/a&gt;, &lt;a href="http://codebetter.com/blogs/jeremy.miller/"&gt;Jeremy D. Miller&lt;/a&gt;, and &lt;a href="http://www.lostechies.com/blogs/chad_myers/"&gt;Chad Myers&lt;/a&gt; on &lt;a href="http://altnetpodcast.com/episodes/1-continuous-improvement"&gt;continuous improvement&lt;/a&gt; I really appreciate them taking of their time to record a podcast and to drop all their knowledge on the subject. I think it turned out really well.&lt;/p&gt;


	&lt;p&gt;If you have time please check it out and let me know what you like and how it could be better. Oh, and if you like it, please vote it up on the following link bait sites:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://www.dotnetkicks.com/community/Alt_NET_Podcast_Launched"&gt;DotNetKicks&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.dzone.com/links/altnet_podcast_launched.html"&gt;DZone&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://reddit.com/info/6jaa4/comments"&gt;reddit&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; May 29, 2008 – &lt;a href="http://twitter.com/rbazinet"&gt;Rob Bazinet&lt;/a&gt; interviewed me about the podcast for &lt;a href="http://www.infoq.com/news/2008/05/altnet-podcast"&gt;InfoQ&lt;/a&gt; and even &lt;a href="http://www.accidentaltechnologist.com/infoq/the-alt-net-podcast/"&gt;blogged&lt;/a&gt; about it. I think it turned out fairly well. We’ve &lt;a href="http://twitter.com/sillyevar/statuses/810617763"&gt;had&lt;/a&gt; &lt;a href="http://twitter.com/sillyevar/statuses/810617763"&gt;alot&lt;/a&gt; &lt;a href="http://twitter.com/ignu/statuses/810664175"&gt;of&lt;/a&gt; &lt;a href="http://twitter.com/JimHolmes/statuses/811903878"&gt;great&lt;/a&gt; &lt;a href="http://twitter.com/mattblodgett/statuses/812154076"&gt;feedback&lt;/a&gt; &lt;a href="http://twitter.com/RossCode/statuses/815806029"&gt;so&lt;/a&gt; &lt;a href="http://twitter.com/silverSpoon/statuses/815852472"&gt;far&lt;/a&gt;, and I’m excited by the direction we are going. Thanks to everyone for your support.&lt;/p&gt;
          &lt;img src="http://feeds.feedburner.com/~r/blowmage/~4/yBCgbHMGWJk" height="1" width="1"/&gt;</content><feedburner:origLink>http://blowmage.com/2008/5/14/altnetpodcast-launched</feedburner:origLink></entry><entry><title type="text">Binary Lottery 2008</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blowmage/~3/EPWPu91h4-U/binary-lottery-2008" /><category term="mtnwestrubyconf" /><category term="ruby" /><author><name>blowmage</name></author><updated>2008-03-31T09:18:20-07:00</updated><id>tag:blowmage.com,2008-03-30:94</id><content type="html">
            &lt;p&gt;This year at &lt;a href="http://mtnwestrubyconf.org/"&gt;MountainWest RubyConf 2008&lt;/a&gt; we had a slew of books and t-shirts to give away to attendees. Like last year we printed each attendee's unique number on their badge in base 2 (binary). We would then randomly select a winner from the attendee list. But we would use their binary number in the reveal, showing only one number at a time. It might be cheesy, but we really enjoy it so deal. :)&lt;/p&gt;

&lt;p&gt;This is what the badges looked like:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blowmage.com/assets/2008/3/31/badge.jpg" height="375" alt="My MWRC Badge. I'm number 11111111 because I made the badges. Its my right as an organizer! :)" width="500" /&gt;&lt;/p&gt;

&lt;p&gt;Last year I wrote a command line app that used &lt;a href="http://www.figlet.org/"&gt;figlet&lt;/a&gt; to display the winner. You can see the &lt;a href="http://mtnwestrubyconf2007.confreaks.com/session07.html"&gt;video of last year's Lightning Talk&lt;/a&gt; where I show the code if you are interested. This year I wanted to mix it up a bit, and I decided about 10 hours before the conference to try my hand at using &lt;a href="http://whytheluckystiff.net/"&gt;_why&lt;/a&gt;'s &lt;a href="http://code.whytheluckystiff.net/shoes/"&gt;Shoes&lt;/a&gt; to build a GUI version. So here it is:&lt;/p&gt;

&lt;pre class="textmate-source ruby_blue"&gt;&lt;span class="source source_ruby"&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;yaml&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;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 source of much evil...
&lt;/span&gt;&lt;span class="meta meta_function meta_function_method meta_function_method_with-arguments meta_function_method_with-arguments_ruby"&gt;&lt;span class="keyword keyword_control keyword_control_def keyword_control_def_ruby"&gt;def&lt;/span&gt; &lt;span class="entity entity_name entity_name_function entity_name_function_ruby"&gt;update_digit&lt;/span&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_ruby"&gt;(&lt;/span&gt;&lt;span class="variable variable_parameter variable_parameter_function variable_parameter_function_ruby"&gt;p&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; cnt&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; dig&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; wnr&lt;/span&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_ruby"&gt;)&lt;/span&gt;&lt;/span&gt;
  &lt;span class="keyword keyword_control keyword_control_ruby"&gt;if&lt;/span&gt; cnt &lt;span class="keyword keyword_operator keyword_operator_comparison keyword_operator_comparison_ruby"&gt;&amp;lt;&lt;/span&gt; dig
    p&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;replace rand&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;&lt;span class="constant constant_numeric constant_numeric_ruby"&gt;2&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;)&lt;/span&gt;
  &lt;span class="keyword keyword_control keyword_control_ruby"&gt;else&lt;/span&gt;
    p&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;replace wnr&lt;span class="punctuation punctuation_section punctuation_section_array punctuation_section_array_ruby"&gt;[&lt;/span&gt;&lt;span class="constant constant_numeric constant_numeric_ruby"&gt;8&lt;/span&gt; &lt;span class="keyword keyword_operator keyword_operator_arithmetic keyword_operator_arithmetic_ruby"&gt;-&lt;/span&gt; dig&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;chr
    p&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;style&lt;span class="punctuation punctuation_section punctuation_section_array punctuation_section_array_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;stroke&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_array punctuation_section_array_ruby"&gt;]&lt;/span&gt; &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby"&gt;=&lt;/span&gt; red
  &lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;
&lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&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; Use the full path because either Shoes is easily confused, or I am
&lt;/span&gt;users &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;YAML&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_other punctuation_separator_other_ruby"&gt;::&lt;/span&gt;load&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;open&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_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;/Users/blowmage/Lottery/users.yaml&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_function punctuation_section_function_ruby"&gt;))&lt;/span&gt;
winner &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby"&gt;=&lt;/span&gt; users&lt;span class="punctuation punctuation_section punctuation_section_array punctuation_section_array_ruby"&gt;[&lt;/span&gt;rand&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;users&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;size&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_array punctuation_section_array_ruby"&gt;]&lt;/span&gt; &lt;span class="keyword keyword_control keyword_control_ruby"&gt;until&lt;/span&gt; &lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;winner &lt;span class="keyword keyword_operator keyword_operator_logical keyword_operator_logical_ruby"&gt;and&lt;/span&gt; winner&lt;span class="punctuation punctuation_section punctuation_section_array punctuation_section_array_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;eligible&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_section punctuation_section_function punctuation_section_function_ruby"&gt;)&lt;/span&gt;
count &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby"&gt;=&lt;/span&gt; &lt;span class="constant constant_numeric constant_numeric_ruby"&gt;0&lt;/span&gt;

&lt;span class="support support_class support_class_ruby"&gt;Shoes&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;app &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;width&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;900&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;height&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;700&lt;/span&gt; &lt;span class="keyword keyword_control keyword_control_start-block keyword_control_start-block_ruby"&gt;do
&lt;/span&gt;  keypress &lt;span class="keyword keyword_control keyword_control_start-block keyword_control_start-block_ruby"&gt;do &lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_variable punctuation_separator_variable_ruby"&gt;|&lt;/span&gt;&lt;span class="variable variable_other variable_other_block variable_other_block_ruby"&gt;k&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_variable punctuation_separator_variable_ruby"&gt;|&lt;/span&gt;
    count &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_augmented keyword_operator_assignment_augmented_ruby"&gt;+=&lt;/span&gt; &lt;span class="constant constant_numeric constant_numeric_ruby"&gt;1&lt;/span&gt;
  &lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;
  stack &lt;span class="keyword keyword_control keyword_control_start-block keyword_control_start-block_ruby"&gt;do
&lt;/span&gt;    para &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;MountainWest RubyConf 2008 Binary Lottery&lt;span class="constant constant_character constant_character_escape constant_character_escape_ruby"&gt;\n&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="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; 
      &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;And your winner is...&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;font&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;Helvetica 48px&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;
    lbl_name &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby"&gt;=&lt;/span&gt; para &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="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;font&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;Helvetica 128px&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;
    flow &lt;span class="keyword keyword_control keyword_control_start-block keyword_control_start-block_ruby"&gt;do
&lt;/span&gt;      a &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby"&gt;=&lt;/span&gt; para rand&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;&lt;span class="constant constant_numeric constant_numeric_ruby"&gt;2&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_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;font&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;Helvetica 192px&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;
      b &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby"&gt;=&lt;/span&gt; para rand&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;&lt;span class="constant constant_numeric constant_numeric_ruby"&gt;2&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_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;font&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;Helvetica 192px&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;
      c &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby"&gt;=&lt;/span&gt; para rand&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;&lt;span class="constant constant_numeric constant_numeric_ruby"&gt;2&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_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;font&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;Helvetica 192px&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;
      d &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby"&gt;=&lt;/span&gt; para rand&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;&lt;span class="constant constant_numeric constant_numeric_ruby"&gt;2&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_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;font&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;Helvetica 192px&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;
      e &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby"&gt;=&lt;/span&gt; para rand&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;&lt;span class="constant constant_numeric constant_numeric_ruby"&gt;2&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_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;font&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;Helvetica 192px&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;
      f &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby"&gt;=&lt;/span&gt; para rand&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;&lt;span class="constant constant_numeric constant_numeric_ruby"&gt;2&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_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;font&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;Helvetica 192px&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;
      g &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby"&gt;=&lt;/span&gt; para rand&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;&lt;span class="constant constant_numeric constant_numeric_ruby"&gt;2&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_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;font&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;Helvetica 192px&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;
      h &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby"&gt;=&lt;/span&gt; para rand&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;&lt;span class="constant constant_numeric constant_numeric_ruby"&gt;2&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_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;font&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;Helvetica 192px&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;

      animate&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;&lt;span class="constant constant_numeric constant_numeric_ruby"&gt;60&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;)&lt;/span&gt; &lt;span class="keyword keyword_control keyword_control_start-block keyword_control_start-block_ruby"&gt;do
&lt;/span&gt;        update_digit&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;a&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; count&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; &lt;span class="constant constant_numeric constant_numeric_ruby"&gt;8&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; winner&lt;span class="punctuation punctuation_section punctuation_section_array punctuation_section_array_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;number&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_section punctuation_section_function punctuation_section_function_ruby"&gt;)&lt;/span&gt;
        update_digit&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;b&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; count&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; &lt;span class="constant constant_numeric constant_numeric_ruby"&gt;7&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; winner&lt;span class="punctuation punctuation_section punctuation_section_array punctuation_section_array_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;number&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_section punctuation_section_function punctuation_section_function_ruby"&gt;)&lt;/span&gt;
        update_digit&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;c&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; count&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; &lt;span class="constant constant_numeric constant_numeric_ruby"&gt;6&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; winner&lt;span class="punctuation punctuation_section punctuation_section_array punctuation_section_array_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;number&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_section punctuation_section_function punctuation_section_function_ruby"&gt;)&lt;/span&gt;
        update_digit&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;d&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; count&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; &lt;span class="constant constant_numeric constant_numeric_ruby"&gt;5&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; winner&lt;span class="punctuation punctuation_section punctuation_section_array punctuation_section_array_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;number&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_section punctuation_section_function punctuation_section_function_ruby"&gt;)&lt;/span&gt;
        update_digit&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;e&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; count&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; &lt;span class="constant constant_numeric constant_numeric_ruby"&gt;4&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; winner&lt;span class="punctuation punctuation_section punctuation_section_array punctuation_section_array_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;number&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_section punctuation_section_function punctuation_section_function_ruby"&gt;)&lt;/span&gt;
        update_digit&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;f&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; count&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; &lt;span class="constant constant_numeric constant_numeric_ruby"&gt;3&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; winner&lt;span class="punctuation punctuation_section punctuation_section_array punctuation_section_array_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;number&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_section punctuation_section_function punctuation_section_function_ruby"&gt;)&lt;/span&gt;
        update_digit&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;g&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; count&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; &lt;span class="constant constant_numeric constant_numeric_ruby"&gt;2&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; winner&lt;span class="punctuation punctuation_section punctuation_section_array punctuation_section_array_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;number&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_section punctuation_section_function punctuation_section_function_ruby"&gt;)&lt;/span&gt;
        update_digit&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;h&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; count&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; &lt;span class="constant constant_numeric constant_numeric_ruby"&gt;1&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; winner&lt;span class="punctuation punctuation_section punctuation_section_array punctuation_section_array_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;number&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_section punctuation_section_function punctuation_section_function_ruby"&gt;)&lt;/span&gt;
        
        &lt;span class="keyword keyword_control keyword_control_ruby"&gt;if&lt;/span&gt; count &lt;span class="keyword keyword_operator keyword_operator_comparison keyword_operator_comparison_ruby"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="constant constant_numeric constant_numeric_ruby"&gt;8&lt;/span&gt;
          lbl_name&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;replace winner&lt;span class="punctuation punctuation_section punctuation_section_array punctuation_section_array_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;name&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_array punctuation_section_array_ruby"&gt;]&lt;/span&gt;
        &lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;
        &lt;span class="keyword keyword_control keyword_control_ruby"&gt;if&lt;/span&gt; count &lt;span class="keyword keyword_operator keyword_operator_comparison keyword_operator_comparison_ruby"&gt;&amp;gt;&lt;/span&gt; &lt;span class="constant constant_numeric constant_numeric_ruby"&gt;8&lt;/span&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; Click one more time to flag the user so they won't win again.
&lt;/span&gt;          lbl_name&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;style&lt;span class="punctuation punctuation_section punctuation_section_array punctuation_section_array_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;stroke&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_array punctuation_section_array_ruby"&gt;]&lt;/span&gt; &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby"&gt;=&lt;/span&gt; red
          winner&lt;span class="punctuation punctuation_section punctuation_section_array punctuation_section_array_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;eligible&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_array punctuation_section_array_ruby"&gt;]&lt;/span&gt; &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby"&gt;=&lt;/span&gt; &lt;span class="constant constant_language constant_language_ruby"&gt;false&lt;/span&gt;
          open&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_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;/Users/blowmage/Lottery/users.yaml&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="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;w&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_function punctuation_section_function_ruby"&gt;)&lt;/span&gt; &lt;span class="keyword keyword_control keyword_control_start-block keyword_control_start-block_ruby"&gt;do &lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_variable punctuation_separator_variable_ruby"&gt;|&lt;/span&gt;&lt;span class="variable variable_other variable_other_block variable_other_block_ruby"&gt;out&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_variable punctuation_separator_variable_ruby"&gt;|&lt;/span&gt;
            &lt;span class="support support_class support_class_ruby"&gt;YAML&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;dump users&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; out
          &lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;
        &lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;
      &lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;
    &lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;
  &lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;
&lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Here is a sample of what the &lt;code&gt;users.yaml&lt;/code&gt; file looked like:&lt;/p&gt;

&lt;pre class="textmate-source ruby_blue"&gt;&lt;span class="source source_yaml"&gt;&lt;span class="keyword keyword_operator keyword_operator_symbol"&gt;---&lt;/span&gt; 
&lt;span class="keyword keyword_operator keyword_operator_symbol"&gt;-&lt;/span&gt; :&lt;span class="meta meta_tag meta_tag_yaml"&gt;&lt;span class="entity entity_name entity_name_tag entity_name_tag_yaml"&gt;number&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_key-value punctuation_separator_key-value_yaml"&gt;:&lt;/span&gt; &lt;/span&gt;&lt;span class="string string_quoted string_quoted_double string_quoted_double_yaml"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_yaml"&gt;"&lt;/span&gt;00000000&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_yaml"&gt;"&lt;/span&gt;&lt;/span&gt;
  :&lt;span class="string string_unquoted string_unquoted_yaml"&gt;&lt;span class="entity entity_name entity_name_tag entity_name_tag_yaml"&gt;name&lt;span class="punctuation punctuation_separator punctuation_separator_key-value punctuation_separator_key-value_yaml"&gt;:&lt;/span&gt;&lt;/span&gt; &lt;span class="string string_unquoted string_unquoted_yaml"&gt;Jonathan Younger&lt;/span&gt;&lt;/span&gt;
  :&lt;span class="string string_unquoted string_unquoted_yaml"&gt;&lt;span class="entity entity_name entity_name_tag entity_name_tag_yaml"&gt;eligible&lt;span class="punctuation punctuation_separator punctuation_separator_key-value punctuation_separator_key-value_yaml"&gt;:&lt;/span&gt;&lt;/span&gt; &lt;span class="string string_unquoted string_unquoted_yaml"&gt;true&lt;/span&gt;&lt;/span&gt;
&lt;span class="keyword keyword_operator keyword_operator_symbol"&gt;-&lt;/span&gt; :&lt;span class="meta meta_tag meta_tag_yaml"&gt;&lt;span class="entity entity_name entity_name_tag entity_name_tag_yaml"&gt;number&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_key-value punctuation_separator_key-value_yaml"&gt;:&lt;/span&gt; &lt;/span&gt;&lt;span class="string string_quoted string_quoted_double string_quoted_double_yaml"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_yaml"&gt;"&lt;/span&gt;00000001&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_yaml"&gt;"&lt;/span&gt;&lt;/span&gt;
  :&lt;span class="string string_unquoted string_unquoted_yaml"&gt;&lt;span class="entity entity_name entity_name_tag entity_name_tag_yaml"&gt;name&lt;span class="punctuation punctuation_separator punctuation_separator_key-value punctuation_separator_key-value_yaml"&gt;:&lt;/span&gt;&lt;/span&gt; &lt;span class="string string_unquoted string_unquoted_yaml"&gt;Brian Cooke&lt;/span&gt;&lt;/span&gt;
  :&lt;span class="string string_unquoted string_unquoted_yaml"&gt;&lt;span class="entity entity_name entity_name_tag entity_name_tag_yaml"&gt;eligible&lt;span class="punctuation punctuation_separator punctuation_separator_key-value punctuation_separator_key-value_yaml"&gt;:&lt;/span&gt;&lt;/span&gt; &lt;span class="string string_unquoted string_unquoted_yaml"&gt;false&lt;/span&gt;&lt;/span&gt;
&lt;span class="keyword keyword_operator keyword_operator_symbol"&gt;-&lt;/span&gt; :&lt;span class="meta meta_tag meta_tag_yaml"&gt;&lt;span class="entity entity_name entity_name_tag entity_name_tag_yaml"&gt;number&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_key-value punctuation_separator_key-value_yaml"&gt;:&lt;/span&gt; &lt;/span&gt;&lt;span class="string string_quoted string_quoted_double string_quoted_double_yaml"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_yaml"&gt;"&lt;/span&gt;00000010&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_yaml"&gt;"&lt;/span&gt;&lt;/span&gt;
  :&lt;span class="string string_unquoted string_unquoted_yaml"&gt;&lt;span class="entity entity_name entity_name_tag entity_name_tag_yaml"&gt;name&lt;span class="punctuation punctuation_separator punctuation_separator_key-value punctuation_separator_key-value_yaml"&gt;:&lt;/span&gt;&lt;/span&gt; &lt;span class="string string_unquoted string_unquoted_yaml"&gt;Justin Kay&lt;/span&gt;&lt;/span&gt;
  :&lt;span class="string string_unquoted string_unquoted_yaml"&gt;&lt;span class="entity entity_name entity_name_tag entity_name_tag_yaml"&gt;eligible&lt;span class="punctuation punctuation_separator punctuation_separator_key-value punctuation_separator_key-value_yaml"&gt;:&lt;/span&gt;&lt;/span&gt; &lt;span class="string string_unquoted string_unquoted_yaml"&gt;false&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Here is what the app looked like while running:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blowmage.com/assets/2008/3/30/binary-lottery-shoes.gif" height="254" alt="Binary Lottery written in Shoes" width="500" /&gt;&lt;/p&gt;
&lt;p&gt;Logan Barnett also wrote a GUI using &lt;a href="http://jruby.codehaus.org/"&gt;JRuby&lt;/a&gt; and &lt;a href="http://monkeybars.rubyforge.org/"&gt;MonkeyBars&lt;/a&gt;. I really hope he releases his version as well. Here is what the app looked like on the third draw, sort of an easter egg I discovered during the conference:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blowmage.com/assets/2008/3/30/binary-lottery-monkeybars.jpg" height="374" alt="Binary Lottery written in JRuby with MonkeyBars" width="500" /&gt;&lt;/p&gt;
          &lt;img src="http://feeds.feedburner.com/~r/blowmage/~4/EPWPu91h4-U" height="1" width="1"/&gt;</content><feedburner:origLink>http://blowmage.com/2008/3/30/binary-lottery-2008</feedburner:origLink></entry><entry><title type="text">Ruby Folk Are Nice</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blowmage/~3/gX806LB3kek/ruby-folk-are-nice" /><category term="community" /><category term="mtnwestrubyconf" /><category term="ruby" /><author><name>blowmage</name></author><updated>2008-03-29T13:24:06-07:00</updated><id>tag:blowmage.com,2008-03-29:92</id><content type="html">
            &lt;p&gt;We’re in the midst of &lt;a href="http://mtnwestrubyconf.org/"&gt;MountainWest RubyConf 2008&lt;/a&gt;, and I have lots I want to blog about it. But before I get there, and before I take a 36 hour nap, I just want to let you know how nice Ruby folk are. This may be a fairly simple example, but I want to share it anyway.&lt;/p&gt;


	&lt;p&gt;I’m one of the organizers of the conference, and that has meant that I miss about half the conference sessions because I’m running around trying to fix the power or fix the wifi or organize the distribution of food. On Friday we had a really delicious lunch from &lt;a href="http://www.rumbi.com/"&gt;Rumbi’s&lt;/a&gt;, but it left the conference room we ate in rather messy. We paid a cleaning deposit, but the trash needed to be collected and the room straightened. I was informed of this just as we were breaking for dinner and I told them we would fix it before the evening session. I ended up stressing over this for the entire dinner break because I hate the idea of inconveniencing the great people at the &lt;a href="http://www.slcpl.lib.ut.us/locations.jsp?parent_id=8&amp;page_id=20"&gt;Salt Lake City library&lt;/a&gt; who have been so accommodating towards the 200 geeks who descended upon them destroying their power circuits and their wifi.&lt;/p&gt;


	&lt;p&gt;I got back from dinner just 20 minutes before the evening session, and called out to the ~30 folks milling around in the foyer asking for help cleaning the room up.  We had ~8 people in the room and had the whole thing straightened up in under 5 minutes. That’s awesome.&lt;/p&gt;


	&lt;p&gt;And to add to this, as we left at the end of the day I asked if everyone could pick up their empty water bottles. After chatting with some folks I walked out and the entire auditorium was cleaned out. Not a water bottle in site. Now this may seem like two very small things, but this means the world to me. It shows respect for the venue and I appreciate it very much. Thanks guys!&lt;/p&gt;


	&lt;p&gt;I’ve had so much fun at the conference this year. I’ve fully enjoyed meeting new people and talking with everyone I’ve been able talk with. We have a wide variety of folks attending this year; from the mind-bendingly smart gurus to the total noobs. But everyone is getting along and helping each other become better. Not just better technically in regards to Ruby, but I honestly believe that we are helping each other become better people as well. There is a great vibe here, I wish everyone could experience it.&lt;/p&gt;


	&lt;p&gt;I know we set the bar pretty high last year, but I think we on our way to being even better this year.&lt;/p&gt;
          &lt;img src="http://feeds.feedburner.com/~r/blowmage/~4/gX806LB3kek" height="1" width="1"/&gt;</content><feedburner:origLink>http://blowmage.com/2008/3/29/ruby-folk-are-nice</feedburner:origLink></entry><entry><title type="text">IronRuby + C# = Awesomeness</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blowmage/~3/6kw0zGhfpsg/ironruby-csharp-awesomeness" /><category term=".net" /><category term="boisecodecamp" /><category term="ironruby" /><author><name>blowmage</name></author><updated>2008-03-10T13:38:34-07:00</updated><id>tag:blowmage.com,2008-03-10:83</id><content type="html">
            &lt;p&gt;Saturday I gave a session at the third &lt;a href="http://www.boisecodecamp.org/"&gt;Boise Code Camp&lt;/a&gt;. &lt;a href="http://www.cityofboise.org/"&gt;Boise&lt;/a&gt; is my home town, so I am always happy to get back and enjoy the nostalgia.  The Boise Code Camp this year was huge! As of Saturday morning there were 495 folks registered to attend, and 370 that were actually there. Crazy. Much props to the folks running it this year.  Having helped organize the first Boise Code Camp and organized both MountainWest RubyConfs I know how hard they worked to pull this off. Great work guys!&lt;/p&gt;


	&lt;p&gt;Here are some of my notes for my session. I use a modified &lt;a href="http://presentationzen.blogs.com/presentationzen/2005/09/living_large_ta.html"&gt;Takahashi Method&lt;/a&gt; of presentation, so my slide deck doesn’t make much sense by itself. Also, I only gave three demos, and the code was really simple because I can’t type and talk at the same time. Another reason for limited demo code is that alot of these concepts are new to folks so I wanted to go slow and make sure I brought everyone along. Disclaimer finished, here is the &lt;a href="http://blowmage.com/assets/2008/3/10/ironruby-csharp-awesomeness.pdf"&gt;slide deck&lt;/a&gt; and the &lt;a href="http://blowmage.com/assets/2008/3/10/ironruby-csharp-awesomeness.zip"&gt;code&lt;/a&gt;. (Watch for the random Spider-Man appearance.)&lt;/p&gt;


	&lt;h3&gt;Can a Computer Language be Beautiful?&lt;/h3&gt;


	&lt;p&gt;I believe that software developers tend to create an exclusive culture around their technical knowledge. Most think that you need to “earn” your knowledge, and will respond to naive questions with answers such as “RTFM” or “Just Google it”. While this is understandable I think this attitude hurts more than it helps in the long run.&lt;/p&gt;


	&lt;p&gt;Seeing as the majority of sessions are Microsoft-centric, I kept my observations to Microsoft technologies. I’ve got my own path through Microsoft technologies and really came to my own on “classic” &lt;span class="caps"&gt;ASP&lt;/span&gt;. ASP and &lt;span class="caps"&gt;COM&lt;/span&gt; were a great leap forward for web programming compared to what we were using before, but it was typical to end up with spaghetti code. The introduction of .NET was seen as a solution to &lt;span class="caps"&gt;ASP&lt;/span&gt;’s “loose” code, but it came at a cost of restricting how expressive our code could be, making beautiful code more difficult&lt;/p&gt;


	&lt;p&gt;It shouldn’t come as a surprise that Ruby folks refer to Ruby code as “beautiful”. This is one of the things that I really love about the Ruby community. Ruby’s notion of Object Orientation is fundamentally different that C++/Java/C#. And Ruby’s meta-programming enables you to place responsibility where it belongs, and write expressive code by avoiding the accidental complexity typical of static language. This is why I like to think of Ruby as beautiful.&lt;/p&gt;


	&lt;p&gt;I gave the example of trying to enable sorting of domain objects in a DataGridView control, because that just happened to come up yesterday. The .NET solution is to inherit from BindingList&amp;lt;t&gt; and implement 4 properties and 2 methods. The Ruby solution is to simply call the array’s &lt;code&gt;sort_by&lt;/code&gt; passing a block of how you want the item’s sort value to be calculated. My point being that Ruby code tends to rely on on the trust of the developer, while there is no way to quantify that trust in statically-compiled C#.&lt;/p&gt;


	&lt;h3&gt;What is Polyglot Programming?&lt;/h3&gt;


	&lt;p&gt;Another term for “Polyglot Programming” can be “Language Oriented Programming”, or using the right tool for the right job. I asked the folks attending if their language is right for their task, and a few responded that they thought C# was indeed the right language. I countered by putting forth my opinion that unless it is a domain specific language it probably isn’t the right language. DSLs can express the domain instructions without all the cruft or implementation instructions. I’m not sure how well this was received, as most seemed skeptical.&lt;/p&gt;


	&lt;p&gt;I also soap-boxed a bit about some developers defending C# to their dying breath, and the irony that the &lt;span class="caps"&gt;CLR&lt;/span&gt; was intended for multiple languages. Then I went into my belief that static languages are not the future, and in 5 years we will be using a dynamic language for the majority of work we are using static languages for today. You can read more about my thoughts on this &lt;a href="http://blowmage.com/2006/2/17/ruby-thinking"&gt;here&lt;/a&gt; and &lt;a href="http://blowmage.com/2007/12/18/the-rubification-of-csharp"&gt;here&lt;/a&gt; and &lt;a href="http://blowmage.com/2007/12/19/static-languages-are-fail"&gt;here&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;But I don’t believe that C# will or should go away. C# will still be the best language for system-level coding, because it is so aligned to the &lt;span class="caps"&gt;CLR&lt;/span&gt;. What I do believe is that we will stack dynamic languages on top of the static languages, and DSLs on top of the dynamic languages. You can hear more about this in my &lt;a href="http://rubiverse.com/podcasts/5-ola-bini-on-polyglot-programming"&gt;Rubiverse Podcast with Ola Bini&lt;/a&gt;.&lt;/p&gt;


	&lt;h3&gt;What can IronRuby do now?&lt;/h3&gt;


	&lt;p&gt;IronRuby is not complete and therefore not 100% compatible with &lt;span class="caps"&gt;MRI&lt;/span&gt;. But, there are some great things that we can do with IronRuby today. I gave four examples of how we can use IronRuby now. I didn’t have a demo for the testing though, I ran out of time.&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;Calling and using .NET objects from IronRuby&lt;/li&gt;
		&lt;li&gt;Replacing tests written in C# with tests written in IronRuby&lt;/li&gt;
		&lt;li&gt;Replacing application code written in C# with code in IronRuby&lt;/li&gt;
		&lt;li&gt;Provide Scripting in Application&lt;/li&gt;
	&lt;/ul&gt;
          &lt;img src="http://feeds.feedburner.com/~r/blowmage/~4/6kw0zGhfpsg" height="1" width="1"/&gt;</content><feedburner:origLink>http://blowmage.com/2008/3/10/ironruby-csharp-awesomeness</feedburner:origLink></entry><entry><title type="text">The Blizzard of 2008</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blowmage/~3/6HuDeQ4DbSE/blizzard" /><category term="personal" /><author><name>blowmage</name></author><updated>2008-03-04T15:46:14-08:00</updated><id>tag:blowmage.com,2008-02-14:81</id><content type="html">
            &lt;p&gt;Please excuse this non-geeky post, but today was harrowing and quite the tale. We came home from my grandmother’s funeral yesterday. We drove from Boise, ID to Cedar Hills, UT. The trip usually takes five hours, but yesterday it took nine due to major road work at Ogden, and a complete freeway closure north of Salt Lake City. My wife was scheduled to work the evening shift at the hospital that night, but the delays were too much and she didn’t make it in. Also, you can imagine how unhappy our two young girls were from sitting in the car for so long.&lt;/p&gt;


	&lt;p&gt;Today, we got the &lt;a href="http://www.ksl.com/?nid=148&amp;sid=2659200"&gt;worst winter storm&lt;/a&gt; I have ever seen. On the way home from appointments in Salt Lake City, my wife and two girls got stuck in huge traffic jam due to the snow storm on the road home. This was just a couple miles from my work, where I was not allowed to leave because of the storm. I became increasingly worried, even more when my wife tried to turn around and got the car stuck in a snow drift. For two hours my little family was stuck and the girls became increasingly stir crazy while strapped in their car seats. Fortunately someone was kind enough to gently nudge our car out of the drift and my family was able to find shelter at a nearby hotel.&lt;/p&gt;


	&lt;p&gt;My wife called work to tell them she couldn’t make it to work again. I was not able to get to them to watch our daughters in time for her to leave. And her scrubs were at home where she could not get them. And the freeway was so backed up it would take hours to get there, if at all. What are the odds of being unable to make it to work on consecutive nights for entirely different reasons?&lt;/p&gt;


	&lt;p&gt;Two hours later we were told that we could leave the plant heading away from the hotel where my wife and daughters was staying. I decided to take the chance an leave in hopes of reuniting with my family. The doors of the plant were iced over to the point you could not see through them.&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://farm3.static.flickr.com/2179/2264703038_b5c94e1cbd.jpg" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;Here is the view of the sidewalk out of the plant. The sidewalk is covered with little rolling waves of ice from one to two inches thick. Although it was slick there was enough traction to walk on it.&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://farm3.static.flickr.com/2086/2264703042_b852ccbffb.jpg" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;As I was walking to my truck I was battered with wind gusts upwards of 50 mph. It was hard to keep my feet under me as I crossed the parking lot. As I got to my truck, I scrapped an inch of ice off my side-view mirrors. I have never seen anything like it. Sitting in my truck, the wind battered it back and forth as if an angry mob was trying to get me to leave.&lt;/p&gt;


	&lt;p&gt;Visibility was low as plumes of snow and ice blew across the roads. The images captured by my iPhone do not capture the blowing snow and ice as well as I’d hoped.&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://farm3.static.flickr.com/2187/2264703048_322a03cd2d.jpg" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;I was eventually able to leave the plant traveling at ~5 mph. Even at that speed, I almost slid off the road twice and slid into the truck in front of my once.&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://farm3.static.flickr.com/2373/2263917683_39a09bc0c0.jpg" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;Eventually I was able to escape the worst of the storm, and then traveled across the valley, where I picked up some food, and then headed back towards the hotel. As I passed under the freeway I could see lines of cars and trucks just sitting there, like a very narrow parking lot. I was on the road three hours to get to the hotel. I was in bumper to bumper traffic most of the way. Eventually, I was able to break off to some back roads and arrived at the hotel.&lt;/p&gt;


	&lt;p&gt;The hotel is filled with people trying to get rooms. The lobby is filled with folks tired of waiting on the freeway and deciding to cut their losses. We overheard discussions of folks spending two, three, and four hours stranded on the freeway.&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://farm3.static.flickr.com/2386/2263917687_aaba983664.jpg" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;Since the girls were now asleep in the hotel room, and the lobby was so full, my wife and I decided to eat our dinner in the only other logical place: the bathroom.&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://farm3.static.flickr.com/2296/2263917689_46c481e7ac.jpg" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;The Winter Storm Advisory was supposed to end at 10:00 PM tonight, but has been extended to 5:00 AM tomorrow. Right now I’m not sure if I will be able to get back to work or even get home in the morning. But I’m very happy to be with my family and thankful we are all safe.&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; We made it home this morning and I made it in to work. I saw many abandoned cars and trucks off to the side of the road buried in snow. The road my family was stuck on was still closed this morning. I’ve heard &lt;a href="http://www.ksl.com/?nid=148&amp;sid=2661908"&gt;news reports&lt;/a&gt; that there were also elementary school buses stuck for hours on that road, and the children were eventually brought back to the school where they stayed the night.&lt;/p&gt;
          &lt;img src="http://feeds.feedburner.com/~r/blowmage/~4/6HuDeQ4DbSE" height="1" width="1"/&gt;</content><feedburner:origLink>http://blowmage.com/2008/2/14/blizzard</feedburner:origLink></entry><entry><title type="text">My Job Is Going To India</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blowmage/~3/ux6tc4XSnCY/my-job-is-going-to-india" /><category term="mjigti" /><author><name>blowmage</name></author><updated>2008-01-07T07:42:20-08:00</updated><id>tag:blowmage.com,2008-01-07:73</id><content type="html">
            &lt;p&gt;2008 is going to be a year of change for me. The company I work for, &lt;a href="http://www.imftech.com/"&gt;IM Flash&lt;/a&gt;, is parented by &lt;a href="http://www.intel.com/"&gt;Intel&lt;/a&gt; and &lt;a href="http://www.intel.com/"&gt;Micron&lt;/a&gt; (hence the “I” and the “M”). IM Flash makes &lt;span class="caps"&gt;NAND&lt;/span&gt;, which makes stuff like your iPod and iPhone go. (Yes, I’m aware there are non-Apple uses for &lt;span class="caps"&gt;NAND&lt;/span&gt;.) IM Flash is majority owned by Micron, and we rely on Micron’s infrastructure for our operations. This has been good for us, as we will have fully ramped a $3 billion fab in 18 months, and the next one will go even faster. But its not all candy and puppies: Micron isn’t as strong financially as it could be, and is in process of a major internal restructuring if its IT force. The end result is half of Micron’s IT is being offshored. Because we are technically a separate company, and in the midst of ramping multiple fabs, our jobs are somewhat more secure for now. For now.&lt;/p&gt;


	&lt;p&gt;(You can read more about my job in my previous post: &lt;a href="http://blowmage.com/2008/1/6/what-i-do"&gt;What I Do&lt;/a&gt;)&lt;/p&gt;


	&lt;p&gt;One of my New Year’s resolutions is to prepare myself for the change that I’m going to see this year. One of my favorite technical books that I’ve read in the past few years is &lt;a href="http://chadfowler.com/"&gt;Chad Fowler’s&lt;/a&gt; &lt;a href="http://pragmaticprogrammer.com/titles/mjwti/index.html"&gt;My Job Went to India (and all I got was this lousy book): 52 Ways to Save Your Job&lt;/a&gt;, which I just got back from a friend. I recently skimmed through it again, remembering all the ways that it challenged my assumptions over what I needed to do to move my career as a software developer forward. So I decided that I should take each of the 52 chapters over the course of 2008 and write a somewhat weekly post about each chapter’s advice and discuss what I currently do (or don’t do) and what I’ll try to do in the future.&lt;/p&gt;


	&lt;h3&gt;The Setup&lt;/h3&gt;


	&lt;p&gt;One of the things that has always stuck with me is the introduction in Chad’s book. In it, he shows that those workers in India aren’t so much stealing US jobs as much as they are trying to live the American dream. They want a better life, to take care of their families, and educate their children. They are also playing an important role in the global market for IT work, and they certainly aren’t to blame for jobs being offshored. In fact, in the book Chad makes the point that nobody is to blame for jobs being offshored. That is simply the way it is and the way it will continue. The point isn’t to fight for your current job, the point is to find new ways or transition to a job with a higher value add.&lt;/p&gt;


	&lt;p&gt;You can read the introduction to the book &lt;a href="http://media.pragprog.com/titles/mjwti/introduction.pdf"&gt;here&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;Chad’s book isn’t very big, but what it lacks in length it makes up for in density of ideas. The book is broken up into 4 sections:&lt;/p&gt;


	&lt;ol&gt;
	&lt;li&gt;&lt;strong&gt;Choose your market.&lt;/strong&gt; Pick the technologies and business domains you focus on consciously and deliberately. How do you balance risk and reward? How do supply and demand factor into the decision? &lt;/li&gt;
		&lt;li&gt;&lt;strong&gt;Invest in your product.&lt;/strong&gt; Your knowledge and skills are the corner-stone of your product. Properly investing in them is a critical part of making yourself marketable. Simply knowing how to program in Visual Basic isn�??t good enough anymore. What other skills might you need in the new economy? How can you compete with both your offshore and onshore rivals? &lt;/li&gt;
		&lt;li&gt;&lt;strong&gt;Execute.&lt;/strong&gt; Simply having employees with a strong set of skills doesn�??t pay off for a company. The employees have to deliver. How do you keep up the delivery pace without driving yourself into the dirt? How do you know you�??re delivering the right value for the company? &lt;/li&gt;
		&lt;li&gt;&lt;strong&gt;Market!&lt;/strong&gt; The best product in history won�??t get purchased if nobody knows it exists. How do you get find recognition in both your company and the industry as a whole without �??sucking up�???&lt;/li&gt;
	&lt;/ol&gt;


	&lt;h3&gt;The Series&lt;/h3&gt;


	&lt;p&gt;One thing I want to make clear is that I’m not upset about the prospects of losing my job. I’ve said many times that if the company thinks they can get a better deal from offshoring, then by all means let me know and I’ll find a new job. This series of posts will explore what I think about my career and what I do to move it along.&lt;/p&gt;


	&lt;p&gt;All these posts will be tagged with the tag “mjigti”, an acronym for “My Job Is Going To India”. You can read all the posts with this tag &lt;a href="http://blowmage.com/tags/mjigti"&gt;here&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;I know that this could sound like a huge open love letter to Chad, but its not. This is for me. If you really don’t like it you can probably create a feed minus the posts with the tag “mjigti” using Yahoo! Pipes or something. :)&lt;/p&gt;
          &lt;img src="http://feeds.feedburner.com/~r/blowmage/~4/ux6tc4XSnCY" height="1" width="1"/&gt;</content><feedburner:origLink>http://blowmage.com/2008/1/7/my-job-is-going-to-india</feedburner:origLink></entry><entry><title type="text">What I Do</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blowmage/~3/8CNG4LJrNVA/what-i-do" /><category term=".net" /><category term="agile" /><category term="alt.net" /><category term="community" /><category term="podcast" /><category term="ruby" /><author><name>blowmage</name></author><updated>2008-01-06T12:22:31-08:00</updated><id>tag:blowmage.com,2008-01-06:72</id><content type="html">
            &lt;p&gt;I don’t like talking about myself much, I’d rather talk about how to do stuff or what I think the best way to do said stuff is. But &lt;a href="http://www.chadmyers.com/"&gt;Chad Myers&lt;/a&gt; “tagged” me in his &lt;a href="http://www.lostechies.com/blogs/chad_myers/archive/2008/01/05/what-i-do-with-spoilers.aspx" title="with spoilers"&gt;What I do&lt;/a&gt; post. Its been so long since someone used the word “tag” outside of &lt;a href="http://en.wikipedia.org/wiki/Tag_%28metadata%29"&gt;metadata&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Folksonomy"&gt;folksonomies&lt;/a&gt; that it took me a while to realize he meant it like the schoolyard game tag.&lt;/p&gt;


	&lt;h3&gt;My Day Job&lt;/h3&gt;


	&lt;p&gt;During the day I spend my time at &lt;a href="http://www.imftech.com/"&gt;IM Flash&lt;/a&gt; where we make the &lt;span class="caps"&gt;NAND&lt;/span&gt; that makes your cell phones and mp3 players go. My title is “Software Engineer” and I work in the group that supports the engineers. We support a metric ton of systems that help the engineers keep track of the manufacturing process. Most of these systems involve schlepping data from one system to the other. We collect data from the tools, process the data, report on the data, move the data to centralized systems, report on that data again, etc… Some of our systems are 3rd party, but most are homegrown. I end up doing my fair share of Perl on Linux and Solaris, as well as WinForms and &lt;span class="caps"&gt;ASP&lt;/span&gt;.NET apps in C#. We also have a nice backlog of VB apps as well, but we aren’t much of a Java shop.&lt;/p&gt;


	&lt;p&gt;When I’m not helping to keep the ship running, I actually get to do a bit of development. I am also the site’s IT architecture oversight representative, although it probably isn’t as fancy as you’d think. I participate in a variety of groups, both on site and around the company. I run a fun little group called TechShare, where we meet weekly and watch interesting videos and screencasts to help us improve as developers. I am also the self-proclaimed Agile and Ruby evangelist, and I’m sure everyone is tired of hearing it from me. When I’m not providing support or new development, I generally try to help improve things as much as I can.&lt;/p&gt;


	&lt;h3&gt;My “Contribution”&lt;/h3&gt;


	&lt;p&gt;I don’t consider my time at &lt;a&gt;MountainWest Ruby, &lt;span class="caps"&gt;LLC&lt;/span&gt;&lt;/a&gt; a job, per se. I suppose I should as it is a real company, but I don’t take a salary and everything we do is to promote the Ruby language. MountainWest Ruby is the organization that hosts the &lt;a href="http://mtnwestrubyconf.org/"&gt;MountainWest RubyConf&lt;/a&gt;, which is coming up March 28-29. MountainWest Ruby is a fun thing to be a part of, as I get to meet and interact with alot of really interesting and smart people that I probably wouldn’t have the opportunity otherwise.&lt;/p&gt;


	&lt;p&gt;While we have a handful of folks involved with MountainWest Ruby, I think it would be fair to say I do the majority of the behing-the-scenes work. &lt;a href="http://on-ruby.blogspot.com/"&gt;Pat Eyler&lt;/a&gt; is the public face of the conference, and he and I work very closely to make sure we act responsibly toward the community. I like to think that the community has entrusted us with their money, so I am very conscious where we spend it. Some might say I’m too frugal, but we operate on a shoestring budget so I feel I need to be.&lt;/p&gt;


	&lt;p&gt;One thing I can say is that I love the Ruby community. It is by far the nicest and most giving online community I’ve ever been a part of, and I’m humbled that I get to be a part of that in some small way.&lt;/p&gt;


	&lt;h3&gt;My Night Job&lt;/h3&gt;


	&lt;p&gt;Forgive me for the shameless self-promotion, but I have been known to moonlight on Ruby, Rails, or .NET projects. My little one-man company is &lt;a href="http://humanecode.com/"&gt;HumaneCode&lt;/a&gt;. I’m not actively seeking work at the moment so the website is embarrassingly bare. I’m sure you’ll understand.&lt;/p&gt;


	&lt;h3&gt;Other Stuff&lt;/h3&gt;


	&lt;p&gt;I’ve got more going on as well. I do a podcast about Ruby called &lt;a href="http://rubiverse.com/"&gt;Rubiverse&lt;/a&gt; that is alot of fun. I try to be active in the &lt;a href="http://altdotnet.org/"&gt;&lt;span class="caps"&gt;ALT&lt;/span&gt;.NET&lt;/a&gt; community as well, and hope to grow a local &lt;a href="http://groups.google.com/group/utahaltnet"&gt;group&lt;/a&gt;.&lt;/p&gt;


	&lt;h3&gt;My Family&lt;/h3&gt;


	&lt;p&gt;My family is supremely important; I have a a wonderful wife and two beautiful little girls (with one in the oven). Without getting too personal, the past year has been hard for us. What I will say is the our trials have brought us even closer.&lt;/p&gt;


	&lt;p&gt;I know this list seems like alot of stuff, but it all pales in comparison to the importance of my family. My wife has been very gracious to allow me to follow my interests and take chances. Without her and the girls it would be meaningless.&lt;/p&gt;


	&lt;h3&gt;Who Next?&lt;/h3&gt;


	&lt;p&gt;It seems implicit in this &lt;a href="http://en.wikipedia.org/wiki/Meme"&gt;meme&lt;/a&gt; is to pass the pain along. Fortunately, there isn’t isn’t a set number I have to inflict, so I’ll just choose the two following.&lt;/p&gt;


	&lt;ol&gt;
	&lt;li&gt;&lt;a href="http://www.lukemelia.com/"&gt;Luke Melia&lt;/a&gt; – Because I’m curious about what he does next.&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://objo.com/"&gt;Joe O’Brien&lt;/a&gt; – Because I find his business fascinating and I want to know more.&lt;/li&gt;
	&lt;/ol&gt;
          &lt;img src="http://feeds.feedburner.com/~r/blowmage/~4/8CNG4LJrNVA" height="1" width="1"/&gt;</content><feedburner:origLink>http://blowmage.com/2008/1/6/what-i-do</feedburner:origLink></entry><entry><title type="text">A brief history of Ruby on .NET</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blowmage/~3/_uh4X8p3QBg/ruby-on-dotnet-history" /><category term=".net" /><category term="ironruby" /><category term="ruby" /><category term="ruby.net" /><author><name>blowmage</name></author><updated>2008-01-02T16:21:25-08:00</updated><id>tag:blowmage.com,2008-01-03:71</id><content type="html">
            &lt;p&gt;&lt;a href="http://www.iunknown.com/"&gt;John Lam&lt;/a&gt; recently
&lt;a href="http://www.iunknown.com/2008/01/ironruby-vs-rub.html"&gt;responded&lt;/a&gt; to 
a post by &lt;a href="http://mdavid.name/"&gt;M. David Peterson&lt;/a&gt; about the
&lt;a href="http://www.oreillynet.com/windows/blog/2008/01/rubynet_vs_ironruby_whats_the.html"&gt;
differences between Ruby.NET and IronRuby&lt;/a&gt;. A few months ago
&lt;a href="http://drnicwilliams.com/"&gt;Dr. Nic&lt;/a&gt; (inadvertently)
&lt;a href="http://drnicwilliams.com/2007/10/13/rubynet-goes-open-source/"&gt;made it 
seem&lt;/a&gt; like the two projects are at odds. Afterwards the
&lt;a href="http://softiesonrails.com/"&gt;Softies on Rails&lt;/a&gt; guys seemed to
&lt;a href="http://softiesonrails.com/2007/10/17/ruby-net-and-ironruby-are-open-sourced"&gt;
question Microsoft's interest in Ruby&lt;/a&gt; and were disappointed with Microsoft's 
&amp;quot;lack of support&amp;quot; for Ruby.NET. There seems to be some confusion about the relationship 
between IronRuby and Ruby.NET. Implicit in some online conversations about IronRuby 
and Ruby.NET is a distrust of Microsoft doing the right thing in regards to Ruby. 
I've read many statements that imply Microsoft is trying to kill Ruby.NET. I've 
also read that Microsoft is trying to kill Ruby! So for all those that haven't been 
following Ruby's adventures on Microsoft's .NET framework, here is a (very) brief 
history as I remember it. Corrections are welcome.&lt;/p&gt;

&lt;h3&gt;NETRuby&lt;/h3&gt;

&lt;p&gt;Actually, Ruby.NET wasn't the first Ruby implementation on .NET. Sure, there 
were Ruby to .NET bridges like &lt;a href="http://www.iunknown.com/"&gt;John Lam&lt;/a&gt;'s
&lt;a href="http://www.rubyclr.com/"&gt;RubyCLR&lt;/a&gt; and
&lt;a href="http://www.saltypickle.com/"&gt;SaltyPickle&lt;/a&gt;'s
&lt;a href="http://www.saltypickle.com/rubydotnet"&gt;Ruby/.NET Bridge&lt;/a&gt; before, but 
there was also an actual port of Ruby 1.6 to .NET by
&lt;a href="http://arton.hp.infoseek.co.jp/"&gt;arton&lt;/a&gt;. This project was called named
&lt;a href="http://www.geocities.co.jp/SiliconValley-PaloAlto/9251/ruby/nrb.html"&gt;NETRuby&lt;/a&gt; 
and it was a straight port of the Ruby C code to C# in 2001. I think I got it working 
on some small things, and I found the code pretty interesting. But the effort eventually 
died from lack of attention and/or need, as it was started and abandoned long before 
Rails was born and brought so much attention to the Ruby language.&lt;/p&gt;

&lt;h3&gt;The First IronRuby&lt;/h3&gt;

&lt;p&gt;Another early Ruby on .NET project was &lt;a href="http://www.wilcob.com/"&gt;Wilco 
Bauwer&lt;/a&gt;'s &lt;a href="http://www.wilcob.com/Wilco/IronRuby.aspx"&gt;IronRuby project&lt;/a&gt;. 
Wilco based his implementation on the IronPython implementation. Although the current
&lt;a href="http://www.ironruby.net/"&gt;IronRuby&lt;/a&gt; project shares the name, the two 
projects don't share any code. I don't believe Wilco ever publicly released the 
source code for his implementation. I do remember playing with the compiled version 
he released, but it was far from complete.&lt;/p&gt;

&lt;h3&gt;Ruby.NET&lt;/h3&gt;

&lt;p&gt;Around the time that Wilco was talking about his IronRuby implementation, the
&lt;a href="http://plas.fit.qut.edu.au/"&gt;Queensland University of Technology&lt;/a&gt; folks 
announced that they had received funding from Microsoft Research to implement
&lt;a href="http://plas.fit.qut.edu.au/Ruby.NET/"&gt;Ruby on the .NET Framework&lt;/a&gt;. I 
remember that Microsoft was just starting to show more interest in dynamic languages, 
due to the success of IronPython and the sudden and overwhelming emergence of Ruby 
(largely because of Rails).&lt;/p&gt;

&lt;p&gt;&lt;a href="http://rubydotnet.googlegroups.com/web/Home.htm"&gt;Ruby.NET&lt;/a&gt;'s runtime 
involves creating wrapper objects for the .NET objects to implement all the Ruby-ish 
features. This is a very common approach for implementing dynamic languages on a 
static language runtime. The early work from the Queensland guys resulted in code 
drops every six months or so. As the project has matured the releases became more 
frequent until the code was eventually put into a
&lt;a href="http://code.google.com/p/rubydotnetcompiler/"&gt;public subversion repository&lt;/a&gt; 
on Google's service.&lt;/p&gt;

&lt;h3&gt;The Current IronRuby&lt;/h3&gt;

&lt;p&gt;Microsoft's investment in Ruby.NET was rewarded when
&lt;a href="http://www.iunknown.com/"&gt;John Lam&lt;/a&gt; joined Microsoft to implement Ruby 
on the yet to be announced Dynamic Language Runtime (DLR). The DLR sits on top of 
the CLR and allows IronRuby to add Ruby-ish features to the .NET objects without 
creating proxies. The DLR also allows different dynamic languages to interoperate 
in the same way that languages such as C# and VB.NET can interoperate on the CLR.&lt;/p&gt;

&lt;p&gt;For legal reasons John's team can't look at the original C implementation of 
Ruby (you can listen to my &lt;a href="http://rubiverse.com/"&gt;Rubiverse&lt;/a&gt; podcast 
interview &lt;a href="http://rubiverse.com/podcasts/1-john-lam-on-ironruby"&gt;with John&lt;/a&gt; 
for the details to why this is), but was able to license and look at the Queensland 
implementation of Ruby.NET. John's team was also able to use parts of Ruby.NET to 
more quickly stand up IronRuby. Although it seems that the parts of Ruby.NET in 
IronRuby are scheduled to be replaced in order to provide better future integration 
with the Visual Studio IDE.&lt;/p&gt;

&lt;p&gt;So that's is. The efforts are dramatically different in their implementation, 
and address different needs. I see them both as complementary, and having a similar 
relationship as the one between &lt;a href="http://jruby.codehaus.org/"&gt;JRuby&lt;/a&gt; and
&lt;a href="http://xruby.com/"&gt;XRuby&lt;/a&gt;.&lt;/p&gt;
          &lt;img src="http://feeds.feedburner.com/~r/blowmage/~4/_uh4X8p3QBg" height="1" width="1"/&gt;</content><feedburner:origLink>http://blowmage.com/2008/1/3/ruby-on-dotnet-history</feedburner:origLink></entry><entry><title type="text">The Failure of Static Languages</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blowmage/~3/5EWGiPWXATc/static-languages-are-fail" /><category term=".net" /><category term="alt.net" /><category term="ironruby" /><category term="ruby" /><author><name>blowmage</name></author><updated>2007-12-18T21:54:46-08:00</updated><id>tag:blowmage.com,2007-12-19:61</id><content type="html">
            &lt;p&gt;So, &lt;a href="http://weblogs.asp.net/bleroy/"&gt;Bertrand Le Roy&lt;/a&gt; left a comment on my &lt;a href="http://blowmage.com/2007/12/18/the-rubification-of-csharp"&gt;previous post&lt;/a&gt; calling me out for saying, "static languages have failed". I think I need more space than the comment field to make a full reply, so I'll do it here with a sensational title to gain the maximum attention. ;)&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I usually enjoy reading your blog but wow. "Static languages have failed"? Just wow. Don't you think that viewpoint might be just a little myopic?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Like I said in my comment, I hope this view isn't myopic. The last 20+ years have been dominated by static languages like C++, Java, and C#. I believe we are in the midst of a dynamic language revolution and I expect the landscape to look dramatically different in 3 to 5 years. I'm talking about the entire IT landscape, not just the .NET or J2EE landscape (although they will look different as well).&lt;/p&gt;

&lt;p&gt;My point isn't that static languages aren't useful and won't continue to be used. But they aren't where I believe the majority of development will be done in the future. Just as you would build a departmental client app using VB instead of C++ 10 years ago, you will be using a dynamic language instead of a static language in 3-5 years.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Because they don't work for you or for the microcosm you're hanging out in doesn't mean it doesn't work for the rest of the world.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;My point is that static languages don't work for you! Creating an interface just to run a unit test is a sign (to me) of a weak language. The existence of so many design patterns and anti-patterns are also a sign (to me) of a weak language. There are and will be better languages that allow you to get your work done faster while being more maintainable.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Static languages have been and continue to be very successful. Maybe it would be a little more productive to recognize the merits of each side before making definitive judgements like this one.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I don't mean to take any thing away from static languages like C# and Java. Hell, I program in C# every single day. Well, every work day. And I certainly don't hate C#, but I don't love it like I love Ruby. I think I've been a good soldier in the static camp long enough to make up my own mind and voice my opinion. I don't do so out of ignorance.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It might also help the dynamic language world to recognize major advances in language design (which imo Linq is) so that they can incorporate similar concepts in their own favorite technology.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I know many folks have been excited by the prospect of using LINQ from IronRuby. But honestly I don't know how to take advantage of LINQ from IronRuby. If you have your local objects, you can already iterate and .map() or .collect() on them. And there are already ORM and data access libraries that will use a DSL or take a closure and query your data store. &lt;a href="http://onestepback.org/"&gt;Jim Weirich&lt;/a&gt; recently discussed building such a library at &lt;a href="http://rubyconf2007.confreaks.com/d1t1p2_advanced_ruby_class_design.html"&gt;RubyConf&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;LINQ looks to be very useful and a huge win while working in C# and VB.NET. But I don't need that in a dynamic language like Ruby because I already have those facilities. So I don't see LINQ as a major advance in language design.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;One thing that can be said from the C# team (which from our own microcosm looks very very far from "desperate") is that *they* know how to keep an eye on the other side and incorporate what looks interesting, while not compromising the integrity of the language.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I didn't mean to imply that the C# team is desperate, just that the language is trying hard to stay relevant amidst the dynamic language onslaught. There are alot of reasons why I'll do my best to stay on the .NET platform, but I can't say the same for C#. From the beginning the CLR was designed to support multiple languages, so I've always found the staunch defense of C# confusing. Particularly amongst the &lt;a href="http://altdotnet.org/"&gt;Alt.NET&lt;/a&gt; crowd, but that's a topic for a different post. :)&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In that respect, anonymous types capture an essential aspect of dynamic languages while remaining strongly-typed (and thus keeping IntelliSense working).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I think there is the perception that you can't get IntelliSense&amp;copy;&amp;trade; or performance with dynamic languages. You certainly can. We might not be there 100% just yet, but we will get there. &lt;a href="http://www.netbeans.org/"&gt;NetBeans&lt;/a&gt; and &lt;a href="http://www.activestate.com/Products/komodo_ide/"&gt;Komodo&lt;/a&gt; and &lt;a href="http://www.sapphiresteel.com/"&gt;Ruby in Steel&lt;/a&gt; are good examples of Ruby IDEs with autocomplete.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You might also want to consult the documentation for anonymous methods, which do capture surrounding local variables (since 2.0), which in my book is pretty much what a closure is.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Great point! Anonymous methods are definitely closer to closures than anonymous delegates. But the point I tried to make about anonymous delegates wasn't about local variables as parameters; it was about accessing private class variables. Once you replace the delegate you lose the ability to access private class variables.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Don't want to look aggressive or anything, sorry if I did, not my intention. Keep up the good work and the provocative thinking.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;No way man, I appreciate you wanting to engage in a discussion about this! There are a couple more points I want to make to clarify what I'm trying to say but didn't fit well in response to you comment.&lt;/p&gt;

&lt;p&gt;I say static languages have failed because the features we are looking for in future languages are at odds with static typing. For example, static languages achieve polymorphism through inheritance (or implementation of an interface) instead of duck-typing/composition/parametric polymorphism. So you have an explosion of interfaces when you want to test your code. But those interfaces aren't for reuse as much as they are for testing. They don't really help the reason your code exists, just your test cases. You end up with all that code cruft adding little value because static languages achieve polymorphism through tightly coupling implementations. Meanwhile Ruby promotes object composition over class inheritance.&lt;/p&gt;

&lt;p&gt;My problem with the Rubification of C# is that C# has incorporated some of the aspects of Ruby, but not the real power of Ruby. Its all sugar and no meat. OO in Ruby or Smalltalk is very different than OO in C# or Java. I've had many discussions where other developers have said they are a better C++ or Java or C# programmer because of the time they've spent with Ruby. That isn't because of Ruby's syntax, that is because of Ruby's fundamentally different understanding of objects.&lt;/p&gt;

&lt;p&gt;Am I right or am I wrong? Please let me know. You can either leave me a comment or send me &lt;a href="mailto:mike@blowmage.com?subject=You Suck! Static Languages ARE the Future!"&gt;hate&lt;/a&gt; (or &lt;a href="mailto:mike@blowmage.com?subject=You Rock! Static Languages are SO 2007!"&gt;fan&lt;/a&gt;) mail.&lt;/p&gt;
          &lt;img src="http://feeds.feedburner.com/~r/blowmage/~4/5EWGiPWXATc" height="1" width="1"/&gt;</content><feedburner:origLink>http://blowmage.com/2007/12/19/static-languages-are-fail</feedburner:origLink></entry><entry><title type="text">The Rubification of C#</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blowmage/~3/1dPS6kvoow0/the-rubification-of-csharp" /><category term=".net" /><category term="alt.net" /><category term="ironruby" /><category term="ruby" /><author><name>blowmage</name></author><updated>2007-12-17T20:47:03-08:00</updated><id>tag:blowmage.com,2007-12-18:58</id><content type="html">
            &lt;p&gt;&lt;a href="http://chadmyers.com/Blog/"&gt;Chad Myers&lt;/a&gt; gave me a nice little surprise by using my surname in his blog post &lt;a href="http://chadmyers.com/Blog/archive/2007/12/15/moore-on-the-anonymous-delegate-approach.aspx"&gt;"Moore on the Anonymous Delegate Approach"&lt;/a&gt; about an approach to make his statically-typed C# code more easily testable. I struggled with how best to respond because the subject of his code experiments really demonstrates some of the things I've been thinking about C#'s evolution for a while now. So while this isn't a direct response to his post, its something I've been wanting to say for a while now.&lt;/p&gt;

&lt;p&gt;Chad started out by showing how you can use anonymous delegates to encapsulate your logic, and then swap out the delegates in his test cases so he can verify the dependent objects work properly. So he is essentially swapping the implementation of the code his object has a reference to. The fly in the ointment is that only the original anonymous delegate can access all the internal data in his object, so once you swap out the object's original anonymous delegate, the object becomes ineffective. (Unless your logic is dead simple, like the kind you use when you are writing code demos.)&lt;/p&gt;

&lt;p&gt;The thing I really like about Chad's code is that he's getting really close to using anonymous delegates as closures, and I really love closures. I believe if Microsoft would (or could) add closures to the C# language (and idioms) that C# would be better for it. But closures aren't embraced by C#. I understand that he is finding new ways to solve the testability problem with static languages, and while I enjoy his ingenuity, I'm starting to think that C# is moving too far from what it is. My concern is that as C# tries to be all things to all people, it simply stops being as useful.&lt;/p&gt;

&lt;p&gt;Coincidentally, Tim Bray posted his thoughts on &lt;a href="http://www.tbray.org/ongoing/When/200x/2007/12/16/On-Closures"&gt;adding closures to Java&lt;/a&gt; yesterday, and he said many of the things I've been thinking about in regards to C# and Ruby. The only caveat I'd make on applying Tim's thoughts to C# and .NET is that Java Generics != .NET Generics. Essentially, C# is an 80% language, and I'm totally okay with it. Ruby is also an 80% language, although a much different 80%. Making C#'s 80% overlap overlap Ruby's 80% as much as possible seems kinda wrong.&lt;/p&gt;

&lt;p&gt;Tim's favored approach to improving Java is to work on a multi-language VM, not the core language itself. .NET is already ahead because it has facilities for interoperating multiple languages. Therefore I don't think we should focus on improving C#, but we should start focusing on using the right tool for the right job; meaning the right language. Don't get me wrong, I appreciate the fact that C# is taking on many Rubyisms in an effort to improve. But C# will never be Ruby, and really it never should. My hopes are that the DLR enables C# and IronRuby to not just co-exist but integrate well.&lt;/p&gt;

&lt;p&gt;In &lt;a href="http://channel9.msdn.com/ShowPost.aspx?PostID=350187"&gt;this Channel9 video&lt;/a&gt; &lt;a href="http://channel9.msdn.com/ShowPost.aspx?PostID=350187"&gt;Robert Martin&lt;/a&gt; and &lt;a href="http://chadfowler.com/"&gt;Chad Fowler&lt;/a&gt; discuss dynamic vs. static languages at JAOO 2007. You should &lt;a href="http://channel9.msdn.com/ShowPost.aspx?PostID=350187"&gt;watch this video now&lt;/a&gt;. In it, Uncle Bob was asked if he was excited about the new functional programming features of C#; specifically LINQ. His response? "I'm about as excited about that as I am about Fortran 95." His point was that by the time the new Fortran was released he had already moved on and it was no longer relevant to him. That is certainly how I feel about C#; the more features they add, the more desperate it looks, and the less I feel like investing myself in it.&lt;/p&gt;

&lt;p&gt;Static languages have failed. They aren't dead, but they aren't the future. You can only fight a language so long before its time to move on.&lt;/p&gt;
          &lt;img src="http://feeds.feedburner.com/~r/blowmage/~4/1dPS6kvoow0" height="1" width="1"/&gt;</content><feedburner:origLink>http://blowmage.com/2007/12/18/the-rubification-of-csharp</feedburner:origLink></entry><entry><title type="text">Why the kids don't like the RSS</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blowmage/~3/erxWJd2mHDU/social-networks-suck" /><category term="web 2.0" /><author><name>blowmage</name></author><updated>2007-10-20T13:06:16-07:00</updated><id>tag:blowmage.com,2007-10-20:47</id><content type="html">
            &lt;p&gt;A couple days ago Coté asked &lt;a href="http://twitter.com/cote/statuses/346353002"&gt;"Is Web 2.0 the middle-agers web?"&lt;/a&gt; and today he asks if &lt;a href="http://www.redmonk.com/cote/2007/10/20/do-the-kids-like-the-rss/"&gt;the kids like the RSS&lt;/a&gt;. The answer is obviously no; kids think blogs and RSS aren't a big deal. Not to say that blogs and RSS aren't useful or of value; just that their technical details aren't important to the kids and their damn rock and roll music. I think that blogs, RSS, and to an extent even twitter succeed because they are geek tools.&lt;/p&gt;

&lt;p&gt;Facebook and MySpace have found success by making the process of creating and consuming blogs and RSS content approachable by the vast sea of non-geek users on the Interweb. They, and other social networks of their ilk, have taken our awesome geek ideas and packaged them up in a seamless... package. Well, maybe not seamless, but they hide most if not all of the complexity and apparently by doing so have created &lt;em&gt;billions&lt;/em&gt; of dollars of value.&lt;/p&gt;

&lt;p&gt;Apparently value is added because those punk kids on MySpace don't want the complexity of setting up NetNewsWire or Google Reader with their favorite feeds. Or, they have no idea what I just said and are incapable of doing so. They just want to go to a site, any site, and see what their friends are doing. And make the Internet a little bit uglier. Yeah, it doesn't make much sense to me either but apparently the unwashed masses love it.&lt;/p&gt;

&lt;p&gt;I like the prospects of using Facebook's platform to build apps and make money, but I don't personally like the idea of using &lt;a href="http://www.facebook.com/people/Mike_Moore/582561201"&gt;Facebook&lt;/a&gt;. And I can't stand &lt;a href="http://www.myspace.com/blowmage"&gt;MySpace&lt;/a&gt;. I'm more lenient about &lt;a href="http://www.linkedin.com/in/mikemoore"&gt;LinkedIn&lt;/a&gt;, but I think that is because I have delusions of actually getting work from it... some day... eventually. The reason I don't like them is because they feel restrictive, and don't work they way I want them to work. But I'm a geek and like all self-respecting geeks I have a strong opinion of how the world &lt;em&gt;should&lt;/em&gt; work. And so far the social network apps just haven't done it for me.&lt;/p&gt;

&lt;p&gt;I like &lt;a href="http://twitter.com/blowmage"&gt;twitter&lt;/a&gt; and I like &lt;a href="http://del.icio.us/blowmage"&gt;del.icio.us&lt;/a&gt; and I like &lt;a href="http://www.flickr.com/photos/blowmage/"&gt;Flickr&lt;/a&gt;. I like the fact that &lt;a href="http://blowmage.com/"&gt;blowmage.com&lt;/a&gt; is the central hub for my online presence. I like keeping track with people through their blogs, and having public discussions on mailing lists. Maybe if I were 20 years younger I'd think differently, but what the hell do those whippersnapper know?&lt;/p&gt;
          &lt;img src="http://feeds.feedburner.com/~r/blowmage/~4/erxWJd2mHDU" height="1" width="1"/&gt;</content><feedburner:origLink>http://blowmage.com/2007/10/20/social-networks-suck</feedburner:origLink></entry><entry><title type="text">Getting RubyGems to play nice at work</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blowmage/~3/4UAAYVPS3tE/rubygems-at-work" /><category term="ruby" /><category term="rubygems" /><author><name>blowmage</name></author><updated>2007-12-17T10:54:05-08:00</updated><id>tag:blowmage.com,2007-10-18:46</id><content type="html">
            &lt;p&gt;At work I'm on Windows and behind a proxy server. I recently wiped my workstation and started over. After I installed Ruby I found the gems command not working, again. The reason is that my proxy server requires a username and password, and open-uri doesn't pass them. (Supposedly because keeping your username and password in an environment variable isn't secure, but at work I don't care as much about apps snooping my environment variables.)&lt;/p&gt;

&lt;p&gt;To get things working I had to hack up open-uri a bit.  So I found the following code in &lt;code&gt;C:\ruby\lib\ruby\1.8\open-uri.rb&lt;/code&gt;&lt;/p&gt;

&lt;pre class="textmate-source ruby_blue"&gt;&lt;span class="source source_ruby"&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;net/http&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;
  klass &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;Net&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_other punctuation_separator_other_ruby"&gt;::&lt;/span&gt;&lt;span class="variable variable_other variable_other_constant variable_other_constant_ruby"&gt;HTTP&lt;/span&gt;
  &lt;span class="keyword keyword_control keyword_control_ruby"&gt;if&lt;/span&gt; &lt;span class="support support_class support_class_ruby"&gt;URI&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_other punctuation_separator_other_ruby"&gt;::&lt;/span&gt;&lt;span class="variable variable_other variable_other_constant variable_other_constant_ruby"&gt;HTTP&lt;/span&gt; &lt;span class="keyword keyword_operator keyword_operator_comparison keyword_operator_comparison_ruby"&gt;===&lt;/span&gt; target
&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; HTTP or HTTPS
&lt;/span&gt;    &lt;span class="keyword keyword_control keyword_control_ruby"&gt;if&lt;/span&gt; proxy
      klass &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;Net&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_other punctuation_separator_other_ruby"&gt;::&lt;/span&gt;&lt;span class="support support_class support_class_ruby"&gt;HTTP&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_other punctuation_separator_other_ruby"&gt;::&lt;/span&gt;&lt;span class="variable variable_other variable_other_constant variable_other_constant_ruby"&gt;Proxy&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt; proxy&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;host&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; proxy&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;port&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;)&lt;/span&gt;
    &lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;And I make the following change:&lt;/p&gt;

&lt;pre class="textmate-source ruby_blue"&gt;&lt;span class="source source_ruby"&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;net/http&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;
  klass &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;Net&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_other punctuation_separator_other_ruby"&gt;::&lt;/span&gt;&lt;span class="variable variable_other variable_other_constant variable_other_constant_ruby"&gt;HTTP&lt;/span&gt;
  &lt;span class="keyword keyword_control keyword_control_ruby"&gt;if&lt;/span&gt; &lt;span class="support support_class support_class_ruby"&gt;URI&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_other punctuation_separator_other_ruby"&gt;::&lt;/span&gt;&lt;span class="variable variable_other variable_other_constant variable_other_constant_ruby"&gt;HTTP&lt;/span&gt; &lt;span class="keyword keyword_operator keyword_operator_comparison keyword_operator_comparison_ruby"&gt;===&lt;/span&gt; target
&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; HTTP or HTTPS
&lt;/span&gt;    &lt;span class="keyword keyword_control keyword_control_ruby"&gt;if&lt;/span&gt; proxy
&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; Add proxy user and password to work with the proxy server. 
&lt;/span&gt;      klass &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;Net&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_other punctuation_separator_other_ruby"&gt;::&lt;/span&gt;&lt;span class="support support_class support_class_ruby"&gt;HTTP&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_other punctuation_separator_other_ruby"&gt;::&lt;/span&gt;&lt;span class="variable variable_other variable_other_constant variable_other_constant_ruby"&gt;Proxy&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;proxy&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;host&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; proxy&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;port&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; proxy&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_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; proxy&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;password&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;)&lt;/span&gt;
    &lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Then I create the &lt;code&gt;http_proxy&lt;/code&gt; environment variable with the value of &lt;code&gt;http://blowmage:s3cr3t@proxy:8080&lt;/code&gt; and I'm good to go. Well, I have to log off and log back in for Windows to find and RubyGems to use the new environment variable. Oh, and be sure to create it as a user variable and not a system variable. :)&lt;/p&gt;
          &lt;img src="http://feeds.feedburner.com/~r/blowmage/~4/4UAAYVPS3tE" height="1" width="1"/&gt;</content><feedburner:origLink>http://blowmage.com/2007/10/18/rubygems-at-work</feedburner:origLink></entry><entry><title type="text">Ruby Blue Visual Studio Theme</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blowmage/~3/hS_o3yeUTRU/ruby-blue-visual-studio-theme" /><category term=".net" /><category term="theme" /><author><name>blowmage</name></author><updated>2007-10-12T22:49:04-07:00</updated><id>tag:blowmage.com,2007-10-10:35</id><content type="html">
            &lt;p&gt;Now that I'm blogging again, and I've had a resurgence of .NET related posts, I thought I'd add to a meme I saw going around earlier this summer. First John Lam posted his &lt;a href="http://www.iunknown.com/2007/06/vibrant_ink_vis.html"&gt;Vibrant Ink&lt;/a&gt; theme for Visual Studio, then I saw Tomas Restrepo post his &lt;a href="http://www.winterdom.com/weblog/2007/09/11/NightingaleAVS2005ColorScheme.aspx"&gt;Nightingale&lt;/a&gt; theme.&lt;/p&gt;

&lt;p&gt;I've always been a fan of John Long's &lt;a href="http://wiseheartdesign.com/2006/3/11/ruby-blue-textmate-theme/"&gt;Ruby Blue TextMate&lt;/a&gt; theme. So I created my own Visual Studio theme (including the Monaco font) a long time ago and thought I should &lt;a href="http://blowmage.com/assets/2007/10/10/RubyBlueTheme.zip"&gt;share it here&lt;/a&gt;. Enjoy.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blowmage.com/assets/2007/10/10/RubyBlueTheme.png"&gt;&lt;img src="http://blowmage.com/assets/2007/10/10/RubyBlueThemeSmall.png" /&gt;&lt;/a&gt;&lt;/p&gt;
          &lt;img src="http://feeds.feedburner.com/~r/blowmage/~4/hS_o3yeUTRU" height="1" width="1"/&gt;</content><feedburner:origLink>http://blowmage.com/2007/10/10/ruby-blue-visual-studio-theme</feedburner:origLink></entry><entry><title type="text">Will we ever get IronRuby on Rails?</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blowmage/~3/75NM0wPN1lQ/ironruby-on-rails" /><category term=".net" /><category term="altnetconf" /><category term="ironruby" /><category term="rails" /><category term="ruby" /><author><name>blowmage</name></author><updated>2007-10-12T22:48:42-07:00</updated><id>tag:blowmage.com,2007-10-10:34</id><content type="html">
            &lt;p&gt;Last weekend the ALT.NET Conf I had a couple opportunities to plead my case for Microsoft to embrace the Ruby on Rails framework and better enable it on IIS. I believe IronRuby will eventually run Rails, and I believe when it does the community will implement whatever hooks are required to run Rails using the DLR on IIS. But I want more. I want Microsoft to stand behind Rails and encourage its use. I want an "official" deployment story for Rails using IronRuby and IIS like the one Sun has with JRuby. I was able to discuss this with Scott Guthrie himself at the end of Scott Hanselman's DLR/MVC session, but I don't think I changed his mind at all. Sorry guys.&lt;/p&gt;

&lt;p&gt;Half of the resistance seemed to be that Rails was too much of a fad and a moving target. I heard ScottGu say on a couple of occasions that prototype.js was really hot last year, but this year everyone is using jQuery. I also heard him say that last year everyone was all excited about RJS, but this year nobody is actually using it. The implication seemed to be that the Rails community couldn't make up its mind. But the reality is that the Rails community is having a conversation about how to build web apps better and it seems like Microsoft is either ignoring the conversation or blissfully ignorant of it. Neither is the case, obviously; but Microsoft has yet to join the conversation. In talking with ScottGu it became apparent to me exactly how well tuned in he is. He has obviously talked to enough Rails guys to have satisfied himself that Microsoft is making informed decisions.&lt;/p&gt;

&lt;p&gt;The other half of the resistance to official support for "IronRails" is the giant mutex lock hanging around Rails' neck. The implication with this one was that as soon as the Rails team fixes the threading model, then Microsoft can have something to work with to get a performant Rails on IIS. I wish I had a good answer to this. The JRuby guys appear to be working hard on improving performance of Rails on JRuby, and having success. Can something similar be done for IronRuby on IIS?&lt;/p&gt;

&lt;p&gt;The third half of the resistance to Rails was that the Rails community is simply not interested in running on Windows in any meaningful way. Its been historically hard to get support from the community for the SQL Server adapter in Rails, and there has been very little activity on getting Rails running on the new FastCGI ISAPI filter on IIS. I don't have a good answer for these things either. Personally, I don't have permissions to the web servers at my work; so I can't get FastCGI on the server because it isn't on the roadmap. But this is exactly why I want support via the DLR; so I don't have to have admin access to the server to deploy a Rails app because its all just .NET.&lt;/p&gt;

&lt;p&gt;I disagree with ScottGu's view was that the Rails community isn't committed to running on Windows. I don't think that is it exactly; I think the Rails community isn't committed to running on IIS. Deploying Rails on IIS is more than just FastCGI; you also need a mod_rewrite replacement and there doesn't appear to be any free solution for that. Simply put, its too painful to deploy on IIS and its much easier to deploy on Apache. Rails devs are usually pragmatic folks, and will go with a working solution.&lt;/p&gt;

&lt;p&gt;But personally, I really want to build Rails apps. And I'd hate to have to not be able to do that on Windows and .NET. I have very high hopes for the new ASP.NET MVC framework, but I'd also like a commitment from Microsoft to the Rails community similar to the commitment made to the Ruby community. And honestly, I think it would be in their best interest long term.&lt;/p&gt;
          &lt;img src="http://feeds.feedburner.com/~r/blowmage/~4/75NM0wPN1lQ" height="1" width="1"/&gt;</content><feedburner:origLink>http://blowmage.com/2007/10/10/ironruby-on-rails</feedburner:origLink></entry><entry><title type="text">ALT.NET Conf: Day 3</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blowmage/~3/i58jCiGjZ80/altnetconf-day-3" /><category term=".net" /><category term="alt.net" /><category term="altnetconf" /><category term="community" /><author><name>blowmage</name></author><updated>2007-10-12T22:47:39-07:00</updated><id>tag:blowmage.com,2007-10-08:31</id><content type="html">
            &lt;p&gt;Today was abbreviated with only two sessions this morning and then a combined closing session. I had a late start (again) this morning, and missed the opening comments (again). I know this makes me seem like the kinda guy who always sleeps in (and the guys I work with would definitely agree with that characterization) but I want to point out that a) I was &lt;em&gt;very&lt;/em&gt; sleep deprived going into this weekend, and b) conferences like this are physically draining. There is so much mental engagement that it really does fatigue you physically. Really.&lt;/p&gt;

&lt;p&gt;The first session I attended was about Mono. I haven't looked at Mono in years, and I was impressed with what I saw. The &lt;a href="http://mono-project.com/MoMA"&gt;Mono Migration Analyzer&lt;/a&gt; app (MoMA) was really cool. It essentially inspects your .NET *.exe and *.dll files and identifies what calls used are not available on Mono. This is a great idea, and apparently Mono's compatibility was improved by the real world metrics collected through the tool.&lt;/p&gt;

&lt;p&gt;I cut the session a bit short to catch up with my family, and when I returned the session had migrated next door to a discussion on why the MSDN magazine sucks and how to market the ALT.NET message. I don't read the MSDN magazine (but I will if someone sends me a free subscription), so I don't know if it sucks or not and didn't have much to add. However, I think its a bit premature to focus so much on online community building and marketing. I kinda like ALT.NET being undefinable and using guerilla marketing efforts to build awareness of its ambiguity. It just seems more authentic to me that way. Also, I don't see a message well defined enough to actively market. After all the current message is basically, "do what works and don't be afraid to look to other communities to see what works there".&lt;/p&gt;

&lt;p&gt;The mid morning session was the assigned slot for my proposed "Dynamic Languages on the CLR" session. Last night Scott Bellware suggested that what folks would really benefit from was a real life Ruby on Rails demo using test first with RSpec, so I changed the focus of the session to "Ruby on Rails Demonstration". Unfortunately Scott Bellware bailed on me (he had a scheduling conflict) and I recruited &lt;a href="http://lukemelia.com/"&gt;Luke Melia&lt;/a&gt; to pair with me for the session. Scott Hanselman attended and he started a really good discussion before we started writing code. There seemed to be alot of folks who either tried Rails, or knew someone who tried Rails, and were let down by the experience. There was this perception that Rails is *so* cool that you don't have to understand what is going on under the hood. This is true for very simple, golden path apps; but very untrue for most real-world apps. Like anything in life, you get out of Rails what you put into it.&lt;/p&gt;

&lt;p&gt;The Rails session seemed to go well and I had a couple folks thank me for showing them the approach Rails guys take to solve errors when coding. I really like live coding demonstrations where you don't go in with a scripted plan. For instance, The video of the &lt;a href="http://mtnwestrubyconf2007.confreaks.com/session10.html"&gt;Jamis Buck and Marcel Molina, Jr. session&lt;/a&gt; at the &lt;a href="http://mtnwestruby.org/"&gt;MountainWest RubyConf&lt;/a&gt; is by far the most downloaded session of the conference. I hope I continue to see more and more of those types of sessions at future conferences.&lt;/p&gt;

&lt;p&gt;After that all conference attendees poured into one room and one by one we all made comments about what we got from the experience. This was incredibly positive and was a great way to close the conference. This conference wasn't so much about technology as it was focused on the individual. I was happy to be a part of it and I look forward to more gatherings and communications about the ALT.NET ideals, even if it is a big ball of mud at the moment. :)&lt;/p&gt;
          &lt;img src="http://feeds.feedburner.com/~r/blowmage/~4/i58jCiGjZ80" height="1" width="1"/&gt;</content><feedburner:origLink>http://blowmage.com/2007/10/8/altnetconf-day-3</feedburner:origLink></entry></feed>
