<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Sarah Mei &#187; ruby</title>
	<atom:link href="http://www.sarahmei.com/blog/tag/ruby/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.sarahmei.com/blog</link>
	<description></description>
	<lastBuildDate>Sun, 22 Jan 2012 20:16:25 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>CruiseControl.rb and RubyGems 1.5.2</title>
		<link>http://www.sarahmei.com/blog/2011/02/26/cruisecontrol-rb-and-rubygems-1-5-2/</link>
		<comments>http://www.sarahmei.com/blog/2011/02/26/cruisecontrol-rb-and-rubygems-1-5-2/#comments</comments>
		<pubDate>Sat, 26 Feb 2011 18:57:32 +0000</pubDate>
		<dc:creator>sarahmei</dc:creator>
				<category><![CDATA[ruby]]></category>
		<category><![CDATA[bundler]]></category>
		<category><![CDATA[ccrb]]></category>
		<category><![CDATA[diaspora]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[rails2]]></category>
		<category><![CDATA[rails3]]></category>
		<category><![CDATA[rubygems]]></category>

		<guid isPermaLink="false">http://www.sarahmei.com/blog/?p=931</guid>
		<description><![CDATA[Diaspora uses CruiseControl.rb to run our continuous integration server. CC.rb is on Rails 2.3, but the applications it&#8217;s building are on Rails 3, which means I occasionally run into &#8230; weirdness. Last week, for example, I wanted to speed up our builds by upgrading Bundler to 1.0.10 and RubyGems to 1.5.2. Because of the new [...]]]></description>
			<content:encoded><![CDATA[<p>Diaspora uses <a href="https://github.com/thoughtworks/cruisecontrol.rb" target="_blank">CruiseControl.rb</a> to run our <a href="http://ci.joindiaspora.com" target="_blank">continuous integration server</a>. CC.rb is on Rails 2.3, but the applications it&#8217;s building are on Rails 3, which means I occasionally run into &#8230; weirdness.</p>
<p>Last week, for example, I wanted to speed up our builds by upgrading <a href="http://gembundler.com/" target="_blank">Bundler</a> to 1.0.10 and <a href="http://rubygems.org/" target="_blank">RubyGems</a> to 1.5.2. Because of the new partial caching of the dependency graph, the upgrades shaved two whole minutes off the build locally, and I wanted to get that on CI.<br />
<span id="more-931"></span><br />
Trouble is, once I did the upgrades, I got this upon restarting CC.rb:</p>
<p><script src="https://gist.github.com/845478.js?file=gistfile1.eclass"></script></p>
<p>It turns out that older versions of Rails 2.3 <a href="http://www.redmine.org/issues/7516" target="_blank">aren&#8217;t compatible</a> with the new version of RubyGems. To fix this, I added the following to CC.rb&#8217;s <code>config/environment.rb</code>, between the definition of <code>ABSOLUTE_RAILS_ROOT</code> and the <code>Rails::Initializer</code> block.</p>
<p><script src="https://gist.github.com/845481.js?file=gistfile1.rb"></script> </p>
<p>Both the 1.8 and 1.9 builds are now about 2 minutes faster which is awesome. Highly recommend the upgrades.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sarahmei.com/blog/2011/02/26/cruisecontrol-rb-and-rubygems-1-5-2/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Speak Ruby in Japanese</title>
		<link>http://www.sarahmei.com/blog/2010/09/04/speak-ruby-in-japanese/</link>
		<comments>http://www.sarahmei.com/blog/2010/09/04/speak-ruby-in-japanese/#comments</comments>
		<pubDate>Sat, 04 Sep 2010 21:59:32 +0000</pubDate>
		<dc:creator>sarahmei</dc:creator>
				<category><![CDATA[ruby]]></category>
		<category><![CDATA[japan]]></category>
		<category><![CDATA[japanese]]></category>
		<category><![CDATA[language]]></category>
		<category><![CDATA[pairprogramming]]></category>
		<category><![CDATA[rubykaigi]]></category>

		<guid isPermaLink="false">http://www.sarahmei.com/blog/?p=678</guid>
		<description><![CDATA[I&#8217;ve studied Japanese on and off for more than ten years &#8211; mostly &#8220;off.&#8221; I took a year of language when I was in college, but since then it&#8217;s just been periodic classes at Soko Gakuen in San Francisco. I managed to pass the JLPT level 3 a few years ago, so in Japan last [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve studied Japanese on and off for more than ten years &#8211; mostly &#8220;off.&#8221; I took a year of language when I was in college, but since then it&#8217;s just been periodic classes at <a href="http://sokogakuen.org/" target="_blank">Soko Gakuen</a> in San Francisco.</p>
<p>I managed to pass the JLPT level 3 a few years ago, so in Japan last month, I was decent at ordering food and navigating the subway. But I quickly discovered that I couldn&#8217;t really talk to another programmer. None of my classes even taught me how to say &#8220;programmer,&#8221; let alone &#8220;code,&#8221; &#8220;object,&#8221; &#8220;method,&#8221; &#8220;development environment&#8221;&#8230;<span id="more-678"></span></p>
<div id="attachment_726" class="wp-caption alignleft" style="width: 310px"><a href="http://www.sarahmei.com/blog/wp-content/uploads/2010/09/pair-programming-1.jpg"><img class="size-medium wp-image-726" title="pair-programming-1" src="http://www.sarahmei.com/blog/wp-content/uploads/2010/09/pair-programming-1-300x223.jpg" alt="" width="300" height="223" /></a><p class="wp-caption-text">@sarahmei, @t_wada, @sakuro (photo by Lee Lundrigan)</p></div>
<p>Dictionaries would normally be my next recourse, but it&#8217;s pretty hard to look this stuff up. As in the US, programmer culture in Japan has its own slang. But I had a chance to pair with some Japanese devs at the Pair Programming Cultural Exchange that <a href="http://twitter.com/t_wada" target="_blank">@t_wada</a> and I ran at RubyKaigi (see left), so I picked up a little bit. And since I&#8217;ve been back, I&#8217;ve been translating technical articles for fun. (What else would you do on a 12-hour flight?)</p>
<p>As a result, a lot of this list comes from my notes. I also added words I found in <a href="http://twitter.com/#search?q=rubykaigi" target="_blank">the RubyKaigi Twitter stream</a>, <a href="http://www.ultrasaurus.com/sarahblog/2009/12/japanese-geek-speak/">Sarah Allen&#8217;s blog</a>, and <a href="http://www.mightyverse.com/phrase_lists/pair-programing" target="_blank">Mightyverse&#8217;s pair programming phrases</a>, among other locations. Any errors are, of course, my own.</p>
<p>The list is short &#8211; there are many more things I&#8217;d like to know how to say. And I guessed at the right katakana for some of the loan words. So: <strong>please send additions and corrections</strong>[<a href="#thanks">*</a>], kkthx! I&#8217;ll add anything vaguely technical to the list.</p>
<p>I hope it provokes more cross-language Ruby discussion.</p>
<table border="0">
<tbody>
<tr>
<th>English</th>
<th>Kanji</th>
<th>Kana</th>
<th>Romaji</th>
</tr>
<tr>
<td>block</td>
<td></td>
<td>ブロック</td>
<td>burokku</td>
</tr>
<tr>
<td>blog</td>
<td></td>
<td>ブログ</td>
<td>burogu</td>
</tr>
<tr>
<td>cache</td>
<td></td>
<td>キャッシュ</td>
<td>kyasshu</td>
</tr>
<tr>
<td>character</td>
<td>文字</td>
<td>もじ</td>
<td>moji</td>
</tr>
<tr>
<td>code</td>
<td></td>
<td>コード</td>
<td>koudo</td>
</tr>
<tr>
<td>core library</td>
<td></td>
<td>コアライブラリ</td>
<td>koa raiburari</td>
</tr>
<tr>
<td>developer</td>
<td>開発者</td>
<td>かいはつしゃ</td>
<td>kaihatsusha</td>
</tr>
<tr>
<td>development</td>
<td>開発</td>
<td>かいはつ</td>
<td>kaihatsu</td>
</tr>
<tr>
<td>development environment</td>
<td>開発環境</td>
<td>かいはつかんきょう</td>
<td>kaihatsu kankyou</td>
</tr>
<tr>
<td>diary (often used in place of blog)</td>
<td>日記</td>
<td>にっき</td>
<td>nikki</td>
</tr>
<tr>
<td>digit</td>
<td>数字</td>
<td>すうじ</td>
<td>suuji</td>
</tr>
<tr>
<td>dot (as in foo.bar)</td>
<td></td>
<td>ドット</td>
<td>dotto</td>
</tr>
<tr>
<td>expected failure (of a test)</td>
<td>予想通りの失敗</td>
<td>よそうどおりのしっぱい</td>
<td>yosoudoori no shippai</td>
</tr>
<tr>
<td>feature</td>
<td>機能</td>
<td>きのう</td>
<td>kinou</td>
</tr>
<tr>
<td>flexible</td>
<td>柔軟</td>
<td>じゅうなん</td>
<td>juunan</td>
</tr>
<tr>
<td>full-width (as in character)</td>
<td>全角</td>
<td>ぜんかく</td>
<td>zenkaku</td>
</tr>
<tr>
<td>global (as in variable)</td>
<td></td>
<td>グローバル</td>
<td>guroubaru</td>
</tr>
<tr>
<td>hashrocket</td>
<td></td>
<td>ハッシュロ ケット</td>
<td>hasshuroketto</td>
</tr>
<tr>
<td>implementation</td>
<td>実装</td>
<td>じっそう</td>
<td>jissou</td>
</tr>
<tr>
<td>internal structure</td>
<td>内部構造</td>
<td>ないぶこうぞう</td>
<td>naibu kouzou</td>
</tr>
<tr>
<td>latest</td>
<td>最新</td>
<td>さいしん</td>
<td>saishin</td>
</tr>
<tr>
<td>method (on an object)</td>
<td></td>
<td>メソッド</td>
<td>mesoddo</td>
</tr>
<tr>
<td>modification</td>
<td>変更</td>
<td>へんこう</td>
<td>henkou</td>
</tr>
<tr>
<td>multibyte (as in character)</td>
<td>多バイト</td>
<td>たバイト</td>
<td>tabaito</td>
</tr>
<tr>
<td>multibyte (as in character)</td>
<td></td>
<td>マルチバイト</td>
<td>maruchibaito</td>
</tr>
<tr>
<td>object</td>
<td></td>
<td>オブジェクト</td>
<td>obujekuto</td>
</tr>
<tr>
<td>plugin</td>
<td></td>
<td>プラグイン</td>
<td>puraguin</td>
</tr>
<tr>
<td>programmer</td>
<td></td>
<td>プローグラーマ</td>
<td>purouguraama</td>
</tr>
<tr>
<td>refactoring</td>
<td></td>
<td>リファクタリング</td>
<td>rifakutaringu</td>
</tr>
<tr>
<td>refactoring</td>
<td>改善</td>
<td>かいぜん</td>
<td>kaizen</td>
</tr>
<tr>
<td>runtime</td>
<td></td>
<td>ランタイム</td>
<td>rantaimu</td>
</tr>
<tr>
<td>spec</td>
<td></td>
<td>スペック</td>
<td>supekku</td>
</tr>
<tr>
<td>statement</td>
<td></td>
<td>ステートメント</td>
<td>suteetomento</td>
</tr>
<tr>
<td>string</td>
<td>文字列</td>
<td>もじれつ</td>
<td>mojiretsu</td>
</tr>
<tr>
<td>test</td>
<td></td>
<td>テスト</td>
<td>tesuto</td>
</tr>
<tr>
<td>test framework</td>
<td></td>
<td>テストフレームワーク</td>
<td>tesuto fureemuwaaku</td>
</tr>
<tr>
<td>threadsafe</td>
<td></td>
<td>スレッドセーフ</td>
<td>sureddoseefu</td>
</tr>
<tr>
<td>tool</td>
<td></td>
<td>ツール</td>
<td>tsuuru</td>
</tr>
<tr>
<td>tutorial</td>
<td></td>
<td>チュートリアル</td>
<td>chuutoriaru</td>
</tr>
<tr>
<td>ugly (as in code)</td>
<td>かっこ悪い</td>
<td>かっこわるい</td>
<td>kakko warui</td>
</tr>
<tr>
<td>usage</td>
<td>使い</td>
<td>つかい</td>
<td>tsukai</td>
</tr>
<tr>
<td>variable</td>
<td>変数</td>
<td>へんすう</td>
<td>hensuu</td>
</tr>
</tbody>
</table>
<p><a name="thanks">[*]</a> ありがとう:</p>
<ul>
<li><a href="http://twitter.com/threedaymonk" target="_blank">@threedaymonk</a> for a correction to multibyte digit.</li>
<li>Nobuyoshi Nakada for corrections to variable and multibyte character/digit, and addition of full-width character/digit.</li>
<li><a href="http://twitter.com/boblet" target="_blank">@boblet</a> and <a href="http://karmag.dreamwidth.org/" target="_blank">karmag</a> for a correction to development environment.
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.sarahmei.com/blog/2010/09/04/speak-ruby-in-japanese/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Ruby Kaigi</title>
		<link>http://www.sarahmei.com/blog/2010/09/02/ruby-kaigi/</link>
		<comments>http://www.sarahmei.com/blog/2010/09/02/ruby-kaigi/#comments</comments>
		<pubDate>Fri, 03 Sep 2010 04:54:11 +0000</pubDate>
		<dc:creator>sarahmei</dc:creator>
				<category><![CDATA[ruby]]></category>
		<category><![CDATA[asakusarb]]></category>
		<category><![CDATA[jasmine]]></category>
		<category><![CDATA[origami]]></category>
		<category><![CDATA[rubykaigi]]></category>
		<category><![CDATA[tdiary]]></category>
		<category><![CDATA[_why]]></category>

		<guid isPermaLink="false">http://www.sarahmei.com/blog/?p=659</guid>
		<description><![CDATA[Apart from attending Ruby meetups, my main reason for visiting Japan last month was RubyKaigi 2010. I wasn&#8217;t sure what to expect. Would it be all men in button-down dress shirts and pleated pants? Would I give my talk to a room full of blank looks? Would I be the one with the blank look [...]]]></description>
			<content:encoded><![CDATA[<p>Apart from <a href="http://www.sarahmei.com/blog/2010/09/01/asakusa-rb/" target="_blank">attending Ruby meetups</a>, my main reason for visiting Japan last month was <a href="http://rubykaigi.com/2010/en" target="_blank">RubyKaigi 2010</a>. </p>
<div id="attachment_670" class="wp-caption alignright" style="width: 310px"><a href="http://www.sarahmei.com/blog/wp-content/uploads/2010/09/lee-sarah-ruby-kaigi-why-not.jpg"><img src="http://www.sarahmei.com/blog/wp-content/uploads/2010/09/lee-sarah-ruby-kaigi-why-not-300x199.jpg" alt="" title="lee-sarah-ruby-kaigi-why-not" width="300" height="199" class="size-medium wp-image-670" /></a><p class="wp-caption-text">Why not, indeed? (photo by Lee Lundrigan)</p></div>
<p>I wasn&#8217;t sure what to expect. Would it be all men in button-down dress shirts and pleated pants? Would I give my talk to a room full of blank looks? Would I be the one with the blank look when I went to a talk in Japanese? WOULD THERE BE FAN SERVICE??<br />
<span id="more-659"></span><br />
No, no, no, and no. Thank goodness. It was one of the best conferences I&#8217;ve ever attended. Most of the talks were in Japanese, but they all had simultaneous translation in IRC (and IRC was projected onto screens at the side of the stage). My talk was translated into Japanese in IRC as I gave it, and <a href="http://bit.ly/aaEr2h" target="_blank">the video</a> was up the next day. </p>
<p>And people were interested in <a href="http://pivotal.github.com/jasmine/" target="_blank">Jasmine</a> and JavaScript testing (the subject of my talk), beyond just politeness. I helped <a href="http://twitter.com/machu" target="_blank">Kohei Matsuoka (@machu)</a>, one of the contributors to <a href="http://www.tdiary.org/" target="_blank">tdiary</a>, get going with Jasmine testing for their JavaScript. tdiary (also <a href="http://github.com/tdiary" target="_blank">on github</a>) is an open-source Ruby blogging system built on CGI.rb. It is OLD SKOOL. They are just now formulating a testing strategy (it&#8217;s in <a href="http://github.com/tdiary/tdiary-core" target="_blank">a branch of tdiary/tdiary-core</a>, to be merged in soon according to <a href="http://twitter.com/hsbt" target="_blank">@hsbt</a>). It&#8217;ll be fun to watch it shake out.</p>
<div id="attachment_665" class="wp-caption alignleft" style="width: 310px"><a href="http://www.sarahmei.com/blog/wp-content/uploads/2010/09/origiami-ruby.jpg"><img src="http://www.sarahmei.com/blog/wp-content/uploads/2010/09/origiami-ruby-300x224.jpg" alt="" title="origiami-ruby" width="300" height="224" class="size-medium wp-image-665" /></a><p class="wp-caption-text">Lightly crushed</p></div>
<p>The extra-curriculars were also fun. I clumsily made an origami ruby, with much help and encouragement from the instructor, who could clearly do more complex pieces. One of the Asakusa.rb guys gave me a fan from last year&#8217;s Ruby Kaigi that has an illustration from _why on it. I think it&#8217;s my favorite souvenir. I drank a lot, and went to a matsuri (street fair) where I saw weird dancing robots. I ate a lot of food that I probably would have refused had I known what it was. Most of it was great, though I did manage to go to the TGIFriday&#8217;s of Japanese food one night. </p>
<p>Oh &#8211; and there were other talks. They were great! I particularly enjoyed <a href="http://rubykaigi.tdiary.net/20100828.html#p08" target="_blank">Yasuko Ohba&#8217;s talk</a> on <a href="http://www.slideshare.net/nay/the-basis-of-making-dsl-with-ruby" target="_blank">writing DSLs in Ruby</a>. You can get the <a href="http://rubykaigi.tdiary.net/20100828.html" target="_blank">full set of videos</a> &#8211; most of them are quite good. There were quite a few talks on scientific computing and numeric libraries in Ruby. I&#8217;m glad I don&#8217;t have to work with them, but I&#8217;m glad someone&#8217;s doing them. </p>
<p><strong>Geek culture</strong></p>
<p>I saw a lot of threadless tshirts and baggy jeans &#8211; geeks the world over dress the same. That goddamned &#8220;#shirt&#8221; shirt was everywhere too. I saw at least one Ruby committer packing his own (large) bottle of sake. I did a pair programming subevent, and was able to pair with a couple of Japanese programmers. It pretty much felt like pairing at Pivotal (that&#8217;s a good thing). Smart people, it seems, can communicate with each other even when there&#8217;s a language barrier. Particularly when there&#8217;s a common (formal) language.</p>
<p>I am already making plans to attend RubyKaigi next year. Thank you very much to <a href="http://twitter.com/takahashim" target="_blank">Masayoshi Takahashi</a> and <a href="http://twitter.com/kakutani" target="_blank">Shintaro Kakutani</a>, and all the other organizers and volunteers. Fabulous event.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sarahmei.com/blog/2010/09/02/ruby-kaigi/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Asakusa.rb</title>
		<link>http://www.sarahmei.com/blog/2010/09/01/asakusa-rb/</link>
		<comments>http://www.sarahmei.com/blog/2010/09/01/asakusa-rb/#comments</comments>
		<pubDate>Thu, 02 Sep 2010 05:21:01 +0000</pubDate>
		<dc:creator>sarahmei</dc:creator>
				<category><![CDATA[ruby]]></category>
		<category><![CDATA[asakusarb]]></category>
		<category><![CDATA[japan]]></category>
		<category><![CDATA[rubykaigi]]></category>
		<category><![CDATA[sfruby]]></category>

		<guid isPermaLink="false">http://www.sarahmei.com/blog/?p=600</guid>
		<description><![CDATA[A few days after we arrived in Japan, Sarah Allen and I went to the weekly hack night put on by Asakusa.rb, a meetup group in Tokyo founded by Akira Matsuda. (She blogged about it here.) Asakusa is the neighborhood in Tokyo where we were staying. It was a fortuitous choice. The first night we [...]]]></description>
			<content:encoded><![CDATA[<p>A few days after we arrived in Japan, Sarah Allen and I went to the weekly hack night put on by <a href="http://qwik.jp/asakusarb/" target="_blank">Asakusa.rb</a>, a meetup group in Tokyo founded by <a href="http://twitter.com/a_matsuda" target="_blank">Akira Matsuda</a>. <span id="more-600"></span>(<a href="http://www.ultrasaurus.com/sarahblog/2010/08/ruby-meetup-in-tokyo-asakusa-rb/" target="_blank">She blogged about it here</a>.) </p>
<div id="attachment_602" class="wp-caption alignleft" style="width: 234px"><a href="http://www.sarahmei.com/blog/wp-content/uploads/2010/09/asakusa-gate.jpg"><img src="http://www.sarahmei.com/blog/wp-content/uploads/2010/09/asakusa-gate-224x300.jpg" alt="" title="asakusa-gate" width="224" height="300" class="size-medium wp-image-602" /></a><p class="wp-caption-text">went out for groceries, found this.</p></div>
<p><a href="http://en.wikipedia.org/wiki/Asakusa" target="_blank">Asakusa</a> is the neighborhood in Tokyo where we were staying. It was a fortuitous choice. </p>
<p>The first night we were there, my friend Iku and I walked to a sento &#8211; and old-style Japanese bath. (Note: bathhouses in Japan don&#8217;t have the same <a href="http://en.wikipedia.org/wiki/Gay_bathhouse" target="_blank">connotation</a>  that they do in the U.S.) It was incredibly relaxing, after 12 hours on the plane, to wash and sit in the hot water. According to Iku, who&#8217;s Japanese, traditional sentos are hard to find in Japan these days. Asakusa is evidently one of the few places in Tokyo you still can. </p>
<p>So I liked it a lot. The rest of Tokyo sometimes felt like an entire city made out of Times Square. Asakusa, on the other hand, is wonderful mix of residential zones, old-style buildings, and modern-ADD-blinky commercial areas. </p>
<p>The second afternoon we were there, I went out to find a grocery store and randomly stumbled across this gigantic gate, called the Kaminarimon. I did also eventually find the grocery store with its $5-a-piece peaches. </p>
<p>I posted the picture to Twitter, and <a href="http://twitter.com/kakutani" target="_blank">Shintaro Kakutani</a> saw it, recognized it, and invited me to their meetup. So Sarah and I took the subway a few stops down on Tuesday night. I brought my laptop, prepared to hack, but the schedule was more oriented towards the &#8220;meet&#8221; part of meetup.</p>
<ul>
<li>19:45 Introductions</li>
<li>20:15 Drinking</li>
</ul>
<p>Here&#8217;s the aftermath:</p>
<table border=0>
<tr>
<td>
<div id="attachment_622" class="wp-caption alignleft" style="width: 310px"><a href="http://www.sarahmei.com/blog/wp-content/uploads/2010/09/yakitori-3.jpg"><img src="http://www.sarahmei.com/blog/wp-content/uploads/2010/09/yakitori-3-300x224.jpg" alt="Akira Matsuda, Shintaro Kakutani" title="asakusarb-a_matsuda-kakutani" width="300" height="224" class="size-medium wp-image-622" /></a><p class="wp-caption-text">Akira Matsuda &#038; Shintaro Kakutani</p></div></p>
<p><div id="attachment_621" class="wp-caption alignleft" style="width: 310px"><a href="http://www.sarahmei.com/blog/wp-content/uploads/2010/09/yakitori-4.jpg"><img src="http://www.sarahmei.com/blog/wp-content/uploads/2010/09/yakitori-4-300x224.jpg" alt="" title="beer-beer-beer" width="300" height="224" class="size-medium wp-image-621" /></a><p class="wp-caption-text">BEER BEER BEER MEAT BEER</p></div>
</td>
</tr>
<tr>
<td>
<div id="attachment_641" class="wp-caption alignleft" style="width: 310px"><a href="http://www.sarahmei.com/blog/wp-content/uploads/2010/09/yakitori-1.jpg"><img src="http://www.sarahmei.com/blog/wp-content/uploads/2010/09/yakitori-1-300x224.jpg" alt="" title="yakitori-3" width="300" height="224" class="size-medium wp-image-641" /></a><p class="wp-caption-text">You guessed it...</p></div></p>
<p><div id="attachment_640" class="wp-caption alignleft" style="width: 310px"><a href="http://www.sarahmei.com/blog/wp-content/uploads/2010/09/yakitori-2.jpg"><img src="http://www.sarahmei.com/blog/wp-content/uploads/2010/09/yakitori-2-300x224.jpg" alt="" title="yakitori-4" width="300" height="224" class="size-medium wp-image-640" /></a><p class="wp-caption-text">MOAR BEER</p></div>
</td>
</tr>
</table>
<p>It was fantastic. I am told there is usually more hacking, but beer is a great social lubricant. I&#8217;m incredibly self-conscious about speaking Japanese, because I know I&#8217;m not very good. But somehow, when I have beer, I don&#8217;t care as much. </p>
<p>Aaron Patterson, in <a href="http://rubykaigi.tdiary.net/20100828.html#p16" target="_blank">his RubyKaigi talk</a>, said that people are interpreters with very forgiving parsers. As it turns out, he&#8217;s right! So even though I speak horrible Japanese, my meaning got through most of the time.</p>
<p>I&#8217;m eternally grateful to all the Asakusa.rb folks for not outright laughing at me whenever I opened my mouth and said something inappropriate or totally nonsensical. Which I&#8217;m sure I did often. <img src='http://www.sarahmei.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Sarah and I had such a good time, there and at RubyKaigi later in the week, that we decided to ask Asakusa.rb to be officially friendly with <a href="http://www.meetup.com/sfruby" target="_blank">SF Ruby</a>. Akira sort of had to say yes. After all, we gave him Ghiradelli chocolate.</p>
<div id="attachment_625" class="wp-caption alignright" style="width: 310px"><a href="http://www.sarahmei.com/blog/wp-content/uploads/2010/09/asakusa-chocolate.jpg"><img src="http://www.sarahmei.com/blog/wp-content/uploads/2010/09/asakusa-chocolate-300x199.jpg" alt="" title="asakusa-chocolate" width="300" height="199" class="size-medium wp-image-625" /></a><p class="wp-caption-text">CHOCO</p></div>
<p>So now we are sister meetups, and Sarah and I are official members of Asakusa.rb (we&#8217;re even on their <a href="http://twitter.com/a_matsuda/asakusa-rb" target="_blank">twitter list</a>). Next time: hacking and beer together. Hopefully in <a href="http://rubyconf.org" target="_blank">New Orleans</a>.</p>
<p>Until then, ありがとうございます Asakusa.rb, for making me feel so welcome in a place that otherwise felt a little alien. Geek culture really does transcend the language barrier. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.sarahmei.com/blog/2010/09/01/asakusa-rb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RailsConf Slides &#8211; Beyond (No)SQL</title>
		<link>http://www.sarahmei.com/blog/2010/06/09/railsconf-slides/</link>
		<comments>http://www.sarahmei.com/blog/2010/06/09/railsconf-slides/#comments</comments>
		<pubDate>Wed, 09 Jun 2010 16:26:54 +0000</pubDate>
		<dc:creator>sarahmei</dc:creator>
				<category><![CDATA[ruby]]></category>
		<category><![CDATA[databases]]></category>
		<category><![CDATA[nosql]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[railsconf]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://www.sarahmei.com/blog/?p=544</guid>
		<description><![CDATA[Preliminary slides for my RailsConf talk I&#8217;m giving this afternoon on conceptual tools for evaluating databases. Contains some profanity at the beginning. Slides are subject to change since I haven&#8217;t actually given the talk yet! Beyond (No)SQL View more presentations from Sarah Mei.]]></description>
			<content:encoded><![CDATA[<p>Preliminary slides for my RailsConf talk I&#8217;m giving this afternoon on conceptual tools for evaluating databases. <strong>Contains some profanity at the beginning.</strong> Slides are subject to change since I haven&#8217;t actually given the talk yet!<br />
<span id="more-544"></span></p>
<div style="width:425px" id="__ss_4453924"><strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/sarahmei/beyond-nosql" title="Beyond (No)SQL">Beyond (No)SQL</a></strong><object id="__sse4453924" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=beyond-no-sql-100609112040-phpapp02&#038;stripped_title=beyond-nosql" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed name="__sse4453924" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=beyond-no-sql-100609112040-phpapp02&#038;stripped_title=beyond-nosql" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object>
<div style="padding:5px 0 12px">View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/sarahmei">Sarah Mei</a>.</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.sarahmei.com/blog/2010/06/09/railsconf-slides/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Outside-In BDD: How?!</title>
		<link>http://www.sarahmei.com/blog/2010/05/29/outside-in-bdd/</link>
		<comments>http://www.sarahmei.com/blog/2010/05/29/outside-in-bdd/#comments</comments>
		<pubDate>Sun, 30 May 2010 03:14:55 +0000</pubDate>
		<dc:creator>sarahmei</dc:creator>
				<category><![CDATA[ruby]]></category>
		<category><![CDATA[bdd]]></category>
		<category><![CDATA[cucumber]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[rspec]]></category>

		<guid isPermaLink="false">http://www.sarahmei.com/blog/?p=443</guid>
		<description><![CDATA[I use rspec on every project, and I&#8217;ve started adding cucumber to all my projects in the last few months. There&#8217;s lots of information out there about how to set up and use cucumber, but there isn&#8217;t much covering your developer workflow when you&#8217;re using these tools. How do you start, and how do you [...]]]></description>
			<content:encoded><![CDATA[<p>I use <a href="http://rspec.info/">rspec</a> on every project, and I&#8217;ve started adding <a href="http://cukes.info">cucumber</a> to all my projects in the last few months. There&#8217;s lots of information out there about how to set up and use cucumber, but there isn&#8217;t much covering your developer workflow when you&#8217;re using these tools.</p>
<p>How do you start, and how do you know you&#8217;re finished? What do you test, and where? These questions can be answered hundreds of different ways, but here&#8217;s my way.<br />
<span id="more-443"></span></p>
<h2>The first code I write: a feature</h2>
<p>As a developer, rather than a designer, I&#8217;m always tempted to start with unit tests and work out towards a cucumber feature (&#8220;inside-out&#8221; testing). But that approach gets me into no end of trouble. I usually end up writing and testing stuff on the model that I don&#8217;t ultimately need. Plus once I&#8217;m down in the weeds coding, I lose track of the big picture.</p>
<p>So I like to do outside-in testing instead. I start each story I get from <a href="http://pivotaltracker.com">tracker</a> with a cucumber feature that expresses how the PM will be able to accept it when I&#8217;m done. The feature helps me frame the problem properly, and focus on doing exactly what I need to make it work. Since I come back to it periodically while I&#8217;m coding, I keep focused on the higher-level goal. And finally &#8211; if I write it first, I can&#8217;t skip writing it once I&#8217;m done.</p>
<h2>Before we get going&#8230;</h2>
<p>There are certain types of tests I don&#8217;t write in this example (and in some cases, at all). Let&#8217;s get those out of the way so you don&#8217;t have to come up with a scathing comment at the bottom of the post.</p>
<ul>
<li><strong>Model tests.</strong> In this example, my model doesn&#8217;t do anything other than default ActiveRecord behavior, so it doesn&#8217;t need any tests. <strong>Don&#8217;t test rails internals.</strong> Once my model has custom behavior, it will have specs, too.</li>
<li><strong>View tests.</strong> I have no tests that verify that my markup is what I expect. That&#8217;s because they&#8217;re a waste of time. Yes, even with complex views. Verify behavior with cucumber tests, unit-test Javascript with <a href="http://github.com/pivotal/jasmine">jasmine</a>, and leave the rest to the humans. You&#8217;ll waste more developer time maintaining them than it would take humans to verify them. Verifiers are a whole lot cheaper than developers.</li>
<li><strong>Error case tests.</strong> In this example, there are no error cases. The model has no validations, and the table has no constraints. Once there are error cases, I generally put those in the model if I can, in the controller when I have to, and never in the cucumber tests. The latter is mostly a suite-speed consideration &#8211; cucumber tests run much more slowly than rspec. Cucumber&#8217;s great for for happy path tests; I leave the rest to rspec.</li>
</ul>
<p>Let&#8217;s get going!</p>
<h2>The first feature</h2>
<p>Say I&#8217;m doing a library app and the first story is &#8220;User can enter a new book into the system.&#8221; Before I write any other code, I write this feature:</p>
<pre lang="RUBY">
Feature: User manages books
  Scenario: User adds a new book
    Given I go to the new book page
    And I fill in "Name" with "War &#038; Peace"
    And I fill in "Description" with "Long Russian novel"
    When I press "Create"
    Then I should be on the book list page
    And I should see "War &#038; Peace"
</pre>
<h2>Starting the fail-fix cycle</h2>
<p>I run it using <code>cucumber features</code>, and it fails on the first line &#8211; <code>Given I go to the new book page</code> &#8211; because cucumber doesn&#8217;t know where the &#8220;new book page&#8221; is. So I add that to the cucumber paths helper.</p>
<pre lang="RUBY">
    when /the new book page/
      new_book_path
</pre>
<p>Now when I run cucumber, it fails because it can&#8217;t find <code>new_book_path</code>. So I add that to <code>routes.rb</code>:</p>
<pre lang="RUBY">
  map.resources :books, <img src='http://www.sarahmei.com/blog/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> nly => [:new]
</pre>
<p>Now when I run cucumber, it complains that it can&#8217;t find the BooksController. That means it&#8217;s time to dive down to rspec controller tests. </p>
<h2>My first spec experience</h2>
<p>I create <code>books_controller_spec.rb</code> in spec/controllers, and add a test for the <code>new</code> method:</p>
<pre lang="RUBY">
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper.rb'))
describe BooksController do
  describe "#new" do
    it "should be successful" do
      get :new
      response.should be_success
    end
  end
end
</pre>
<p>When I run this spec, it complains that there is no BooksController. Fixed:</p>
<pre lang="RUBY">
class BooksController < ApplicationController
end
</pre>
<p></code><br />
I re-run the spec and get "no action responded to new." So I add the <code>new</code> method.</p>
<pre lang="RUBY">
class BooksController < ApplicationController
  def new
  end
end
</pre>
<p>Now the spec passes! Time to check back with cucumber.</p>
<h2>Getting past the first line</h2>
<p>I read through my cucumber feature again:</p>
<pre lang="RUBY">
Feature: User manages books
  Scenario: User adds a new book
    Given I go to the new book page
    And I fill in "Name" with "War &#038; Peace"
    And I fill in "Description" with "Long Russian novel"
    When I press "Create"
    Then I should be on the book list page
    And I should see "War &#038; Peace"
</pre>
<p>Last time I ran it, it failed on the first line because it couldn't find the BooksController. This time, same location, but it says it can't find the view. So whiny! To placate it, I create an empty view called <code>new.html.erb</code> and run it again.</p>
<p>Now cucumber gets past line 1 (huzzah!!) and fails on line 2 (<code>And I fill in "Name" with "War &amp; Peace"</code>) with the message that it can't find a field called Name to fill in. So I add a standard rails form to the view.</p>
<pre lang="RUBY">
<%- form_for @book do |f| -%>
    <%= f.label :name %>
    <%= f.text_field :name %>
    <%= f.label :description %>
    <%= f.text_area :description %>
    <%= f.submit "Create" %>
<%- end -%>
</pre>
<p>Uh oh. Cucumber is mad at me because there is no <code>@book</code> object. Back to rspec for me!</p>
<h2>rspec: The Return</h2>
<p>In my controller's <code>new</code> method, I need to create a book object that the form will use. I first add a test for that in the controller spec:</p>
<pre lang="RUBY">
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper.rb'))
describe BooksController do
  describe "#new" do
    before do
      get :new
    end
    it "should be successful" do
      response.should be_success
    end
    it "should create a book object" do
      assigns(:book).should_not be_nil
    end
  end
end
</pre>
<p>This fails the right way - it says assigns(:book) is nil. So then I add the creation of the book object to the controller.</p>
<pre lang="RUBY">
class BooksController < ApplicationController
  def new
    @book = Book.new
  end
end
</pre>
<p>Now the spec fails, saying it can't find the Book class. It has a point - I haven't created the model yet. Fixed:</p>
<pre lang="RUBY">
class Book < ActiveRecord::Base
end
</pre>
<p>Now it fails saying it can't find the books table. So I write a migration that creates that.</p>
<pre lang="RUBY">
class CreateBooksTable < ActiveRecord::Migration
  def self.up
    create_table :books do |t|
      t.string :name
      t.text :description
    end
  end
  def self.down
    drop_table :books
  end
end
</pre>
<p>Once I do <code>rake db:migrate</code> and <code>rake db:test:prepare</code>, I re-run my controller spec....and it passes! Back to the cucumber feature!</p>
<h2>Cucumber...again.</h2>
<p>In our last episode, cucumber was visibly annoyed because there was no <code>@book</code> object for the form to operate on. I run it again to see if it's still sulking.</p>
<p>Yep. This time it tells me that it can't find books_path. <code>form_for</code> tries to submit to the create path by default, which I haven't added yet. I add it to the routes.</p>
<pre lang="RUBY">
  map.resources :books, <img src='http://www.sarahmei.com/blog/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> nly => [:new, :create]
</pre>
<p>This time, when I run cucumber, it gets through the first three lines (woo hoo!) and fails on the 4th, saying no action responded to create. Back to the rspec-cave, batman!</p>
<h2>rspec: The Sequel to The Return</h2>
<p>I add a controller spec for the <code>create</code> method.</p>
<pre lang="RUBY">
  describe "#create" do
    it "should create a new book" do
      post :create, "book" => {"name" => "Jane Eyre", "description" => "Something Victorian"}
      assigns(:book).should_not be_nil
      assigns(:book).name.should == "Jane Eyre"
    end
  end
</pre>
<p>When I run it, I get the same message as in cucumber: no action responded to create. So I create the create:</p>
<pre lang="RUBY">
class BooksController < ApplicationController
  def new
    @book = Book.new
  end
  def create
  end
end
</pre>
<p>Now when I re-run the spec, it fails saying that assigns(:book) is nil, which makes sense. I put in the guts of <code>create</code> to make that pass.</p>
<pre lang="RUBY">
  def create
    @book = Book.new(params[:book])
    @book.save
  end
</pre>
<p>Now rspec passes! Back to cucumber. </p>
<h2>So...cucumber. We meet again.</h2>
<p>When I re-run the feature, it says I'm missing a template for create, which is correct. However, in this case, I don't want to make a template for create - I want to redirect to the book list page. So once again, I'm back with rspec.</p>
<h2>rspec: Back so soon?</h2>
<p>I add that expectation to the controller spec for <code>create</code>.</p>
<pre lang="RUBY">
    it "should redirect to the book list page" do
      response.should redirect_to books_path
    end
</pre>
<p>It fails saying there's no redirect. So to make it pass, I add a redirect to the controller code.</p>
<pre lang="RUBY">
  def create
    @book = Book.new(params[:book])
    if @book.save
      redirect_to books_path
    end
  end
</pre>
<p>Now my controller specs pass. Cucumber, I'm coming for you!</p>
<h2>Oh, you again.</h2>
<p>Last time, we got through the first 3 lines of the feature and failed on line 4 (<code>When I press "Create"</code>). When I run it this time, it gets through the same 3 lines and then fails in the same place again, saying that no action responded to index. I add <code>index</code> to the routes.</p>
<pre lang="RUBY">
  map.resources :books, <img src='http://www.sarahmei.com/blog/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> nly => [:new, :create, :index]
</pre>
<p>I re-run the feature and get the same error message. WTF, cucumber?! It turns out that rails' implementation of REST uses the same path helper for create and index, so the path helper for <code>index</code> already exists, even though the method does not. A little strange, I know. But we need an <code>index</code> method, so it's back to rspec.</p>
<h2>rspec: For the first time, for the last time...</h2>
<p>I write a spec for the <code>index</code> method.</p>
<pre lang="RUBY">
  describe "#index" do
    it "should be successful" do
      get :index
      response.should be_success
    end
  end
</pre>
<p>I still get no action responded to index. So l add the method in BooksController, empty to start.</p>
<pre lang="RUBY">
  def index
  end
</pre>
<p>Specs pass, back to cucumber!</p>
<h2>How can I miss you if you won't go away?</h2>
<p>Cucumber tells me there's no template for index. So I create an empty one, and re-run. This run, for the first time, I pass line 4 (yaaaaay) but then it fails on line 5 (<code>Then I should be on the book list page</code>) because it can't figure out what I mean by "the book list page." That goes in the cucumber path helper.</p>
<pre lang="RUBY">
    when /the book list page/
      books_path
</pre>
<p>OMG five out of six steps pass! Now cucumber says it can't find "War &amp; Peace" on the page, so let's make the index view list the existing books. Back to rspec...</p>
<h2>Don't go away mad...just go away.</h2>
<p>I add the following <code>it</code> block to the spec for <code>index</code>.</p>
<pre lang="RUBY">
    it "should assign a list of existing books" do
      Book.create!(:name => "Endymion", :description => "weird")
      get :index
      assigns(:books).should_not be_nil
      assigns(:books).length.should == 1
    end
</pre>
<p>It fails because I'm not creating @books in the controller, so I fix that.</p>
<pre lang="RUBY">
  def index
    @books = Book.all
  end
</pre>
<p>Now the specs pass - back to cucumber. </p>
<h2>We really have to stop seeing each other like this.</h2>
<p>Cucumber still says it can't find War &amp; Peace, because I haven't added printing out the books to the index view. I'll fix that.</p>
<pre lang="RUBY">
<%- @books.each do |book| -%>
    <strong><%= h book.name %></strong>
    <%= h book.description %>
<%- end -%>
</pre>
<p>Re-run cucumber and ... ta-da! The feature passes! I've done everything I need to call the story done. I have the minimum amount of code I need, because all the code I wrote was driven by the feature. Story: <strong>delivered</strong>!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sarahmei.com/blog/2010/05/29/outside-in-bdd/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Another Ruby hack night!</title>
		<link>http://www.sarahmei.com/blog/2010/05/22/ruby-hack-night-61/</link>
		<comments>http://www.sarahmei.com/blog/2010/05/22/ruby-hack-night-61/#comments</comments>
		<pubDate>Sat, 22 May 2010 22:02:43 +0000</pubDate>
		<dc:creator>sarahmei</dc:creator>
				<category><![CDATA[ruby]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[pivotal]]></category>
		<category><![CDATA[sfruby]]></category>

		<guid isPermaLink="false">http://www.sarahmei.com/blog/?p=436</guid>
		<description><![CDATA[I&#8217;ll be hosting another Ruby hack night on Tuesday, June 1st, at Pivotal Labs &#8211; 731 Market St, between 3rd and 4th in San Francisco. You can RSVP here. You&#8217;re welcome to bring any sort of Ruby-related project! The theme for the evening is Javascript testing, following on this month&#8217;s monthly meetup. But I won&#8217;t [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ll be hosting another Ruby hack night on Tuesday, June 1st, at Pivotal Labs &#8211; 731 Market St, between 3rd and 4th in San Francisco. You can RSVP <a href="http://www.meetup.com/sfruby/calendar/13534634/">here</a>.</p>
<p>You&#8217;re welcome to bring any sort of Ruby-related project! The theme for the evening is Javascript testing, following on <a href="http://www.meetup.com/sfruby/calendar/13060368/">this month&#8217;s monthly meetup</a>. But I won&#8217;t make you write any Javascript if you don&#8217;t want to.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sarahmei.com/blog/2010/05/22/ruby-hack-night-61/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ruby hack night</title>
		<link>http://www.sarahmei.com/blog/2010/04/21/ruby-hack-night/</link>
		<comments>http://www.sarahmei.com/blog/2010/04/21/ruby-hack-night/#comments</comments>
		<pubDate>Thu, 22 Apr 2010 03:09:26 +0000</pubDate>
		<dc:creator>sarahmei</dc:creator>
				<category><![CDATA[ruby]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[pivotal]]></category>
		<category><![CDATA[sfruby]]></category>

		<guid isPermaLink="false">http://www.sarahmei.com/blog/?p=420</guid>
		<description><![CDATA[The peninsula has all kinds of neat hack events like SuperHappyDevHouse and various Hacker Dojo events. But I hate driving all the way down there just to hang out with hackers and get something done on a project. There are plenty of hackers in San Francisco. There might even be more of the type of [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://maps.google.com/maps?f=q&#038;source=s_q&#038;hl=en&#038;geocode=&#038;q=731+Market+Street,+San+Francisco,+CA&#038;sll=37.781689,-122.391061&#038;sspn=0.009158,0.019205&#038;ie=UTF8&#038;hq=&#038;hnear=731+Market+St,+San+Francisco,+California+94103&#038;ll=37.786877,-122.404368&#038;spn=0.009157,0.019205&#038;z=16"><img src="/blog/wp-content/uploads/2010/04/731_market_st.jpg" alt="Pivotal Labs, 731 Market St, 3rd Floor" title="731_market_st" width="424" height="349" class="alignright size-full wp-image-537" /></a></p>
<p>The peninsula has all kinds of neat hack events like <a href="http://superhappydevhouse.org">SuperHappyDevHouse</a> and various <a href="http://hackerdojo.org">Hacker Dojo</a> events. But I hate driving all the way down there just to hang out with hackers and get something done on a project. There are plenty of hackers in San Francisco. There might even be <strong>more</strong> of the type of hackers I want to hang out with.</p>
<p>So I&#8217;ve decided to host a monthly hack night, to be held on the Tuesday following the monthly SF Ruby meetup. My employer, <a href="http://pivotallabs.com">Pivotal Labs</a>, has graciously volunteered their space. Since tonight is the SF Ruby meetup, the next hack night is <strong>next Tuesday</strong>, April 27th, from 7-9:30 (ish).</p>
<p><a href="http://bit.ly/dx3t9T">RSVP now!</a> See you next Tuesday.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sarahmei.com/blog/2010/04/21/ruby-hack-night/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>LARubyConf Slides Posted</title>
		<link>http://www.sarahmei.com/blog/2010/02/20/larubyconf-slides-posted/</link>
		<comments>http://www.sarahmei.com/blog/2010/02/20/larubyconf-slides-posted/#comments</comments>
		<pubDate>Sat, 20 Feb 2010 21:39:55 +0000</pubDate>
		<dc:creator>sarahmei</dc:creator>
				<category><![CDATA[ruby]]></category>
		<category><![CDATA[larubyconf]]></category>
		<category><![CDATA[teaching]]></category>
		<category><![CDATA[workshops]]></category>

		<guid isPermaLink="false">http://www.sarahmei.com/blog/?p=309</guid>
		<description><![CDATA[Just finished my LA Ruby Conf talk on teaching Ruby to kids. Here are a few further resources: Shoes &#8211; a simple way to create desktop applications in Ruby. Cross-platform, pure awesome. (code on github) Hackety Hack &#8211; built on Shoes, this is a toolkit specifically for learning how to program. Small Ruby &#8211; learn [...]]]></description>
			<content:encoded><![CDATA[<p>Just finished my LA Ruby Conf talk on teaching Ruby to kids. Here are a few further resources:<br />
<span id="more-309"></span></p>
<ul>
<li><a href="http://shoes.heroku.com/">Shoes</a> &#8211; a simple way to create desktop applications in Ruby. Cross-platform, pure awesome. (<a href="http://github.com/shoes/shoes">code on github</a>)</li>
<li><a href="http://hacketyhack.heroku.com/">Hackety Hack</a> &#8211; built on Shoes, this is a toolkit specifically for learning how to program.</li>
<li>Small Ruby &#8211; learn to program for the smaller set &#8211; think turtle drawing. Coming soon.</li>
<li><a href="http://www.sarahmei.com/blog/wp-content/uploads/2010/03/LARubyConf.pdf">PDF version of the slides</a> (exactly the same as slides below)</li>
</ul>
<div style="width:425px;text-align:left;padding-left:15px;" id="__ss_3233891"><a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/sarahmei/teaching-ruby-to-kids" title="Teaching Ruby to Kids">Teaching Ruby to Kids</a><object style="margin:0px" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=larubyconf-100220140747-phpapp01&#038;stripped_title=teaching-ruby-to-kids" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=larubyconf-100220140747-phpapp01&#038;stripped_title=teaching-ruby-to-kids" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object>
<div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;">View more presentations from <a style="text-decoration:underline;" href="http://www.slideshare.net/sarahmei">Sarah Mei</a>.</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.sarahmei.com/blog/2010/02/20/larubyconf-slides-posted/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The First 2010 Ruby Outreach Workshop</title>
		<link>http://www.sarahmei.com/blog/2010/02/19/the-first-2010-ruby-outreach-workshop/</link>
		<comments>http://www.sarahmei.com/blog/2010/02/19/the-first-2010-ruby-outreach-workshop/#comments</comments>
		<pubDate>Fri, 19 Feb 2010 17:37:54 +0000</pubDate>
		<dc:creator>sarahmei</dc:creator>
				<category><![CDATA[ruby]]></category>
		<category><![CDATA[childcare]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[sfruby]]></category>
		<category><![CDATA[workshops]]></category>

		<guid isPermaLink="false">http://www.sarahmei.com/blog/?p=301</guid>
		<description><![CDATA[&#8230;is now open for registration. Last year Sarah Allen and I did three workshops for women and this year we&#8217;re going for four. So, if you&#8217;d like to learn Rails and can come BOTH Friday, February 26th in the evening AND Saturday, February 27th during the day, go sign up! There are only a few [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_171" class="wp-caption alignright" style="width: 210px"><img src="http://www.sarahmei.com/blog/wp-content/uploads/2009/07/ruby.jpg" alt="Copyright 2006 by Yukihiro Matsumoto" title="ruby" width="200" class="size-full wp-image-171" /><p class="wp-caption-text">LEARN ME</p></div>
<p>&#8230;is now <a href="http://www.meetup.com/sfruby/calendar/12605445/">open for registration</a>.  Last year <a href="http://ultrasaurus.com">Sarah Allen</a> and I did three workshops for women and this year we&#8217;re going for four.  So, if you&#8217;d like to learn Rails and can come BOTH Friday, February 26th in the evening AND Saturday, February 27th during the day, <a href="http://www.meetup.com/sfruby/calendar/12605445/">go sign up</a>! There are only a few spots left.</p>
<p>And yep, still free.</p>
<p>We&#8217;re also seeking Rails developers (of any gender) to assist as TAs. <a href="http://www.meetup.com/sfruby/calendar/12605400/">Tell us about that here</a>.  Past TAs and teachers have found it quite rewarding. Plus you get a drink ticket for the afterparty. <img src='http://www.sarahmei.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>And finally, some logistics: it&#8217;ll be in an office space in downtown San Francisco, near transit. Next week we&#8217;ll send out the exact address. We&#8217;ll have informal childcare and space for pumping or nursing &#8211; please tell us if you think you&#8217;ll be using those services when you register.</p>
<p>See you there! </p>
]]></content:encoded>
			<wfw:commentRss>http://www.sarahmei.com/blog/2010/02/19/the-first-2010-ruby-outreach-workshop/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

