<?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/"
	xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>クックパッド開発者ブログ</title>
	<atom:link href="http://techlife.cookpad.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://techlife.cookpad.com</link>
	<description>クックパッドのエンジニアがサイトの開発と運営について書き綴ります</description>
	<lastBuildDate>Fri, 30 Oct 2009 05:22:51 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='techlife.cookpad.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/09c04b621ed760c746467e3647d28935?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>クックパッド開発者ブログ</title>
		<link>http://techlife.cookpad.com</link>
	</image>
			<item>
		<title>techlifeライトニングトーク at クックパッド</title>
		<link>http://techlife.cookpad.com/2009/10/24/techlife_introduction/</link>
		<comments>http://techlife.cookpad.com/2009/10/24/techlife_introduction/#comments</comments>
		<pubDate>Sat, 24 Oct 2009 05:39:25 +0000</pubDate>
		<dc:creator>cookpadtech</dc:creator>
				<category><![CDATA[イベント]]></category>

		<guid isPermaLink="false">http://techlife.cookpad.com/?p=613</guid>
		<description><![CDATA[
techlifeライトニングトークは、実践的な技術交流のためのイベントです。
毎回テーマを決めて、それについてプレゼンをして頂きます。
・1人5分、参加者全員発表
・LTの内容は動画で公開予定
・あなたのtechlife（技術のある楽しい生活）に役立った内容のみ発表可能
・申し込み人数が10名を超える場合は、抽選とさせて頂きます。
techlifeライトニングトークは、平日19時から！
11/20　分散処理

12/3　　Puppet
12/11　 Hive
-申込方法
下記項目をご記載の上、までメールをお送りください。
〆切は開催2日前。ご参加頂く方には、詳細のメールを差し上げます。
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;
■タイトル（例えば分散処理の会なら）
「分散処理参加希望」
■本文
・お名前
・ご年齢
・ライトニングトークのおおまかな内容
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;
twitterはじめました！ライトニングトークのテーマ募集中☆
＠techlifecookpad
Posted in イベント       <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=techlife.cookpad.com&blog=4985499&post=613&subd=cookpadtech&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><a href="http://cookpadtech.files.wordpress.com/2009/10/img_2939.jpg"><img class="aligncenter size-medium wp-image-616" title="IMG_2939" src="http://cookpadtech.files.wordpress.com/2009/10/img_2939.jpg?w=300&#038;h=200" alt="IMG_2939" width="300" height="200" /></a></p>
<p>techlifeライトニングトークは、実践的な技術交流のためのイベントです。</p>
<p>毎回テーマを決めて、それについてプレゼンをして頂きます。</p>
<p>・1人5分、参加者全員発表</p>
<p>・LTの内容は動画で公開予定</p>
<p>・あなたのtechlife（技術のある楽しい生活）に役立った内容のみ発表可能</p>
<p>・申し込み人数が10名を超える場合は、抽選とさせて頂きます。</p>
<p><strong>techlifeライトニングトークは、平日19時から！</strong></p>
<p><strong>11/20　分散処理<br />
</strong></p>
<p><strong>12/3　　Puppet</strong></p>
<p><strong>12/11　 Hive</strong></p>
<p>-申込方法</p>
<p>下記項目をご記載の上、<img class="size-full wp-image-617 alignnone" title="mailaddress" src="http://cookpadtech.files.wordpress.com/2009/10/mailaddress.jpg?w=289&#038;h=28" alt="mailaddress" width="289" height="28" />までメールをお送りください。</p>
<p>〆切は開催2日前。ご参加頂く方には、詳細のメールを差し上げます。</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p><span style="text-decoration:underline;">■タイトル</span>（例えば分散処理の会なら）</p>
<p>「分散処理参加希望」</p>
<p><span style="text-decoration:underline;">■本文</span></p>
<p>・お名前</p>
<p>・ご年齢</p>
<p>・ライトニングトークのおおまかな内容</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>twitterはじめました！ライトニングトークのテーマ募集中☆</p>
<p>＠techlifecookpad</p>
Posted in イベント  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/cookpadtech.wordpress.com/613/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/cookpadtech.wordpress.com/613/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/cookpadtech.wordpress.com/613/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/cookpadtech.wordpress.com/613/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/cookpadtech.wordpress.com/613/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/cookpadtech.wordpress.com/613/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/cookpadtech.wordpress.com/613/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/cookpadtech.wordpress.com/613/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/cookpadtech.wordpress.com/613/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/cookpadtech.wordpress.com/613/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=techlife.cookpad.com&blog=4985499&post=613&subd=cookpadtech&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://techlife.cookpad.com/2009/10/24/techlife_introduction/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">cookpadtech</media:title>
		</media:content>

		<media:content url="http://cookpadtech.files.wordpress.com/2009/10/img_2939.jpg?w=300" medium="image">
			<media:title type="html">IMG_2939</media:title>
		</media:content>

		<media:content url="http://cookpadtech.files.wordpress.com/2009/10/mailaddress.jpg" medium="image">
			<media:title type="html">mailaddress</media:title>
		</media:content>
	</item>
		<item>
		<title>AWKのススメ</title>
		<link>http://techlife.cookpad.com/2009/10/23/awk/</link>
		<comments>http://techlife.cookpad.com/2009/10/23/awk/#comments</comments>
		<pubDate>Fri, 23 Oct 2009 10:04:10 +0000</pubDate>
		<dc:creator>cookpadtech</dc:creator>
				<category><![CDATA[エンジニア日記]]></category>

		<guid isPermaLink="false">http://techlife.cookpad.com/?p=537</guid>
		<description><![CDATA[はじめまして。インフラチームの菅原といいます。
今年の7月に入社してから、コンソールとにらめっこする毎日を過ごしています。クックパッドのようにアクセスの多いサイトのサーバを扱うことが今まで無かったので、いろいろと勉強になることが多いです。
さて、インフラチームではサーバの状況をモニタリングして、サーバに問題がないかを常に把握するようにしています。そのため日常的にtailでログを追いかけているのですが、そんなときはAWKが非常に便利なことに気付き、最近はかなりAWKにハマっています。
今回は絶賛マイブーム中のAWKの活用例をご紹介したいと思います。
なぜAWKなのか？
残念ながらAWKの知名度はあまり高くないようで、社内でも「なぜRubyでやらないのか？」と聞かれることがありました。僕も入社するまではcutの代わりぐらいにしか使っていなかったのですが、あるときログ出力の整形に使って以来、AWKのおもしろさにすっかりハマってしまいました。
AWKの魅力はいろいろとあるのですが、ひとつあげるとすれば「ワンライナーの書きやすさ」です。もちろんRubyでもPerlでもワンライナーは書けるのですが、AWKはさらにワンライナーが書きやすい言語です。
仕事での活用例
普段、僕が仕事で使っているAWKスクリプトをいくつかご紹介します。AWKの文法についてはGNU Awk User&#8217;s Guideなどを参照してください。
Railsの500msec以上かかっている処理を追いかける
後からRailsのログを集計してもよいのですが、その場で状況を知りたいときは tail -f と AWK の組み合わせが強力です。次の簡単なAWKスクリプトは、遅くなっている処理をさくっと把握したいときに使っています。

$ tail -f log/production.log &#124; ¥
 awk '/^Completed/{if($3 &#62; 0.5) print }'
Completed in 0.56046 (1 reqs/sec) &#124; Rendering: 0.23351 (41%) ...
Completed in 0.59227 (1 reqs/sec) &#124; Rendering: 0.00010 (0%) ...
Completed in 1.90438 (0 reqs/sec) &#124; Rendering: 1.87990 (98%) ...
...

Apacheの平均応答時間を追いかける
アクセスが多くなると tail -f でaccess_logを追いかけようとしても、流れが速すぎて状況を把握できません。そこでAWKで100リクエストごとの平均応答時間を計算して、現在の応答時間がどのくらいなのかを把握しています。

$ tail -f access_log &#124; awk [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=techlife.cookpad.com&blog=4985499&post=537&subd=cookpadtech&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>はじめまして。インフラチームの菅原といいます。</p>
<p>今年の7月に入社してから、コンソールとにらめっこする毎日を過ごしています。クックパッドのようにアクセスの多いサイトのサーバを扱うことが今まで無かったので、いろいろと勉強になることが多いです。</p>
<p>さて、インフラチームではサーバの状況をモニタリングして、サーバに問題がないかを常に把握するようにしています。そのため日常的にtailでログを追いかけているのですが、そんなときはAWKが非常に便利なことに気付き、最近はかなりAWKにハマっています。</p>
<p>今回は絶賛マイブーム中のAWKの活用例をご紹介したいと思います。</p>
<h3>なぜAWKなのか？</h3>
<p>残念ながらAWKの知名度はあまり高くないようで、社内でも「なぜRubyでやらないのか？」と聞かれることがありました。僕も入社するまではcutの代わりぐらいにしか使っていなかったのですが、あるときログ出力の整形に使って以来、AWKのおもしろさにすっかりハマってしまいました。</p>
<p>AWKの魅力はいろいろとあるのですが、ひとつあげるとすれば「ワンライナーの書きやすさ」です。もちろんRubyでもPerlでもワンライナーは書けるのですが、AWKはさらにワンライナーが書きやすい言語です。</p>
<h3>仕事での活用例</h3>
<p>普段、僕が仕事で使っているAWKスクリプトをいくつかご紹介します。AWKの文法については<a href="http://www.gnu.org/software/gawk/manual/gawk.html">GNU Awk User&#8217;s Guide</a>などを参照してください。</p>
<h3>Railsの500msec以上かかっている処理を追いかける</h3>
<p>後からRailsのログを集計してもよいのですが、その場で状況を知りたいときは tail -f と AWK の組み合わせが強力です。次の簡単なAWKスクリプトは、遅くなっている処理をさくっと把握したいときに使っています。</p>
<pre class="brush: bash;">
$ tail -f log/production.log | ¥
 awk '/^Completed/{if($3 &gt; 0.5) print }'
Completed in 0.56046 (1 reqs/sec) | Rendering: 0.23351 (41%) ...
Completed in 0.59227 (1 reqs/sec) | Rendering: 0.00010 (0%) ...
Completed in 1.90438 (0 reqs/sec) | Rendering: 1.87990 (98%) ...
...
</pre>
<h3>Apacheの平均応答時間を追いかける</h3>
<p>アクセスが多くなると tail -f でaccess_logを追いかけようとしても、流れが速すぎて状況を把握できません。そこでAWKで100リクエストごとの平均応答時間を計算して、現在の応答時間がどのくらいなのかを把握しています。</p>
<pre class="brush: bash;">
$ tail -f access_log | awk '
{i++; t+=$4}
i &gt; 100 {
  print strftime(&quot;%H:%M:%S&quot;), &quot;|&quot;, t / i / 1000, &quot;ms&quot;
  i=t=0
}'
18:58:34 | 97.1538 ms
18:58:38 | 80.6553 ms
18:58:42 | 75.4794 ms
</pre>
<p>ちなみにクックパッドのaccess_logは以下のようなフォーマットで出力されます。</p>
<pre class="brush: bash;">
# ステータス, 時間, 処理時間(マイクロ秒), リクエストuri, パラメータ...
LogFormat &quot;%&gt;s\t%{%Y-%m-%d %H:%M:%S}t\t%D\t%U\t%q...&quot;
</pre>
<p>上記のスクリプトを少し修正して、単位時間あたりのリクエスト数を出力するようにすると、サービスへどのくらいアクセスがあるのかを把握できるようになります。</p>
<pre class="brush: bash;">
[...]$ tail -f access_log | awk '
BEGIN{st=systime()}
{i++}
i &gt; 200 {
  et=systime()
  printf(&quot;%s | %.1f req/sec\n&quot;,
    strftime(&quot;%H:%M:%S&quot;),  i / (et - st))
  i=0; st=et
}'
19:10:45 | 16.8 req/sec
19:10:55 | 20.1 req/sec
19:11:06 | 18.3 req/sec
</pre>
<h3>slow-query.logを追いかける</h3>
<p>mysqldumpslowというスロークエリログ用のツールがありますが、その場で状況を知りたいときには tail -f で追いかけるのが手軽です。しかし、そのままでは少々見にくいので、次のようなAWKスクリプトで整形します。</p>
<pre class="brush: bash;">
[...]$ tail -f slow-query.log | awk '
/^# Time/ {
  q=substr(q,0,64)
  printf(&quot;%s %s %-17s %2d %s\n&quot;, d, t, h, s, q)
  d=$3; t=$4
}
/User/ {h=$5}
/Query_time/ {s=$3}
/^[^ ]/ {q=$0}'
091010 17:46:45 [192.168.xxx.xxx]   2 SELECT foo, bar, zoo FROM...
091010 17:55:29 [192.168.xxx.xxx]   3 SELECT foo FROM...
091010 17:56:08 [192.168.xxx.xxx]   3 SELECT foo FROM...
</pre>
<p>ANSIエスケープシーケンスを使えば、10秒以上かかったクエリだけ赤く表示することもできます。</p>
<pre class="brush: bash;">
awk '
/^# Time/ {
  if (s &gt; 9) {
    printf(&quot;33[0;31m&quot;)
  } else {
    q=substr(q,0,64)
  }
  printf(&quot;%s %s %-17s %2d %s\n&quot;, d, t, h, s, q)
  printf(&quot;33[0m&quot;)
  d=$3; t=$4
}
/User/ {h=$5}
/Query_time/ {s=$3}
/^[^ ]/ {q=$0}'
</pre>
<h3>まとめ</h3>
<p>今回は、仕事で使っているAWKスクリプトをいくつかご紹介させていただきました。僕もまだAWK初心者なのでお世辞にも洗練されたコードとはいえませんが、それでも非常に役に立っています。<br />
ちなみに、AWKのワンライナーには何か癖になるものがあり、最近はワンライナーばかり書いているので、historyがスクリプトの保存先と化しつつあります。</p>
<p>みなさんもAWKで一行野郎を使いこなしましょう！</p>
<h3>おまけ</h3>
<p>GNU Awkはソケットが使えるので、カレントディレクトリをDocumentRootとするWebサーバを、ワンライナーで書いてみました。</p>
<pre class="brush: bash;">
awk 'BEGIN{s=&quot;/inet/tcp/80/0/0&quot;;&quot;pwd&quot; |&amp; getline;r=$0;while((s |&amp; getline) &gt;; 0){gsub(/[\r\n]/,&quot;&quot;);if($0 ~ /^\s*$/){c=&quot;cat &quot; r path;printf &quot;HTTP/1.0 200 OK\r\n\r\n&quot; |&amp; s;while((c |&amp; getline) &gt; 0){print |&amp; s}close(c);close(s)}else if($0 ~ /HTTP/){print;path=$2}}}'
</pre>
<p>きちんと改行をいれるとこんな感じになります。</p>
<pre class="brush: bash;">
awk '
BEGIN {
  s = &quot;/inet/tcp/80/0/0&quot;
  &quot;pwd&quot; |&amp; getline
  r = $0

  while ((s |&amp; getline) &gt; 0) {
    gsub(/[\r\n]/, &quot;&quot;)

    if ($0 ~ /^\s*$/) {
      c = &quot;cat &quot; r path
      printf &quot;HTTP/1.0 200 OK\r\n\r\n&quot; |&amp; s

      while ((c |&amp; getline) &gt; 0) {
        print |&amp; s
      }

      close(c)
      close(s)
    } else if ($0 ~ /HTTP/){
      print
      path = $2
    }
  }
}'
</pre>
<p>AWKを使ったことがなくても、わかりやすいコードではないでしょうか？</p>
<p>GNU Awkのネットワーク機能はとても面白いです。AWKを始めた人には、<a href="http://www.gnu.org/software/gawk/manual/gawkinet/gawkinet.html">ネットワーク機能のマニュアル</a>を一読することをお薦めします。</p>
Posted in エンジニア日記  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/cookpadtech.wordpress.com/537/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/cookpadtech.wordpress.com/537/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/cookpadtech.wordpress.com/537/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/cookpadtech.wordpress.com/537/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/cookpadtech.wordpress.com/537/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/cookpadtech.wordpress.com/537/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/cookpadtech.wordpress.com/537/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/cookpadtech.wordpress.com/537/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/cookpadtech.wordpress.com/537/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/cookpadtech.wordpress.com/537/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=techlife.cookpad.com&blog=4985499&post=537&subd=cookpadtech&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://techlife.cookpad.com/2009/10/23/awk/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">cookpadtech</media:title>
		</media:content>
	</item>
		<item>
		<title>クックパッドとHadoop</title>
		<link>http://techlife.cookpad.com/2009/09/16/cookpad-hadoop-introduction/</link>
		<comments>http://techlife.cookpad.com/2009/09/16/cookpad-hadoop-introduction/#comments</comments>
		<pubDate>Wed, 16 Sep 2009 01:06:40 +0000</pubDate>
		<dc:creator>cookpadtech</dc:creator>
				<category><![CDATA[エンジニア日記]]></category>

		<guid isPermaLink="false">http://techlife.cookpad.com/?p=482</guid>
		<description><![CDATA[はじめまして。今年の5月に入社した勝間@さがすチームです。
入社してからは、なかなか大変なことも多いですが、最近はお酒好きが集まって月曜から飲み合う 「勝間会」なるものも発足して、仕事面でも仕事以外の面でも密度の高い毎日を過ごしています！
さて、僕は「さがす」チーム所属ということで、普段はレシピを「さがす」ユーザの満足度を上げるために、 クックパッドの検索まわりについて、いろいろな開発を行っています。 一方で、ユーザの「さがす欲求」について深く知るために、大規模なデータ解析を行い、欲求の分析を行う機会も増えてきました。
ところが、クックパッドのログは膨大な数があるので、一口のデータ解析と言っても通常のバッチ処理だと間に合わないため、 分散処理環境の必要性が高まってきました。 そこで、まずは手軽に試せる分散処理の王道ということで、最近ではHadoopを使ったデータ解析環境を整備しています。
そんな中、ちょうどtech lunchで発表の順番が僕に回ってきたので、いい機会なので 「そもそもHadoopって何？」ということや「Map &#38; Reduceを行っているとき、各プロセスは何をしているの？」な話をデモを含めながら発表してみました。 今回は、そのときの内容の資料と質疑応答の内容を共有したいと思います。
発表資料はこのようなものを利用しました。

その後は、このような質疑応答が行われました。
HDFSのNameNodeがボトルネックにはなりえないのか？
NameNodeは障害が起こると、HDFSのクラスタ全体が利用不能になるので、SPOFという観点で考えると、構成上どうしてもボトルネックになり得ます。
ただし、NameNodeが扱うメタデータを保護できれば、NameNodeに障害が起きても復旧できるため、次のような方法が提唱されています。

 メタデータについては、RAIDを組んで多重にディスクに書き込む。
または、NFSマウントされた領域にメタデータを書き込む。
SecondaryNameNodeはNameNodeのメタデータのバックアップを定期的にとっているため、NameNodeとSecondaryNameNodeを物理的に別ノードに分けて運用する。

また、NagiosやGangliaでモニタリングを行うことも可能で、ここから障害を検知することも可能です。
Hadoop MapReduceの処理コードはmasterにだけ置いておけば配布されるのか？
処理コードはMap&#38;Reduce実行時にmasterからslaveに配布することができます。もちろんあらかじめrsyncなどで配布しておく方法も取ることが出来ます。
HDFSの安定性は？
レプリケーションの数を増やすことで安定稼働されます。 バックアップ失敗を想定して、レプリケーション数は3以上が推奨されています。また、HDFSに対してファイルシステムチェックを行うことも可能です。
Hadoop MapReduceとHDFSを分けた方がリソースを効率的に使えるのでは？
そういう発想もありかと思いますが、Hadoop開発陣の方針として、基本的には標準的な設定の使用を推奨しているようです。
標準的な設定は、YahooやFacebookなど大規模に利用されているケースをベースにして設定されたものなので、これに習うのが結果的に一番安定して動作するのでしょう。
Taskを割り振るのに優先度が付けられるのか？
複数Jobを与えるときに、優先度を付けることができます。
UU測定のサンプルコードで、複数プロセス存在するはずのReduceがハッシュマップのようなオブジェクトをどうして持てるの？
ハッシュマップのようなキーごとに処理を行うオブジェクトを持つためには、Reducerはキーごとに同じノードが処理を行っている必要があります。このとき、Mapの出力を同じキーごとに同じグループに属するように分割できれば、Reduceは分割可能となります。
ここでの、「Mapの出力を、ソートし、Reduceに渡す」フェーズは「Shuffle」、「Reduceへの入力をキーに基づいてグループ化してまとめる」フェーズを「Sort」フェーズと呼びます。 HadoopではShuffleやSortは完全に隠蔽されているので開発者がこれらのコードを書くケースはありません。
つまり、今回のようなMapの出力がkeyごとに分割されている場合は、Shuffle, SortによってMapの出力を分割、グループ化してReduceが処理できるようになるのでうまく扱うことができます。
HDFSを画像サーバなどに利用できるのか？
HDFSからのレスポンスは特に速いわけではなく、転送速度がボトルネックになるので、画像サーバには向いていません。HDFSは、データの行き来がそれほど起こらない、ログデータのようなものの保存が最も適していると思います。 画像サーバを分散ストレージで検討する場合は、他のプロダクトを利用したほうがよさそうです。
HadoopはHDFSに特化してるのか？
Hadoopを利用する場合は、必ずしもHDFSしか使えないわけではないです。他にもAmazon S3, CloudStoreなんかの選択肢があります。実際は、HDFSが一番ポピュラーで標準的に利用されているので、今回はこれを試してみました。
Hiveたのしそうですね
試してみましたが、なかなかたのしいです。 RDBと親和性高く、Joinなんかもできるのは魅力的なので、導入を検討しています。
クックパッドではHadoopはどのように使われるの？
直近では、様々な条件下でのログ解析や、バックエンドのDB更新などに利用される予定です。
まとめ
クックパッドにおいてデータ解析の需要が高まってきたことで、Hadoopへの取り組みをまとめてみました。今後、本格導入していく際にはまた改めてエントリを上げたいと思います。
また、このような分散環境におけるデータ解析についてご興味ある方を、クックパッドでは募集しています！

[技術部] Webシステムエンジニア
[技術部] サーバシステムエンジニア

Posted in エンジニア日記       <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=techlife.cookpad.com&blog=4985499&post=482&subd=cookpadtech&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>はじめまして。今年の5月に入社した勝間@さがすチームです。</p>
<p>入社してからは、なかなか大変なことも多いですが、最近はお酒好きが集まって月曜から飲み合う 「勝間会」なるものも発足して、仕事面でも仕事以外の面でも密度の高い毎日を過ごしています！</p>
<p>さて、僕は「さがす」チーム所属ということで、普段はレシピを「さがす」ユーザの満足度を上げるために、 クックパッドの検索まわりについて、いろいろな開発を行っています。 一方で、ユーザの「さがす欲求」について深く知るために、大規模なデータ解析を行い、欲求の分析を行う機会も増えてきました。</p>
<p>ところが、クックパッドのログは膨大な数があるので、一口のデータ解析と言っても通常のバッチ処理だと間に合わないため、 分散処理環境の必要性が高まってきました。 そこで、まずは手軽に試せる分散処理の王道ということで、最近ではHadoopを使ったデータ解析環境を整備しています。</p>
<p>そんな中、ちょうどtech lunchで発表の順番が僕に回ってきたので、いい機会なので 「そもそもHadoopって何？」ということや「Map &amp; Reduceを行っているとき、各プロセスは何をしているの？」な話をデモを含めながら発表してみました。 今回は、そのときの内容の資料と質疑応答の内容を共有したいと思います。</p>
<p>発表資料はこのようなものを利用しました。</p>
<p><object type='application/x-shockwave-flash' wmode='transparent' data='http://static.slideshare.net/swf/ssplayer2.swf?id=1992982&#038;doc=techlife-2009-09-11-090913193034-phpapp01' width='480' height='394'><param name='movie' value='http://static.slideshare.net/swf/ssplayer2.swf?id=1992982&#038;doc=techlife-2009-09-11-090913193034-phpapp01' /><param name='allowFullScreen' value='true' /><param name='allowScriptAccess' value='always' /></object></p>
<p>その後は、このような質疑応答が行われました。</p>
<h3>HDFSのNameNodeがボトルネックにはなりえないのか？</h3>
<p>NameNodeは障害が起こると、HDFSのクラスタ全体が利用不能になるので、SPOFという観点で考えると、構成上どうしてもボトルネックになり得ます。<br />
ただし、NameNodeが扱うメタデータを保護できれば、NameNodeに障害が起きても復旧できるため、次のような方法が提唱されています。</p>
<ul style="list-style-type:disc;">
<li> メタデータについては、RAIDを組んで多重にディスクに書き込む。</li>
<li>または、NFSマウントされた領域にメタデータを書き込む。</li>
<li>SecondaryNameNodeはNameNodeのメタデータのバックアップを定期的にとっているため、NameNodeとSecondaryNameNodeを物理的に別ノードに分けて運用する。</li>
</ul>
<p>また、NagiosやGangliaでモニタリングを行うことも可能で、ここから障害を検知することも可能です。</p>
<h3>Hadoop MapReduceの処理コードはmasterにだけ置いておけば配布されるのか？</h3>
<p>処理コードはMap&amp;Reduce実行時にmasterからslaveに配布することができます。もちろんあらかじめrsyncなどで配布しておく方法も取ることが出来ます。</p>
<h3>HDFSの安定性は？</h3>
<p>レプリケーションの数を増やすことで安定稼働されます。 バックアップ失敗を想定して、レプリケーション数は3以上が推奨されています。また、HDFSに対してファイルシステムチェックを行うことも可能です。</p>
<h3>Hadoop MapReduceとHDFSを分けた方がリソースを効率的に使えるのでは？</h3>
<p>そういう発想もありかと思いますが、Hadoop開発陣の方針として、基本的には標準的な設定の使用を推奨しているようです。<br />
標準的な設定は、YahooやFacebookなど大規模に利用されているケースをベースにして設定されたものなので、これに習うのが結果的に一番安定して動作するのでしょう。</p>
<h3>Taskを割り振るのに優先度が付けられるのか？</h3>
<p>複数Jobを与えるときに、優先度を付けることができます。</p>
<h3>UU測定のサンプルコードで、複数プロセス存在するはずのReduceがハッシュマップのようなオブジェクトをどうして持てるの？</h3>
<p>ハッシュマップのようなキーごとに処理を行うオブジェクトを持つためには、Reducerはキーごとに同じノードが処理を行っている必要があります。このとき、Mapの出力を同じキーごとに同じグループに属するように分割できれば、Reduceは分割可能となります。</p>
<p>ここでの、「Mapの出力を、ソートし、Reduceに渡す」フェーズは「Shuffle」、「Reduceへの入力をキーに基づいてグループ化してまとめる」フェーズを「Sort」フェーズと呼びます。 HadoopではShuffleやSortは完全に隠蔽されているので開発者がこれらのコードを書くケースはありません。</p>
<p>つまり、今回のようなMapの出力がkeyごとに分割されている場合は、Shuffle, SortによってMapの出力を分割、グループ化してReduceが処理できるようになるのでうまく扱うことができます。</p>
<h3>HDFSを画像サーバなどに利用できるのか？</h3>
<p>HDFSからのレスポンスは特に速いわけではなく、転送速度がボトルネックになるので、画像サーバには向いていません。HDFSは、データの行き来がそれほど起こらない、ログデータのようなものの保存が最も適していると思います。 画像サーバを分散ストレージで検討する場合は、他のプロダクトを利用したほうがよさそうです。</p>
<h3>HadoopはHDFSに特化してるのか？</h3>
<p>Hadoopを利用する場合は、必ずしもHDFSしか使えないわけではないです。他にもAmazon S3, CloudStoreなんかの選択肢があります。実際は、HDFSが一番ポピュラーで標準的に利用されているので、今回はこれを試してみました。</p>
<h3>Hiveたのしそうですね</h3>
<p>試してみましたが、なかなかたのしいです。 RDBと親和性高く、Joinなんかもできるのは魅力的なので、導入を検討しています。</p>
<h3>クックパッドではHadoopはどのように使われるの？</h3>
<p>直近では、様々な条件下でのログ解析や、バックエンドのDB更新などに利用される予定です。</p>
<h3>まとめ</h3>
<p>クックパッドにおいてデータ解析の需要が高まってきたことで、Hadoopへの取り組みをまとめてみました。今後、本格導入していく際にはまた改めてエントリを上げたいと思います。</p>
<p>また、このような分散環境におけるデータ解析についてご興味ある方を、クックパッドでは募集しています！</p>
<ul style="list-style-type:disc;">
<li><a href="http://info.cookpad.com/web_engineer">[技術部] Webシステムエンジニア</a></li>
<li><a href="http://info.cookpad.com/network_engineer">[技術部] サーバシステムエンジニア</a></li>
</ul>
Posted in エンジニア日記  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/cookpadtech.wordpress.com/482/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/cookpadtech.wordpress.com/482/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/cookpadtech.wordpress.com/482/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/cookpadtech.wordpress.com/482/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/cookpadtech.wordpress.com/482/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/cookpadtech.wordpress.com/482/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/cookpadtech.wordpress.com/482/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/cookpadtech.wordpress.com/482/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/cookpadtech.wordpress.com/482/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/cookpadtech.wordpress.com/482/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=techlife.cookpad.com&blog=4985499&post=482&subd=cookpadtech&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://techlife.cookpad.com/2009/09/16/cookpad-hadoop-introduction/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">cookpadtech</media:title>
		</media:content>
	</item>
		<item>
		<title>クックパッドのバッチシステム</title>
		<link>http://techlife.cookpad.com/2009/08/18/batch_on_cookpad/</link>
		<comments>http://techlife.cookpad.com/2009/08/18/batch_on_cookpad/#comments</comments>
		<pubDate>Tue, 18 Aug 2009 08:46:19 +0000</pubDate>
		<dc:creator>cookpadtech</dc:creator>
				<category><![CDATA[エンジニア日記]]></category>

		<guid isPermaLink="false">http://techlife.cookpad.com/?p=435</guid>
		<description><![CDATA[こんにちはみなさん、とんかつってうまいですし目黒のとんきは哲学ですよね、8/1付けで商品部エンジニアになったnegipoです。すてきな上司とかわいい同僚に囲まれてとても幸せです！
さて、今回はクックパッドのバックエンドで動いているバッチシステムの紹介スライドを共有します。

大事なことは全部かいてあるので読んで下さい。
けっこう大胆な修正が入っていますが、なんとか趣旨をよみとってもらえるとうれしいです。
という訳で、クックパッドでは2週間に1度みんなでお昼ごはんを食べながら一人のエンジニアが何かをしゃべる、&#8221;tech lunch&#8221;というものを開始しました。技術部はもちろん、商品部や編集部のディレクターなど多岐にわたる人たちがクックパッドがどうやって動いているか、将来どうなっていくのかという話にふむふむと頷いています。
今後このtech lunchで共有された技術的な内容は、順次この開発者ブログに掲載していく予定です。皆様のお役に立つ情報がどんどん集まればよいなと思います。
今後ともクックパッド開発者ブログをよろしくお願いします。
Posted in エンジニア日記       <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=techlife.cookpad.com&blog=4985499&post=435&subd=cookpadtech&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>こんにちはみなさん、とんかつってうまいですし目黒のとんきは哲学ですよね、8/1付けで商品部エンジニアになったnegipoです。すてきな上司とかわいい同僚に囲まれてとても幸せです！</p>
<p>さて、今回はクックパッドのバックエンドで動いているバッチシステムの紹介スライドを共有します。<br />
<object type='application/x-shockwave-flash' wmode='transparent' data='http://static.slideshare.net/swf/ssplayer2.swf?id=1875470&#038;doc=090527-090818033920-phpapp01' width='480' height='394'><param name='movie' value='http://static.slideshare.net/swf/ssplayer2.swf?id=1875470&#038;doc=090527-090818033920-phpapp01' /><param name='allowFullScreen' value='true' /><param name='allowScriptAccess' value='always' /></object><br />
大事なことは全部かいてあるので読んで下さい。<br />
けっこう大胆な修正が入っていますが、なんとか趣旨をよみとってもらえるとうれしいです。</p>
<p>という訳で、クックパッドでは2週間に1度みんなでお昼ごはんを食べながら一人のエンジニアが何かをしゃべる、&#8221;tech lunch&#8221;というものを開始しました。技術部はもちろん、商品部や編集部のディレクターなど多岐にわたる人たちがクックパッドがどうやって動いているか、将来どうなっていくのかという話にふむふむと頷いています。<br />
今後このtech lunchで共有された技術的な内容は、順次この開発者ブログに掲載していく予定です。皆様のお役に立つ情報がどんどん集まればよいなと思います。<br />
今後ともクックパッド開発者ブログをよろしくお願いします。</p>
Posted in エンジニア日記  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/cookpadtech.wordpress.com/435/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/cookpadtech.wordpress.com/435/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/cookpadtech.wordpress.com/435/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/cookpadtech.wordpress.com/435/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/cookpadtech.wordpress.com/435/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/cookpadtech.wordpress.com/435/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/cookpadtech.wordpress.com/435/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/cookpadtech.wordpress.com/435/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/cookpadtech.wordpress.com/435/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/cookpadtech.wordpress.com/435/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=techlife.cookpad.com&blog=4985499&post=435&subd=cookpadtech&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://techlife.cookpad.com/2009/08/18/batch_on_cookpad/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">cookpadtech</media:title>
		</media:content>
	</item>
		<item>
		<title>Art of the Ruby Proxy for Scale, Performance, and Monitoring (RailsConf2009レポート)</title>
		<link>http://techlife.cookpad.com/2009/05/10/ruby-proxy/</link>
		<comments>http://techlife.cookpad.com/2009/05/10/ruby-proxy/#comments</comments>
		<pubDate>Sun, 10 May 2009 09:22:53 +0000</pubDate>
		<dc:creator>cookpadtech</dc:creator>
				<category><![CDATA[RailsConf2009]]></category>

		<guid isPermaLink="false">http://techlife.cookpad.com/?p=390</guid>
		<description><![CDATA[こんにちは、高田悟史です。クラウドとかスケールとかそういうインフラよりのセッションを選んで参加しています。
今回は、Ilya Grigorik氏によるセッションArt of the Ruby Proxy for Scale, Performance, and Monitoringのレポートです。
スライドは下記のアドレスで参照できます。
http://www.slideshare.net/igrigorik/ruby-proxies-for-scale-performance-and-monitoring-gogaruco-igvitacom-1396734
本セッションは、プロキシラブという同氏によるプロキシのすすめともいうべき発表でした。静的ページのキャッシュという本来の機能だけではなく、ロードバランサーとして使うということはありますが、もう少し踏み込んだ使い方をしてみようというお話です。
例えば、一つのリクエストをproductionとstagingの両方にプロキシして(もちろん返すのはproductionのレスポンスだけ)、stagingのベンチマークをしたりだとか、ログを採集してリアルタイムに監視したり、あるいはデータそのものをダイナミックに書き換えたり、などになります。採集したログを元に、パフォーマンステストを行うためにautoperfというツールも紹介されていました。
そして、ポイントは、このようなことが、同氏作のEM-Proxyというライブラリを使うことで簡単に実装可能だということでした。このライブラリはRuby製なので、やはりパフォーマンスが気になるところですが、EventMachineを使ってイベント駆動になっているので、ほとんど影響はないとのことでした。
同氏のブログエントリRuby Proxies for Scale and Monitoringも参考にして下さい。
プロキシをミドルウェアとして機能を持たせるというのはおもしろいし、それを慣れ親しんだRubyで実装できるというのはかなり魅力的だと思います。ただ、やっぱりパフォーマンスに関しては実際に試してみないと気になります。プロキシに持たせる機能のアイデアとパフォーマンス等のデメリット(メンテナンスコストが上がるなど)の天秤だとは思いますが、今後は、発生した問題の解決策として「プロキシサーバーに実装してしまおう」という選択肢が増えたのは良いですね。
Posted in RailsConf2009       <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=techlife.cookpad.com&blog=4985499&post=390&subd=cookpadtech&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>こんにちは、高田悟史です。クラウドとかスケールとかそういうインフラよりのセッションを選んで参加しています。</p>
<p>今回は、Ilya Grigorik氏によるセッション<a href="http://en.oreilly.com/rails2009/public/schedule/detail/7967">Art of the Ruby Proxy for Scale, Performance, and Monitoring</a>のレポートです。</p>
<p>スライドは下記のアドレスで参照できます。<br />
<a href="http://www.slideshare.net/igrigorik/ruby-proxies-for-scale-performance-and-monitoring-gogaruco-igvitacom-1396734">http://www.slideshare.net/igrigorik/ruby-proxies-for-scale-<br />performance-and-monitoring-gogaruco-igvitacom-1396734</a></p>
<p>本セッションは、プロキシラブという同氏によるプロキシのすすめともいうべき発表でした。静的ページのキャッシュという本来の機能だけではなく、ロードバランサーとして使うということはありますが、もう少し踏み込んだ使い方をしてみようというお話です。</p>
<p>例えば、一つのリクエストをproductionとstagingの両方にプロキシして(もちろん返すのはproductionのレスポンスだけ)、stagingのベンチマークをしたりだとか、ログを採集してリアルタイムに監視したり、あるいはデータそのものをダイナミックに書き換えたり、などになります。採集したログを元に、パフォーマンステストを行うために<a href="http://github.com/igrigorik/autoperf">autoperf</a>というツールも紹介されていました。</p>
<p>そして、ポイントは、このようなことが、同氏作の<a href="http://github.com/igrigorik/em-proxy">EM-Proxy</a>というライブラリを使うことで簡単に実装可能だということでした。このライブラリはRuby製なので、やはりパフォーマンスが気になるところですが、<a href="http://rubyeventmachine.com/">EventMachine</a>を使ってイベント駆動になっているので、ほとんど影響はないとのことでした。</p>
<p>同氏のブログエントリ<a href="http://www.igvita.com/2009/04/20/ruby-proxies-for-scale-and-monitoring/">Ruby Proxies for Scale and Monitoring</a>も参考にして下さい。</p>
<p>プロキシをミドルウェアとして機能を持たせるというのはおもしろいし、それを慣れ親しんだRubyで実装できるというのはかなり魅力的だと思います。ただ、やっぱりパフォーマンスに関しては実際に試してみないと気になります。プロキシに持たせる機能のアイデアとパフォーマンス等のデメリット(メンテナンスコストが上がるなど)の天秤だとは思いますが、今後は、発生した問題の解決策として「プロキシサーバーに実装してしまおう」という選択肢が増えたのは良いですね。</p>
Posted in RailsConf2009  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/cookpadtech.wordpress.com/390/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/cookpadtech.wordpress.com/390/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/cookpadtech.wordpress.com/390/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/cookpadtech.wordpress.com/390/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/cookpadtech.wordpress.com/390/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/cookpadtech.wordpress.com/390/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/cookpadtech.wordpress.com/390/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/cookpadtech.wordpress.com/390/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/cookpadtech.wordpress.com/390/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/cookpadtech.wordpress.com/390/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=techlife.cookpad.com&blog=4985499&post=390&subd=cookpadtech&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://techlife.cookpad.com/2009/05/10/ruby-proxy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">cookpadtech</media:title>
		</media:content>
	</item>
		<item>
		<title>UI Fundamentals for Programmers (RailsConf2009レポート)</title>
		<link>http://techlife.cookpad.com/2009/05/06/ui-fundamentals-for-programmers-railsconf2009/</link>
		<comments>http://techlife.cookpad.com/2009/05/06/ui-fundamentals-for-programmers-railsconf2009/#comments</comments>
		<pubDate>Wed, 06 May 2009 23:59:06 +0000</pubDate>
		<dc:creator>cookpadtech</dc:creator>
				<category><![CDATA[RailsConf2009]]></category>

		<guid isPermaLink="false">http://techlife.cookpad.com/?p=362</guid>
		<description><![CDATA[&#171;RailsConf2009のレポート一覧
開発とデザイナー的ポジションを兼務してます須藤です。
railsconf２日目、37signalsのデザイナーRyan Singerのセッションに参加しました。
「UI FUNDAMENTALS FOR PROGRAMMERS」と題したこのセッションはかなりの人気のようで、用意された大きめの会場でも立ち見が出る程の盛況ぶりでした。
曰く、UI設計を行なうときにModeling,Screens,Actions,Templatesの4つが重要ということでした。
まずModelingですが、UIはソフトウェアレイヤの一番表側にあり独立して存在している訳ではないということ、但しユーザーから見ればUIが全てでありソフトウェアの設計はUIから（必要なものから）始めなければならないと言っていました。
最終的なインターフェースに適したなモデル設計をすべきという話もしていて、プログラマ脳とデザイナー脳を交互に使って仕事をしている自分としては、とても共感できる内容でした。
どのメソッドをどのコントローラに書くべきか、どの部分をどういう規則に基づいてpartialに切り出すかなど、普段なんとなくやってしまう事が多いですが、最終的なUIによって決定すべきというのは斬新かつ納得できる話でした。
2つ目のScreensでは、ページ内の各要素がきちんとデザインされることによってどのような印象となるのか、とても分かり易いきれいなスライドを用いて具体的に説明していました。
ジャンプ率や版面率、情報の分類毎に取るべき適切な余白、コントラストによる視認性・操作性の優劣などといった、デザイナーならではの内容でした。
見出し、本文、サイドバー、ボタンリンクを含んだサンプルページをいくつか表示しながら、各要素のデザインが与える操作への影響について説明していました。
その他、Actionsの項では、「every action has a beginning middle and an end」というテーマで、一つのアクションが完結するまでのユーザービリティ的な配慮を、Templatesの項では「NO HTML in HELPERS DONT BE CLEVER」「CSS and JS follow the same REST-inspired naming conventions」といったテーマを掲げ、ヘルパーの使い方や、静的ファイルの管理方法について説明していました。
今回プログラマーの視点でこのセッションを聞いていましたが、こういうことを体系的語れるデザイナーは本当に少なく、プログラマーとデザイナーがなかなか歩み寄れない様な状況を解決するヒントを得たような気がしました。
自分の目指すべき方向性も再確認でき、とても楽しい時間を過ごせました。
Posted in RailsConf2009       <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=techlife.cookpad.com&blog=4985499&post=362&subd=cookpadtech&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><a href="http://techlife.cookpad.com/category/RailsConf2009/">&laquo;RailsConf2009のレポート一覧</a></p>
<p>開発とデザイナー的ポジションを兼務してます須藤です。<br />
railsconf２日目、37signalsのデザイナーRyan Singerのセッションに参加しました。</p>
<p>「UI FUNDAMENTALS FOR PROGRAMMERS」と題したこのセッションはかなりの人気のようで、用意された大きめの会場でも立ち見が出る程の盛況ぶりでした。</p>
<p>曰く、UI設計を行なうときにModeling,Screens,Actions,Templatesの4つが重要ということでした。</p>
<p>まずModelingですが、UIはソフトウェアレイヤの一番表側にあり独立して存在している訳ではないということ、但しユーザーから見ればUIが全てでありソフトウェアの設計はUIから（必要なものから）始めなければならないと言っていました。<br />
最終的なインターフェースに適したなモデル設計をすべきという話もしていて、プログラマ脳とデザイナー脳を交互に使って仕事をしている自分としては、とても共感できる内容でした。<br />
どのメソッドをどのコントローラに書くべきか、どの部分をどういう規則に基づいてpartialに切り出すかなど、普段なんとなくやってしまう事が多いですが、最終的なUIによって決定すべきというのは斬新かつ納得できる話でした。</p>
<p>2つ目のScreensでは、ページ内の各要素がきちんとデザインされることによってどのような印象となるのか、とても分かり易いきれいなスライドを用いて具体的に説明していました。<br />
ジャンプ率や版面率、情報の分類毎に取るべき適切な余白、コントラストによる視認性・操作性の優劣などといった、デザイナーならではの内容でした。<br />
見出し、本文、サイドバー、ボタンリンクを含んだサンプルページをいくつか表示しながら、各要素のデザインが与える操作への影響について説明していました。</p>
<p>その他、Actionsの項では、「every action has a beginning middle and an end」というテーマで、一つのアクションが完結するまでのユーザービリティ的な配慮を、Templatesの項では「NO HTML in HELPERS DONT BE CLEVER」「CSS and JS follow the same REST-inspired naming conventions」といったテーマを掲げ、ヘルパーの使い方や、静的ファイルの管理方法について説明していました。</p>
<p>今回プログラマーの視点でこのセッションを聞いていましたが、こういうことを体系的語れるデザイナーは本当に少なく、プログラマーとデザイナーがなかなか歩み寄れない様な状況を解決するヒントを得たような気がしました。<br />
自分の目指すべき方向性も再確認でき、とても楽しい時間を過ごせました。</p>
Posted in RailsConf2009  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/cookpadtech.wordpress.com/362/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/cookpadtech.wordpress.com/362/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/cookpadtech.wordpress.com/362/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/cookpadtech.wordpress.com/362/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/cookpadtech.wordpress.com/362/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/cookpadtech.wordpress.com/362/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/cookpadtech.wordpress.com/362/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/cookpadtech.wordpress.com/362/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/cookpadtech.wordpress.com/362/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/cookpadtech.wordpress.com/362/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=techlife.cookpad.com&blog=4985499&post=362&subd=cookpadtech&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://techlife.cookpad.com/2009/05/06/ui-fundamentals-for-programmers-railsconf2009/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">cookpadtech</media:title>
		</media:content>
	</item>
		<item>
		<title>Quality Code with Cucumber (RailsConf2009レポート)</title>
		<link>http://techlife.cookpad.com/2009/05/06/quality-code-with-cucumber-railsconf/</link>
		<comments>http://techlife.cookpad.com/2009/05/06/quality-code-with-cucumber-railsconf/#comments</comments>
		<pubDate>Wed, 06 May 2009 17:43:49 +0000</pubDate>
		<dc:creator>cookpadtech</dc:creator>
				<category><![CDATA[RailsConf2009]]></category>

		<guid isPermaLink="false">http://techlife.cookpad.com/?p=320</guid>
		<description><![CDATA[&#171;RailsConf2009のレポート一覧
こんばんは。ホテルの廊下にかかっている絵がみんな猥雑でRails hackerに与えられる心理的な影響の心配をしている根岸です。
本稿はCucumberのdeveloperであるAslak Hellesøyさんの講演内容のレポートです。
講演資料は下記のアドレスにアップロードされています。
[講演資料]
現在85人のコミッタがいるtesting frameworkであるCucumberの理念と概略がプレゼンされていました。
CucumberはBDD(Behavior Driven Development &#8211; ビヘイビア駆動開発)を実現するソフトウェアです。なんらかのアプリケーションを書く際にはビヘイビア、つまり要求仕様を特定してから開発することになりますが、Cucumberの実現するBDDは、その要求仕様通りにクライアントアプリケーションが動いているかどうかをチェックしながら行う開発です。
要求仕様をCucumberでは
given(元々の条件は何か) -when(さらに何が行われるのか)-&#62; then(何が起こるのか)
という単純なグラフで多くのパターンを記述することにより実装可能としています。
Cucumberでは二種類のファイルで要求仕様が記述されます。
・feature
featureファイルでは振る舞いテストのシナリオを、先述したGiven, When, Thenの他に、追記を示すAndを加えて自然言語に近い形式で記述でき、また入力値の一部を動的に変更可能とすることでコードの重複を押さえることができます。
・step
stepファイルではfeatureで記述された内容の結果、アプリケーション側でどのような操作が行われるのかを正規表現ベースで記述します。ここでのアプリケーションに対するアクセスの記述方式の一部はWebratというrubygemによって実装されており、Webratの作者は今日のruby heroes awardの受賞者でもあります。
上記の内容はかなりはしょったCucumberの記述方式ですが、他にもフックが実装されていたり、また他のユニットテスト用のプラグイン(RspecやShoulda)をstep内で使うことができるなど、BDDを容易に行うための機能は揃っているように感じました。詳細仕様はdocumentを参照してほしいこと、また昨日の発表に添付されていたRailsプロジェクトで、本体のコードはともかくなかなか凝ったテストがCucumberで書かれているように思えたので参考にしてみて下さい。帰ってきたhtmlの検証をNokogiriでやるのは鉄板ぽいです。
さて最後に感想ですが、Cucumber、すげえいいと思います。今回のRailsConfは薄目で眺めるとtesting! testing! testing! refactoring! testing!と言った感じで、やはりかなりエンタープライズな用途(と、プログラマの幸せ)を意識した印象があるのですが、我々がクックパッドを開発するときの強くユーザを意識した姿勢は、outside-inな思想を持つCucumberとはかなり相性が良いと考えています。今後の開発体制作りの中でもかなり注目されるツールの一つとなるでしょう。
Posted in RailsConf2009       <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=techlife.cookpad.com&blog=4985499&post=320&subd=cookpadtech&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><a href="http://techlife.cookpad.com/category/RailsConf2009/">&laquo;RailsConf2009のレポート一覧</a></p>
<p>こんばんは。ホテルの廊下にかかっている絵がみんな猥雑でRails hackerに与えられる心理的な影響の心配をしている根岸です。<br />
本稿は<a href="http://cukes.info/" target="_blank">Cucumber</a>のdeveloperである<a href="http://twitter.com/aslak_hellesoy" target="_blank">Aslak Hellesøy</a>さんの講演内容のレポートです。</p>
<p>講演資料は下記のアドレスにアップロードされています。<br />
<a href="http://assets.en.oreilly.com/1/event/24/Quality%20Code%20with%20Cucumber%20Presentation.pdf" target="_blank">[講演資料]</a><br />
現在85人のコミッタがいるtesting frameworkであるCucumberの理念と概略がプレゼンされていました。</p>
<p>CucumberはBDD(Behavior Driven Development &#8211; ビヘイビア駆動開発)を実現するソフトウェアです。なんらかのアプリケーションを書く際にはビヘイビア、つまり要求仕様を特定してから開発することになりますが、Cucumberの実現するBDDは、その要求仕様通りにクライアントアプリケーションが動いているかどうかをチェックしながら行う開発です。<br />
要求仕様をCucumberでは<br />
given(元々の条件は何か) -when(さらに何が行われるのか)-&gt; then(何が起こるのか)<br />
という単純なグラフで多くのパターンを記述することにより実装可能としています。</p>
<p>Cucumberでは二種類のファイルで要求仕様が記述されます。<br />
・feature<br />
featureファイルでは振る舞いテストのシナリオを、先述したGiven, When, Thenの他に、追記を示すAndを加えて自然言語に近い形式で記述でき、また入力値の一部を動的に変更可能とすることでコードの重複を押さえることができます。<br />
・step<br />
stepファイルではfeatureで記述された内容の結果、アプリケーション側でどのような操作が行われるのかを正規表現ベースで記述します。ここでのアプリケーションに対するアクセスの記述方式の一部はWebratというrubygemによって実装されており、Webratの作者は今日のruby heroes awardの受賞者でもあります。</p>
<p>上記の内容はかなりはしょったCucumberの記述方式ですが、他にもフックが実装されていたり、また他のユニットテスト用のプラグイン(RspecやShoulda)をstep内で使うことができるなど、BDDを容易に行うための機能は揃っているように感じました。詳細仕様は<a href="http://wiki.github.com/aslakhellesoy/cucumber" target="_blank">document</a>を参照してほしいこと、また<a href="http://techlife.cookpad.com/2009/05/05/testing-design-and-refactoring-railsconf/">昨日の発表</a>に添付されていたRailsプロジェクトで、本体のコードはともかくなかなか凝ったテストがCucumberで書かれているように思えたので参考にしてみて下さい。帰ってきたhtmlの検証をNokogiriでやるのは鉄板ぽいです。</p>
<p>さて最後に感想ですが、Cucumber、すげえいいと思います。今回のRailsConfは薄目で眺めるとtesting! testing! testing! refactoring! testing!と言った感じで、やはりかなりエンタープライズな用途(と、プログラマの幸せ)を意識した印象があるのですが、我々がクックパッドを開発するときの強くユーザを意識した姿勢は、outside-inな思想を持つCucumberとはかなり相性が良いと考えています。今後の開発体制作りの中でもかなり注目されるツールの一つとなるでしょう。</p>
Posted in RailsConf2009  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/cookpadtech.wordpress.com/320/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/cookpadtech.wordpress.com/320/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/cookpadtech.wordpress.com/320/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/cookpadtech.wordpress.com/320/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/cookpadtech.wordpress.com/320/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/cookpadtech.wordpress.com/320/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/cookpadtech.wordpress.com/320/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/cookpadtech.wordpress.com/320/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/cookpadtech.wordpress.com/320/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/cookpadtech.wordpress.com/320/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=techlife.cookpad.com&blog=4985499&post=320&subd=cookpadtech&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://techlife.cookpad.com/2009/05/06/quality-code-with-cucumber-railsconf/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">cookpadtech</media:title>
		</media:content>
	</item>
		<item>
		<title>DHHのキーノート (RailsConf2009レポート)</title>
		<link>http://techlife.cookpad.com/2009/05/06/dhhkeynote-railsconf2009/</link>
		<comments>http://techlife.cookpad.com/2009/05/06/dhhkeynote-railsconf2009/#comments</comments>
		<pubDate>Wed, 06 May 2009 16:38:24 +0000</pubDate>
		<dc:creator>cookpadtech</dc:creator>
				<category><![CDATA[RailsConf2009]]></category>

		<guid isPermaLink="false">http://techlife.cookpad.com/2009/05/06/343/</guid>
		<description><![CDATA[&#171;RailsConf2009のレポート一覧
@hashikemです。
RailsConf 二日目の朝は、DHHのキーノートでした。
Railsの歴史的な話や、Rails3のポリシーや新機能の紹介などがあったのですが、 個人的に響いたのは最後に話していた創造性についての話しでした。
DHH曰く、創造性の鍵になるのはずばり「要求の再調整(to renegotiate requirement)」とのことです。
彼が好きなベルギーチョコレートを例に出して、大好きなのだけれど、手にいれるのは大変。 じゃあ、本当にベルギーチョコが欲しいのか、チョコレートならいいのか、もっとどこでも 手に入るTwixでも満足できるのかといった調整が大切ということでした。
これって、実はクックパッドの日常の仕事の中でも日々気をつけていることで、必用だと思っていることを、 どうして必用なのかをつきつめていくと、最初に思っていたこととは全く違うことが重要だったということが良くあります。
創造性については、質と時間の二つの軸で考える必用があるのですが、 ベルギーチョコレートが質に関する話だとしたら、時間軸についての話しもしていました。 面白かったのは、時間軸とモチベーションの高さを関連付けていること。高いモチベーションを保てる時間は とても短くて、その高いモチベーションの間にできることになるように、再調整することが重要とのことです。
聴衆からの質問に答えて、The greatest danger is too much time. と言いきっていたのが、印象的でした。
この創造性についての考え方はクックパッドにも非常に近くて、cookpad.com のフレームワークとして Ruby on Rails を選択したのは、こういった匂いを感じたからだったなと思い出しました。
Posted in RailsConf2009       <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=techlife.cookpad.com&blog=4985499&post=343&subd=cookpadtech&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><a href="http://techlife.cookpad.com/category/RailsConf2009/">&laquo;RailsConf2009のレポート一覧</a></p>
<p>@hashikemです。</p>
<p>RailsConf 二日目の朝は、DHHのキーノートでした。</p>
<p>Railsの歴史的な話や、Rails3のポリシーや新機能の紹介などがあったのですが、 個人的に響いたのは最後に話していた創造性についての話しでした。</p>
<p>DHH曰く、創造性の鍵になるのはずばり「要求の再調整(to renegotiate requirement)」とのことです。</p>
<p>彼が好きなベルギーチョコレートを例に出して、大好きなのだけれど、手にいれるのは大変。 じゃあ、本当にベルギーチョコが欲しいのか、チョコレートならいいのか、もっとどこでも 手に入るTwixでも満足できるのかといった調整が大切ということでした。</p>
<p>これって、実はクックパッドの日常の仕事の中でも日々気をつけていることで、必用だと思っていることを、 どうして必用なのかをつきつめていくと、最初に思っていたこととは全く違うことが重要だったということが良くあります。</p>
<p>創造性については、質と時間の二つの軸で考える必用があるのですが、 ベルギーチョコレートが質に関する話だとしたら、時間軸についての話しもしていました。 面白かったのは、時間軸とモチベーションの高さを関連付けていること。高いモチベーションを保てる時間は とても短くて、その高いモチベーションの間にできることになるように、再調整することが重要とのことです。</p>
<p>聴衆からの質問に答えて、The greatest danger is too much time. と言いきっていたのが、印象的でした。</p>
<p>この創造性についての考え方はクックパッドにも非常に近くて、cookpad.com のフレームワークとして Ruby on Rails を選択したのは、こういった匂いを感じたからだったなと思い出しました。</p>
Posted in RailsConf2009  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/cookpadtech.wordpress.com/343/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/cookpadtech.wordpress.com/343/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/cookpadtech.wordpress.com/343/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/cookpadtech.wordpress.com/343/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/cookpadtech.wordpress.com/343/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/cookpadtech.wordpress.com/343/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/cookpadtech.wordpress.com/343/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/cookpadtech.wordpress.com/343/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/cookpadtech.wordpress.com/343/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/cookpadtech.wordpress.com/343/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=techlife.cookpad.com&blog=4985499&post=343&subd=cookpadtech&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://techlife.cookpad.com/2009/05/06/dhhkeynote-railsconf2009/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">cookpadtech</media:title>
		</media:content>
	</item>
		<item>
		<title>The Gilt Effect: Handling 1000 Shopping Cart Updates per second in Rails (RailsConf2009レポート)</title>
		<link>http://techlife.cookpad.com/2009/05/06/the-gilt-effect-railsconf2009/</link>
		<comments>http://techlife.cookpad.com/2009/05/06/the-gilt-effect-railsconf2009/#comments</comments>
		<pubDate>Wed, 06 May 2009 15:16:09 +0000</pubDate>
		<dc:creator>cookpadtech</dc:creator>
				<category><![CDATA[RailsConf2009]]></category>

		<guid isPermaLink="false">http://techlife.cookpad.com/?p=334</guid>
		<description><![CDATA[&#171;RailsConf2009のレポート一覧
@hashikemです。
秒間1000回更新されるシステムの発表ということで、興味深々で聞いてきました。
高級ブランドの招待制ファミリーセールのサイト「ギルトグループ」のシステムについての発表でした。
ギルトグループでは、決った時間のみのセールなどを行なうため、短い時間にショッピングカートの更新が集中します。 20秒間に、20万人が使用することもあるそうです。 1秒間に、1000リクエストのアップデートを処理するために、以下のような技術を使用しています。

自前のCDNを構築してキャッシュデータを載せる
トランザクションの処理をスケールするために、JRuby + EC2 + SQS + Rails のシステムを、EC2上に構築
商品をショッピングカートに入れる処理を扱うために、商品毎にDBサーバを分割。ここでは、H2 DBも使用。

スケールに対応するための新しい技術をうまく組み合わせて使っています。
また、今回のカンファレンスでは、ここのシステムのように、スケールに対応するために積極的にクラウドの技術を 導入している発表が、数多く見られました。さらに、ギルトグループでは、$100Mの売り上げを得てもいるとのことで、スケールに対応するための新しい技術を用いて成功している好例だと思います。
これまでギルトグループについては良く知らなかったのですが、技術駆動型の企業として今後も見習っていきたいと思います。
Posted in RailsConf2009       <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=techlife.cookpad.com&blog=4985499&post=334&subd=cookpadtech&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><a href="http://techlife.cookpad.com/category/RailsConf2009/">&laquo;RailsConf2009のレポート一覧</a></p>
<p>@hashikemです。</p>
<p>秒間1000回更新されるシステムの発表ということで、興味深々で聞いてきました。</p>
<p>高級ブランドの招待制ファミリーセールのサイト「ギルトグループ」のシステムについての発表でした。</p>
<p>ギルトグループでは、決った時間のみのセールなどを行なうため、短い時間にショッピングカートの更新が集中します。 20秒間に、20万人が使用することもあるそうです。 1秒間に、1000リクエストのアップデートを処理するために、以下のような技術を使用しています。</p>
<ul>
<li>自前のCDNを構築してキャッシュデータを載せる</li>
<li>トランザクションの処理をスケールするために、JRuby + EC2 + SQS + Rails のシステムを、EC2上に構築</li>
<li>商品をショッピングカートに入れる処理を扱うために、商品毎にDBサーバを分割。ここでは、H2 DBも使用。</li>
</ul>
<p>スケールに対応するための新しい技術をうまく組み合わせて使っています。</p>
<p>また、今回のカンファレンスでは、ここのシステムのように、スケールに対応するために積極的にクラウドの技術を 導入している発表が、数多く見られました。さらに、ギルトグループでは、$100Mの売り上げを得てもいるとのことで、スケールに対応するための新しい技術を用いて成功している好例だと思います。</p>
<p>これまでギルトグループについては良く知らなかったのですが、技術駆動型の企業として今後も見習っていきたいと思います。</p>
Posted in RailsConf2009  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/cookpadtech.wordpress.com/334/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/cookpadtech.wordpress.com/334/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/cookpadtech.wordpress.com/334/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/cookpadtech.wordpress.com/334/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/cookpadtech.wordpress.com/334/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/cookpadtech.wordpress.com/334/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/cookpadtech.wordpress.com/334/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/cookpadtech.wordpress.com/334/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/cookpadtech.wordpress.com/334/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/cookpadtech.wordpress.com/334/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=techlife.cookpad.com&blog=4985499&post=334&subd=cookpadtech&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://techlife.cookpad.com/2009/05/06/the-gilt-effect-railsconf2009/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">cookpadtech</media:title>
		</media:content>
	</item>
		<item>
		<title>Testing, Design, and Refactoring (RailsConf2009レポート)</title>
		<link>http://techlife.cookpad.com/2009/05/05/testing-design-and-refactoring-railsconf/</link>
		<comments>http://techlife.cookpad.com/2009/05/05/testing-design-and-refactoring-railsconf/#comments</comments>
		<pubDate>Tue, 05 May 2009 08:06:40 +0000</pubDate>
		<dc:creator>cookpadtech</dc:creator>
				<category><![CDATA[RailsConf2009]]></category>

		<guid isPermaLink="false">http://techlife.cookpad.com/?p=296</guid>
		<description><![CDATA[«RailsConf2009のレポート一覧
こんばんは根岸です。会社のマニーでべガスに来ています。
本稿はrakeの作者、Jim WeirichさんとJim O&#8217;brienさんのテストやリファクタリングに関する表題の発表のレポートです。
リファクタリング用のサンプルプロジェクトとスライドがアップロードされていました。
http://onestepback.org/download/refactor.zip
以下軽く紹介するので、興味がわいたらプレゼンを眺めたりあとで公開されるであろうビデオを眺めたりして下さいね。
前半は要するに良いオブジェクト指向のデザインとは何かというテーマです。
・凝集性を高める
・低い結合性を保つ
・明確さを維持する
これを実行するために単一責任原則だとか、リスコフの置換原則だとか、役割の局所性を利用したオブジェクト間のやりとりの粗結合性だとか、最少のクラスとメソッドの実装だとか、様々な設計ポリシーがあるよと説明したあと、ではそれを維持するためにリファクタリングをしよう！という話につながりました。
・新しいテストを書く
・それが全て通るようなコードを書く
・リファクタする
というリファクタリングのループを前提として、メソッド分割やらパラメータの導入やらといった一般的なリファクタの手法を説明していました。
後半はgreedというおもしろRailsゲームをリファクタリングしつつ仕様変更しよう！という内容だったんですが、cucumber前提なのも割とついていけないポイントだったんですが1時間ちょっとのリファクタリング講義の為にわざわざいろいろ穴のあるこのサイズのアプリ作ったんですか&#8230;と驚きあきれました。僕は持ち時間使い切ってまずアプリを動かせる状態にしてcucumberのシナリオの書き方の学習とコードリーディングを大体やってリファクタリングに入り始めたところで終わっちゃったんですが、基本的に周囲の外人さんは課題の仕様変更を終わらせてAIの改善とかに手をつけはじめる感じで、完全に差を感じました。
開発の技術的な体制やマインド・ポリシーの共有は、クックパッド技術部にとって注力したいテーマの一つです。今回の発表はきわめて一般的な話ではありましたが、こういった形で一種の最適解みたいなものに直に触れられたことは今後の良い糧になると考えています。
個人的にオブジェクト指向の説明のためにテーブルにJimさんが配ってくれたさいころは宝物にします :)
ちなみにそのうちこんな本が出るそうです
Refactoring: Ruby Edition
http://www.amazon.com/dp/0321603508
Martin Fowlerのリファクタリング本のRuby版ですね　僕は予約しましたので皆さんも買えばよいと思います
Posted in RailsConf2009       <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=techlife.cookpad.com&blog=4985499&post=296&subd=cookpadtech&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><a href="http://techlife.cookpad.com/category/RailsConf2009/">«RailsConf2009のレポート一覧</a></p>
<p>こんばんは根岸です。会社のマニーでべガスに来ています。</p>
<p>本稿はrakeの作者、Jim WeirichさんとJim O&#8217;brienさんのテストやリファクタリングに関する表題の発表のレポートです。<br />
リファクタリング用のサンプルプロジェクトとスライドがアップロードされていました。</p>
<p><a href="http://onestepback.org/download/refactor.zip">http://onestepback.org/download/refactor.zip</a></p>
<p>以下軽く紹介するので、興味がわいたらプレゼンを眺めたりあとで公開されるであろうビデオを眺めたりして下さいね。</p>
<p>前半は要するに良いオブジェクト指向のデザインとは何かというテーマです。<br />
・凝集性を高める<br />
・低い結合性を保つ<br />
・明確さを維持する<br />
これを実行するために単一責任原則だとか、リスコフの置換原則だとか、役割の局所性を利用したオブジェクト間のやりとりの粗結合性だとか、最少のクラスとメソッドの実装だとか、様々な設計ポリシーがあるよと説明したあと、ではそれを維持するためにリファクタリングをしよう！という話につながりました。<br />
・新しいテストを書く<br />
・それが全て通るようなコードを書く<br />
・リファクタする<br />
というリファクタリングのループを前提として、メソッド分割やらパラメータの導入やらといった一般的なリファクタの手法を説明していました。</p>
<p>後半はgreedというおもしろRailsゲームをリファクタリングしつつ仕様変更しよう！という内容だったんですが、cucumber前提なのも割とついていけないポイントだったんですが1時間ちょっとのリファクタリング講義の為にわざわざいろいろ穴のあるこのサイズのアプリ作ったんですか&#8230;と驚きあきれました。僕は持ち時間使い切ってまずアプリを動かせる状態にしてcucumberのシナリオの書き方の学習とコードリーディングを大体やってリファクタリングに入り始めたところで終わっちゃったんですが、基本的に周囲の外人さんは課題の仕様変更を終わらせてAIの改善とかに手をつけはじめる感じで、完全に差を感じました。</p>
<p>開発の技術的な体制やマインド・ポリシーの共有は、クックパッド技術部にとって注力したいテーマの一つです。今回の発表はきわめて一般的な話ではありましたが、こういった形で一種の最適解みたいなものに直に触れられたことは今後の良い糧になると考えています。<br />
個人的にオブジェクト指向の説明のためにテーブルにJimさんが配ってくれたさいころは宝物にします :)</p>
<p>ちなみにそのうちこんな本が出るそうです<br />
<a href="http://www.amazon.com/dp/0321603508">Refactoring: Ruby Edition<br />
http://www.amazon.com/dp/0321603508</a><br />
Martin Fowlerのリファクタリング本のRuby版ですね　僕は予約しましたので皆さんも買えばよいと思います<strong></strong></p>
Posted in RailsConf2009  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/cookpadtech.wordpress.com/296/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/cookpadtech.wordpress.com/296/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/cookpadtech.wordpress.com/296/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/cookpadtech.wordpress.com/296/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/cookpadtech.wordpress.com/296/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/cookpadtech.wordpress.com/296/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/cookpadtech.wordpress.com/296/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/cookpadtech.wordpress.com/296/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/cookpadtech.wordpress.com/296/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/cookpadtech.wordpress.com/296/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=techlife.cookpad.com&blog=4985499&post=296&subd=cookpadtech&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://techlife.cookpad.com/2009/05/05/testing-design-and-refactoring-railsconf/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">cookpadtech</media:title>
		</media:content>
	</item>
	</channel>
</rss>