<?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:xhtml="http://www.w3.org/1999/xhtml"
>

<channel>
	<title>Inhale &#039;n Exhale</title>
	<atom:link href="http://h2plus.biz/hiromitsu/feed" rel="self" type="application/rss+xml" />
	<link>http://h2plus.biz/hiromitsu</link>
	<description>what we need to live a life</description>
	<lastBuildDate>Fri, 17 Feb 2012 22:51:55 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.4</generator>
<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://h2plus.biz/hiromitsu/feed" />
		<item>
		<title>リンクの隣に被はてブ数を表示するjQuery</title>
		<link>http://h2plus.biz/hiromitsu/entry/484</link>
		<comments>http://h2plus.biz/hiromitsu/entry/484#comments</comments>
		<pubDate>Fri, 17 Feb 2012 05:14:19 +0000</pubDate>
		<dc:creator>Hiro</dc:creator>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Chrome Developer Tools]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[はてなブックマーク]]></category>
		<category><![CDATA[被はてブ数]]></category>

		<guid isPermaLink="false">http://h2plus.biz/hiromitsu/?p=484</guid>
		<description><![CDATA[ブログを開設してから1ヶ月ちょっとだが、はてブされるエントリが出てきたので、ブログ内で被はてブ数を表示させるようにしてみる。ブックマーク数を画像で取得するAPIによると、被はてブ数のアイコンを表示させるには &#60;im<a href="http://h2plus.biz/hiromitsu/entry/484"> <br /><br /> (More)…</a>]]></description>
			<content:encoded><![CDATA[<p>ブログを開設してから1ヶ月ちょっとだが、はてブされるエントリが出てきたので、ブログ内で被はてブ数を表示させるようにしてみる。<a href="http://b.hatena.ne.jp/help/count#count">ブックマーク数を画像で取得するAPI</a>によると、被はてブ数のアイコンを表示させるには</p>
<pre>
&lt;img src="http://b.hatena.ne.jp/entry/image/エントリーのURL" /&gt;
</pre>
<p>というimgタグを使えばいい。さらに、アイコンを該当するはてブにリンクさせるには</p>
<pre>
&lt;a href="http://b.hatena.ne.jp/entry/エントリーのURL"&gt;
  &lt;img src="http://b.hatena.ne.jp/entry/image/エントリーのURL" /&gt;
&lt;/a&gt;
</pre>
<p>というaタグで囲めばいい。</p>
<p>まずはここまでを実現するJavaScriptを書いてみる。<br />
<span id="more-484"></span></p>
<pre class="brush: jscript; title: ; notranslate">
$(function() {
  $('a').each(function() {
    var url = $(this).attr('href');
    var hateb_api = 'http://b.hatena.ne.jp/entry/';
    var hateb_icon = $('&lt;img /&gt;', { src: hateb_api+'image/'+url });
    var hateb = $('&lt;a/&gt;', { href: hateb_api+url }).append(hateb_icon);
    $(this).after(hateb);
  });
});
</pre>
<p>ワンライナーで書けなくもないが、コードの見やすさを重視して変数を適当に使った。ただしこれだと、サイト内のリンクというリンクすべてに被はてブ数のアイコンがついてしまうので非常に目障りなので、「Most Viewed」のウィジェット内だけに絞り込む。</p>
<p>Chrome Developer Toolsで「Most Viewed」のウィジェットを構成しているHTMLを調べると<br />
<a href="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/02/MostViewedDom.gif" rel="lightbox[484]" title="MostViewedDom"><img src="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/02/MostViewedDom.gif" alt="" title="MostViewedDom" class="aligncenter size-full wp-image-487" /></a><br />
<code>views-3</code>という<code>id</code>属性が割り当てられている。WordPressのテーマによって<code>id</code>属性が変わると思うので、自分のサイトに使う場合はあらかじめDOMを調べておいた方がよいだろう。</p>
<p>2行目の<code>a</code>セレクタで親要素に<code>#views-3</code>を指定する。さらに、<a href="http://h2plus.biz/hiromitsu/entry/10">外部サイトのリンクを別タブで開くjQuery</a>のコードともマージしてしまおう。</p>
<pre class="brush: jscript; highlight: [2,3,7,10]; title: ; notranslate">
jQuery(function() {
  var $ = $ || jQuery;
  $('#views-3 a').each(function() {
    var url = $(this).attr('href');
    var hateb_api = 'http://b.hatena.ne.jp/entry/';
    var hateb_icon = $('&lt;img /&gt;', { src: hateb_api+'image/'+url });
    var hateb = $('&lt;a/&gt;', { href: hateb_api+url, target: '_blank' }).append(hateb_icon);
    $(this).after(hateb);
  });
  $(&quot;div#content a:not([href^='&lt;?php echo get_settings('home'); ?&gt;'])&quot;).attr('target', '_blank');
});
</pre>
]]></content:encoded>
			<wfw:commentRss>http://h2plus.biz/hiromitsu/entry/484/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://h2plus.biz/hiromitsu/entry/484" />
	</item>
		<item>
		<title>続：Google AnalyticsにAdSenseをリンクさせるのがわかりづらい！</title>
		<link>http://h2plus.biz/hiromitsu/entry/455</link>
		<comments>http://h2plus.biz/hiromitsu/entry/455#comments</comments>
		<pubDate>Sat, 11 Feb 2012 05:09:25 +0000</pubDate>
		<dc:creator>Hiro</dc:creator>
				<category><![CDATA[ひとりごと]]></category>
		<category><![CDATA[Google AdSense]]></category>
		<category><![CDATA[Google Analytics]]></category>

		<guid isPermaLink="false">http://h2plus.biz/hiromitsu/?p=455</guid>
		<description><![CDATA[Google AnalyticsにAdSenseをリンクさせるのがわかりづらい！のエントリで、「結局、解決方法をググって探すわけで…」と尻切れトンボになってしまったが、ググってもGoogleのヘルプページばかりヒットして<a href="http://h2plus.biz/hiromitsu/entry/455"> <br /><br /> (More)…</a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://h2plus.biz/hiromitsu/entry/397">Google AnalyticsにAdSenseをリンクさせるのがわかりづらい！</a>のエントリで、「結局、解決方法をググって探すわけで…」と尻切れトンボになってしまったが、ググってもGoogleのヘルプページばかりヒットして堂々巡りにorz</p>
<p>結局、自己解決。</p>
<p>ポイントはAnalyticsを以前のバージョンに戻すこと。<br />
<a href="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/02/NewAnalyticsTop.jpg" rel="lightbox[455]" title="NewAnalyticsTop"><img src="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/02/NewAnalyticsTop.jpg" alt="" title="NewAnalyticsTop" class="aligncenter size-full wp-image-460" /></a></p>
<p>Analyticsを新しいUIにしていたから、Googleのヘルプページがトンチンカンに見えるわけだ。</p>
<p><span id="more-455"></span><br />
旧バージョンに戻すとなぜか勝手に英語UIになってしまったが、AdSenseをリンクさせたいAnalyticsプロファイルの<code>Edit</code>のリンクをクリックする（日本語UIだと「編集」になってるかも）。</p>
<p><a href="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/02/OldAnalyticsTop.jpg" rel="lightbox[455]" title="OldAnalyticsTop"><img src="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/02/OldAnalyticsTop.jpg" alt="" title="OldAnalyticsTop" class="aligncenter size-full wp-image-461" /></a></p>
<p>ここで「AdSense Data」という項目にようやく巡り合える。<br />
<a href="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/02/AnalyticsProfile.jpg" rel="lightbox[455]" title="AnalyticsProfile"><img src="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/02/AnalyticsProfile.jpg" alt="" title="AnalyticsProfile" class="aligncenter size-full wp-image-457" /></a></p>
<p>さらに<code>Edit</code>のリンクをクリックして、プロファイル編集ページの一番下にある「Yes, this profile should receive AdSense data」というチェックボックスをオンにする。<br />
<a href="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/02/BeforeEnableAdSenseConn.jpg" rel="lightbox[455]" title="BeforeEnableAdSenseConn"><img src="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/02/BeforeEnableAdSenseConn.jpg" alt="" title="BeforeEnableAdSenseConn" class="aligncenter size-full wp-image-458" /></a></p>
<p>すると、JavaScriptのコードスニペットが表示される。<br />
<a href="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/02/AfterEnableAdSenseConn.jpg" rel="lightbox[455]" title="AfterEnableAdSenseConn"><img src="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/02/AfterEnableAdSenseConn.jpg" alt="" title="AfterEnableAdSenseConn" class="aligncenter size-full wp-image-456" /></a></p>
<p>このコードを自分のサイトの<code>&lt;head&gt;</code>～<code>&lt;/head&gt;</code>タグの間に埋め込むと、数時間後にはAnalytics上でAdSenseの統計が表示されるようになる。<br />
<a href="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/02/SuccessfullyEnabled.jpg" rel="lightbox[455]" title="SuccessfullyEnabled"><img src="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/02/SuccessfullyEnabled.jpg" alt="" title="SuccessfullyEnabled" class="aligncenter size-full wp-image-459" /></a></p>
<p>Analyticsの新しいUIには、プロファイル設定ページのどこを探してもAdSense連携用のコードスニペットを取得できるような画面がないのに、<br />
<a href="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/Disabled.jpg" rel="lightbox[455]" title="Disabled"><img src="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/Disabled.jpg" alt="" title="Disabled" class="aligncenter size-full wp-image-398" /></a><br />
こんなUIを出すから混乱するんだ。</p>
]]></content:encoded>
			<wfw:commentRss>http://h2plus.biz/hiromitsu/entry/455/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://h2plus.biz/hiromitsu/entry/455" />
	</item>
		<item>
		<title>フォームのキー入力を制御するjQueryプラグイン</title>
		<link>http://h2plus.biz/hiromitsu/entry/428</link>
		<comments>http://h2plus.biz/hiromitsu/entry/428#comments</comments>
		<pubDate>Wed, 08 Feb 2012 05:06:56 +0000</pubDate>
		<dc:creator>Hiro</dc:creator>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[101キーボード]]></category>
		<category><![CDATA[106/109キーボード]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[jQueryプラグイン]]></category>
		<category><![CDATA[klimit]]></category>
		<category><![CDATA[キー入力制限]]></category>

		<guid isPermaLink="false">http://h2plus.biz/hiromitsu/?p=428</guid>
		<description><![CDATA[フォームで入力可能な文字種を制限したい場合に使えるjQueryのプラグインを作ってGitHubにアップしてみた。使い方は至って簡単。jQuery本体とjquery.klimit.jsをHTMLに読み込んで、キー入力制限を<a href="http://h2plus.biz/hiromitsu/entry/428"> <br /><br /> (More)…</a>]]></description>
			<content:encoded><![CDATA[<p>フォームで入力可能な文字種を制限したい場合に使えるjQueryのプラグインを作って<a href="https://github.com/bow-fujita/jquery.klimit">GitHubにアップ</a>してみた。使い方は至って簡単。jQuery本体と<code>jquery.klimit.js</code>をHTMLに読み込んで、キー入力制限をしたいフォーム（<code>input</code>タグ）の<code>class</code>属性に<code>klimit-*</code>を追加するだけ。</p>
<p>プラグインでデフォルトで用意したクラスは以下の通り。</p>
<ul>
<li><code>klimit-digit</code>：10進数のみ入力可能</li>
<li><code>klimit-hex</code>：16進数のみ入力可能</li>
<li><code>klimit-lower</code>：英小文字のみ入力可能</li>
<li><code>klimit-upper</code>：英大文字のみ入力可能</li>
<li><code>klimit-alpha</code>：英字のみ入力可能</li>
<li><code>klimit-alnum</code>：英数字のみ入力可能</li>
<li><code>klimit-graph</code>：英数字と記号のみ入力可能</li>
<li><code>klimit-mail</code>：メールアドレスに使用できる文字のみ入力可能</li>
</ul>
<p><code>klimit-hex</code>や<code>klimit-graph</code>は用途があるか疑問だが&#8230;。</p>
<p><span id="more-428"></span><br />
実際にデモで体験してもらうのが一番わかりやすいだろう。</p>
<pre><iframe src="/hiromitsu/wp-content/uploads/2012/02/klimit.html" frameborder="0" scrolling="no" width="100%" height="225"></iframe></pre>
<p>ソースコードはこうなっている。</p>
<pre class="brush: xml; title: ; notranslate">
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;script src=&quot;http://code.jquery.com/jquery.js&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;jquery.klimit.js&quot;&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div&gt;&lt;input type=&quot;text&quot; class=&quot;klimit-digit&quot; /&gt;klimit-digit&lt;/div&gt;
&lt;div&gt;&lt;input type=&quot;text&quot; class=&quot;klimit-hex&quot; /&gt;klimit-hex&lt;/div&gt;
&lt;div&gt;&lt;input type=&quot;text&quot; class=&quot;klimit-lower&quot; /&gt;klimit-lower&lt;/div&gt;
&lt;div&gt;&lt;input type=&quot;text&quot; class=&quot;klimit-upper&quot; /&gt;klimit-upper&lt;/div&gt;
&lt;div&gt;&lt;input type=&quot;text&quot; class=&quot;klimit-alpha&quot; /&gt;klimit-alpha&lt;/div&gt;
&lt;div&gt;&lt;input type=&quot;text&quot; class=&quot;klimit-alnum&quot; /&gt;klimit-alnum&lt;/div&gt;
&lt;div&gt;&lt;input type=&quot;text&quot; class=&quot;klimit-graph&quot; /&gt;klimit-graph&lt;/div&gt;
&lt;div&gt;&lt;input type=&quot;text&quot; class=&quot;klimit-mail&quot; /&gt;klimit-mail&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>プラグインがデフォルトで用意している<code>klimit-*</code>とは異なる独自のルールでキー入力制御をしたいこともあるだろう。例えば、ユーザー名のフォームで英数字と<code>.</code>（ドット）、<code>_</code>（アンダースコア）のみを許可したいような場合は、以下のように<code>klimit()</code>に許可する文字種を配列で渡せばよい。</p>
<pre class="brush: xml; title: ; notranslate">
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;script src=&quot;http://code.jquery.com/jquery.js&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;jquery.klimit.js&quot;&gt;&lt;/script&gt;
&lt;script&gt;
$(function() {
    $('input#username').klimit([$.KLIMIT.ALNUM, '._']);
});
&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;input type=&quot;text&quot; id=&quot;username&quot; /&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p><code>jQuery.KLIMIT</code>には、<code>DIGIT</code>、<code>HEX</code>、<code>LOWER</code>、<code>UPPER</code>、<code>ALPHA</code>、<code>ALNUM</code>、<code>GRAPH</code>というプロパティがあり、<code>jQuery.klimit()</code>に引き渡せる文字集合が定義されているので、これらと組み合わせることで簡単に独自のルールを作ることができる。</p>
<p>ところで、最初のデモの<code>klimit-mail</code>で<code>@</code>や<code>_</code>（アンダースコア）が入力できなくておかしいと思った人もいるだろう。<code>jquery.klimit.js</code>はデフォルトではUS101キーボードのキー配列に基づいて入力制御をしており、日本語の106/109キーボードを使っていると一部の記号のキー配列がUS101キーボードとは異なっているため期待通りの制限がかからない。日本語の106/109キー配列に対応させるためには、<code>jquery.klimit.js</code>に先立って<code>jquery.klimit.kb109.js</code>を読み込む必要がある。</p>
<pre class="brush: xml; title: ; notranslate">
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;script src=&quot;http://code.jquery.com/jquery.js&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;jquery.klimit.kb109.js&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;jquery.klimit.js&quot;&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
（略）
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p><code>jquery.klimit.kb109.js</code>を読み込んだバージョンのデモがこちら。</p>
<pre><iframe src="/hiromitsu/wp-content/uploads/2012/02/klimit-jp.html" frameborder="0" scrolling="no" width="100%" height="225"></iframe></pre>
<p>他の国のキー配列（例えば韓国語やアラビア語）がどうなっているかわからないが、<code>jquery.klimit.kb109.js</code>のようなキー配列定義ファイルを作って、US101キーボードとは異なるキーだけを<code>jQuery.KLIMIT.KEY_CODE_MAP</code>に登録することで、他のキー配列にも対応できるようになっている。</p>
<p>ただし、ブラウザからはユーザーが使っているキーボードが何なのか知る由もないし、モバイルデバイスのソフトキーボードでは制御できるかも怪しい（面倒で試してないだけ）。実際にこのプラグインが使えるシーンは少ないかもしれない。</p>
]]></content:encoded>
			<wfw:commentRss>http://h2plus.biz/hiromitsu/entry/428/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://h2plus.biz/hiromitsu/entry/428" />
	</item>
		<item>
		<title>ベビーグッズを買い揃えるならBuybuyBaby</title>
		<link>http://h2plus.biz/hiromitsu/entry/414</link>
		<comments>http://h2plus.biz/hiromitsu/entry/414#comments</comments>
		<pubDate>Sat, 04 Feb 2012 05:38:38 +0000</pubDate>
		<dc:creator>Hiro</dc:creator>
				<category><![CDATA[子育て]]></category>
		<category><![CDATA[BabiesRUs]]></category>
		<category><![CDATA[BuyBuyBaby]]></category>
		<category><![CDATA[ベビーグッズ]]></category>

		<guid isPermaLink="false">http://h2plus.biz/hiromitsu/?p=414</guid>
		<description><![CDATA[ベビー用品の買い物に行こうと思った時、真っ先に思いつくのはBabiesRUsだが、店舗によって規模にかなり差があり、ToysRUsのオマケみたいな感じの店舗は品揃えがいまいちなことが多い。我が家の近くにあるSunnyva<a href="http://h2plus.biz/hiromitsu/entry/414"> <br /><br /> (More)…</a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.buybuybaby.com"><img src="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/02/buybuybaby.jpg" alt="" title="BuyBuyBaby" width="270" height="150" class="alignright size-full wp-image-415" /></a>ベビー用品の買い物に行こうと思った時、真っ先に思いつくのは<a href="http://www.babiesrus.com/">BabiesRUs</a>だが、店舗によって規模にかなり差があり、ToysRUsのオマケみたいな感じの店舗は品揃えがいまいちなことが多い。我が家の近くにある<a href="http://g.co/maps/9p5by">Sunnyvale店</a>はその典型。<a href="http://g.co/maps/vjrw6">ベイエリアにあるBabiesRUs</a>の中で規模が大きいところというと、<a href="http://g.co/maps/xgsfe">RedWood City店</a>か<a href="http://g.co/maps/f7mh3">San Jose店</a>になるだろう。</p>
<p>ちょうど去年の今頃だろうか、息子が生まれる前にいろいろベビーグッズを買い揃えるのに、San JoseのBabiesRUsに向かってCA-85号線を走っていたら、BuyBuyBabyという大きなロゴが目に止まったので、BabiesRUsで買い物を済ませた帰りにちょっと立ち寄ってみた。</p>
<p><span id="more-414"></span><br />
店内に入って品揃えの豊富さに圧巻。BabiesRUsで買い物をする前に来ればよかったと後悔したくらい。他にも店舗はないかとネットで調べてみたが、当時はベイエリアではSan Joseにしか店舗がなかった（半年くらい前にPleasant Hill店がオープンしたが我が家からは遠い&#8230;）。もちろん<a href="http://www.buybuybaby.com">オンラインショッピング</a>もできるのだが、品物が届いてから気に入らなくて返送するというのがどうも面倒に感じてしまうので、ネットで買うにしても先に現物を見て確認しておきたいのだ。</p>
<p>それ以来、ベビーグッズの買い物は決まってBuybuy Babyに行くようになった。品揃えがいいもんだから、ついつい必要ないものまで買いたくなる誘惑に駆られるが&#8230;。というわけで、ベイエリアのダディ＆マミィにはオススメ。</p>
<p><strong>Buybuy Baby</strong><br />
<a href="http://g.co/maps/grzug">5353 Almaden Expressway, San Jose, CA 95118</a></p>
<p><iframe width="610" height="400" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="http://maps.google.com/maps?f=q&#038;source=s_q&#038;hl=en&#038;geocode=&#038;q=Buybuy+Baby,+Almaden+Expressway,+San+Jose,+CA&#038;aq=0&#038;oq=buybuybaby&#038;g=865+Blossom+Hill+Road,+San+Jose,+CA+95123&#038;ie=UTF8&#038;hq=Buybuy+Baby,&#038;hnear=Almaden+Expy,+San+Jose,+California&#038;t=m&#038;cid=14622595798900698004&#038;ll=37.264763,-121.877604&#038;spn=0.027323,0.052271&#038;z=14&#038;iwloc=A&#038;output=embed"></iframe><br /><small><a href="http://maps.google.com/maps?f=q&#038;source=embed&#038;hl=en&#038;geocode=&#038;q=Buybuy+Baby,+Almaden+Expressway,+San+Jose,+CA&#038;aq=0&#038;oq=buybuybaby&#038;g=865+Blossom+Hill+Road,+San+Jose,+CA+95123&#038;ie=UTF8&#038;hq=Buybuy+Baby,&#038;hnear=Almaden+Expy,+San+Jose,+California&#038;t=m&#038;cid=14622595798900698004&#038;ll=37.264763,-121.877604&#038;spn=0.027323,0.052271&#038;z=14&#038;iwloc=A" style="color:#0000FF;text-align:left">View Larger Map</a></small></p>
]]></content:encoded>
			<wfw:commentRss>http://h2plus.biz/hiromitsu/entry/414/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://h2plus.biz/hiromitsu/entry/414" />
	</item>
		<item>
		<title>Google AnalyticsにAdSenseをリンクさせるのがわかりづらい！</title>
		<link>http://h2plus.biz/hiromitsu/entry/397</link>
		<comments>http://h2plus.biz/hiromitsu/entry/397#comments</comments>
		<pubDate>Wed, 01 Feb 2012 07:30:46 +0000</pubDate>
		<dc:creator>Hiro</dc:creator>
				<category><![CDATA[ひとりごと]]></category>
		<category><![CDATA[Google AdSense]]></category>
		<category><![CDATA[Google Analytics]]></category>

		<guid isPermaLink="false">http://h2plus.biz/hiromitsu/?p=397</guid>
		<description><![CDATA[いつからかGoogle AnalyticsのUIが刷新されて、いろいろ細かい統計情報が見やすくなったものの、路頭に迷ってしまったのがコンテンツの下にあるAdSenseのメニュー。本ブログでもAnalyticsとAdSen<a href="http://h2plus.biz/hiromitsu/entry/397"> <br /><br /> (More)…</a>]]></description>
			<content:encoded><![CDATA[<p>いつからかGoogle AnalyticsのUIが刷新されて、いろいろ細かい統計情報が見やすくなったものの、路頭に迷ってしまったのがコンテンツの下にあるAdSenseのメニュー。本ブログでもAnalyticsとAdSenseの両方を使っているので、AdSenseの統計情報がAnalyticsで見えるのは嬉しい機能だ。がしかし、実際にAnalytics上でAdSenseのサマリーを表示させようとしても、「このレポートを使用するには、このプロファイルに対してAdSenseを有効にする必要があります。」というメッセージが出てくるだけ。</p>
<p><a href="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/Disabled.jpg" rel="lightbox[397]" title="Disabled"><img src="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/Disabled.jpg" alt="" title="Disabled" class="aligncenter size-full wp-image-398" /></a></p>
<p><span id="more-397"></span><br />
AdSenseのどの広告ユニットをAnalyticsで集計するのかは、自分でリンクさせなきゃいけないわけだ。</p>
<p>でもどうやって？</p>
<p>「AdSense アカウントとアナリティクス アカウントをリンクする理由」と題されたメッセージにある「詳細については<a href="https://support.google.com/analytics/bin/answer.py?hl=ja&#038;answer=1012183&#038;topic=1038753&#038;parent=1120718&#038;rd=1">こちら</a>をご覧ください」のリンクをクリックしたらヘルプページに飛んだので、素直に手順に従おうと読み進めた。<br />
<img src="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/HelpForLinkingAdSenseAndAnalytics.gif" alt="" title="HelpForLinkingAdSenseAndAnalytics" class="aligncenter size-full wp-image-403" /></p>
<p>AdSenseを開く。</p>
<p><a href="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/AdSenseSummary.gif" rel="lightbox[397]" title="AdSenseSummary"><img src="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/AdSenseSummary.gif" alt="" title="AdSenseSummary" class="aligncenter size-full wp-image-405" /></a></p>
<p>「アカウントを統合するためのリンク」ってどこ？？</p>
<p>[詳細ページ]なんてのも見当たらないから[サマリー]のページで合ってるはず。[Google Analyticsで成果を確認]のリンクがもともと「アカウントを統合するためのリンク」だったのだろうか。</p>
<p>気にせずに読み進める。</p>
<p><img src="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/LinkConfiguration.gif" alt="" title="LinkConfiguration" class="aligncenter size-full wp-image-407" /></p>
<p>そう。やりたいことはAdSenseアカウントを既存のAnalyticsアカウントにリンクさせたいだけ。動画を見てもなぁと思いながら、<a href="https://support.google.com/adsense/bin/answer.py?hl=ja&#038;answer=118191">こちら</a>のリンクをクリックした。</p>
<p><img src="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/NotFound.gif" alt="" title="NotFound" class="aligncenter size-full wp-image-409" /></p>
<p>リンク切れかいっ！なんだかなぁ&#8230;orz</p>
<p>その下のFAQ的な5つのケースを見てもどれも当てはまらないのだが、一番近いもので「2. プロファイルを 1 つだけ設定したアナリティクス アカウントを持っている」の回答を読む。</p>
<p><img src="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/02/FAQ2.gif" alt="" title="FAQ2" class="aligncenter size-full wp-image-411" /></p>
<p>そもそも「[スタート ガイド] ページ」がどこにあるんだかわからない。AdSenseのページをくまなく探したけれど見つからない。ヘルプが実装に追いついてないせいで、ヘルプが迷宮への入り口になっている。まさしく五里霧中。</p>
<p>でも結局、解決方法をググって探すわけで&#8230;。</p>
<p><a href="http://h2plus.biz/hiromitsu/entry/455">つづく</a></p>
]]></content:encoded>
			<wfw:commentRss>http://h2plus.biz/hiromitsu/entry/397/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://h2plus.biz/hiromitsu/entry/397" />
	</item>
		<item>
		<title>Google日本語入力をFedora14にインストールする</title>
		<link>http://h2plus.biz/hiromitsu/entry/385</link>
		<comments>http://h2plus.biz/hiromitsu/entry/385#comments</comments>
		<pubDate>Sun, 29 Jan 2012 05:20:22 +0000</pubDate>
		<dc:creator>Hiro</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Anthy]]></category>
		<category><![CDATA[Fedora]]></category>
		<category><![CDATA[Google日本語入力]]></category>
		<category><![CDATA[IBus]]></category>
		<category><![CDATA[mozc]]></category>
		<category><![CDATA[yum]]></category>
		<category><![CDATA[インストール]]></category>

		<guid isPermaLink="false">http://h2plus.biz/hiromitsu/?p=385</guid>
		<description><![CDATA[Fedora14の日本語入力にはデフォルトのAnthyを使っていたのだが、MacでGoogle日本語入力を使って慣れてきたので、Fedora14でもGoogle日本語入力を使えるようにインストールしてみる。Google日<a href="http://h2plus.biz/hiromitsu/entry/385"> <br /><br /> (More)…</a>]]></description>
			<content:encoded><![CDATA[<p>Fedora14の日本語入力にはデフォルトのAnthyを使っていたのだが、MacでGoogle日本語入力を使って慣れてきたので、Fedora14でもGoogle日本語入力を使えるようにインストールしてみる。Google日本語入力は、<a href="http://code.google.com/p/mozc/">mozcプロジェクト</a>によって開発されており、Wikiの<a href="http://code.google.com/p/mozc/wiki/LinuxBuildInstructions">Linux Build Instructions</a>にソースからビルドする方法が説明されているのだが、Fedora14のyumリポジトリを探したら<code>ibus-mozc</code>というパッケージが見つかったので、<code>yum</code>を使ってインストールすることにした。</p>
<pre>$ sudo yum -y install ibus-mozc</pre>
<p><span id="more-385"></span><br />
インストールが完了したら、Fedoraのメニューバーから[System]-[Preferences]-[Input Method Selector]を選択する。<br />
<img src="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/InputMethodSelector.png" alt="" title="InputMethodSelector" class="aligncenter size-full wp-image-390" /></p>
<p>[Input Method Preferences...]ボタンをクリックして[Input Method]タブを開く。[Select an input method]のプルダウンから[Japanese]-[Mozc]を選択して[Add]ボタンをクリックする（プルダウンの[Japanese]の中に[Mozc]が見つからない場合は、Fedoraを一度ログアウトする必要がある）。<br />
<img src="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/IBusPreferences.png" alt="" title="IBusPreferences" class="aligncenter size-full wp-image-387" /></p>
<p>Anthyはもう使わないので[Remove]ボタンをクリックして削除してMozcだけ残るようにする。<br />
<img src="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/EnableMozc.png" alt="" title="EnableMozc" class="aligncenter size-full wp-image-393" /></p>
<p>これで日本語変換エンジンがGoogle日本語入力に置き換わった。</p>
]]></content:encoded>
			<wfw:commentRss>http://h2plus.biz/hiromitsu/entry/385/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://h2plus.biz/hiromitsu/entry/385" />
	</item>
		<item>
		<title>Hadoopで始める並列データ解析／後編</title>
		<link>http://h2plus.biz/hiromitsu/entry/347</link>
		<comments>http://h2plus.biz/hiromitsu/entry/347#comments</comments>
		<pubDate>Thu, 26 Jan 2012 06:50:36 +0000</pubDate>
		<dc:creator>Hiro</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[シェルスクリプト]]></category>
		<category><![CDATA[Amazon Web Services]]></category>
		<category><![CDATA[EC2]]></category>
		<category><![CDATA[EC2 API Tools]]></category>
		<category><![CDATA[Hadoop]]></category>
		<category><![CDATA[HDFS]]></category>
		<category><![CDATA[jar]]></category>
		<category><![CDATA[javac]]></category>
		<category><![CDATA[JTPA]]></category>
		<category><![CDATA[S3]]></category>
		<category><![CDATA[WordCount]]></category>
		<category><![CDATA[ギークサロン]]></category>

		<guid isPermaLink="false">http://h2plus.biz/hiromitsu/?p=347</guid>
		<description><![CDATA[1月13日（金）にPalo Altoで行われたJTPAのギークサロンに参加してきた。今回は参加者がラップトップ持ち込みでコーディングしていくハッカソン形式で、会場入りする前までにHadoopが使える環境を自前で用意してお<a href="http://h2plus.biz/hiromitsu/entry/347"> <br /><br /> (More)…</a>]]></description>
			<content:encoded><![CDATA[<p>1月13日（金）にPalo Altoで行われた<a href="http://www.jtpa.org/000562.html">JTPAのギークサロン</a>に参加してきた。今回は参加者がラップトップ持ち込みでコーディングしていくハッカソン形式で、会場入りする前までにHadoopが使える環境を自前で用意しておく必要があった。</p>
<p><a href="http://h2plus.biz/hiromitsu/entry/267">前編</a>では、Hadoopを使って計算処理をするための準備として、EC2上にHadoopクラスタを構築する方法を紹介した。後編では実際にギークサロンで手を動かしてやったことを中心に紹介していこう。</p>
<p><span id="more-347"></span></p>
<h3>WordCount.java &#8211; 最初のサンプルコード</h3>
<p><a href="http://developer.yahoo.com/hadoop/tutorial/module4.html">Hadoop Tutorial / Module4: MapReduce</a>で紹介されている<code>WordCount.java</code>を使って、EC2上のHadoopクラスタで処理をさせてみる。いわゆる<code>"Hello, wolrd!"</code>的なサンプル。</p>
<p>まずはEC2上のUbuntuにSSHでログインして、Hadoopのクラスタを立ち上げ、Hadoopクラスタのマスターノードにログインする。</p>
<pre>
local$ ec2hadoop
ubuntu$ hadoop-ec2 launch-cluster hadoop-cluster 2
ubuntu$ hadoop-ec2 login hadoop-cluster
cluster#
</pre>
<p>ホームディレクトリに作業用ディレクトリを作成して、そこに<code>WordCount.java</code>のソースコードをコピーする。</p>
<pre>
cluster# mkdir ~/cordcount
cluster# cp $HADOOP_HOME/src/examples/org/apache/hadoop/examples/WordCount.java ~/wordcount
</pre>
<p><code>WordCount.java</code>は複数のテキストファイルを入力として、ファイル中の単語をすべてカウントして、各単語の出現回数集計するアプリ。簡略化したソースコードを以下に掲載しておこう。</p>
<pre class="brush: java; title: ; notranslate">
/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * &quot;License&quot;); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.apache.hadoop.examples;

import java.io.IOException;
import java.util.*;

import org.apache.hadoop.fs.Path;
import org.apache.hadoop.conf.*;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapred.*;
import org.apache.hadoop.util.*;

public class WordCount extends Configured implements Tool {
  /**
   * Counts the words in each line.
   * For each line of input, break the line into words and emit them.
   */
  public static class MapClass extends MapReduceBase
    implements Mapper&lt;LongWritable, Text, Text, IntWritable&gt; {

    private final static IntWritable one = new IntWritable(1);
    private Text word = new Text();

    public void map(LongWritable key, Text value,
                    OutputCollector&lt;Text, IntWritable&gt; output,
                    Reporter reporter) throws IOException {
      String line = value.toString();
      StringTokenizer itr = new StringTokenizer(line);
      while (itr.hasMoreTokens()) {
        word.set(itr.nextToken());
        output.collect(word, one);
      }
    }
  }

  // A reducer class that just emits the sum of the input values.
  public static class Reduce extends MapReduceBase
    implements Reducer&lt;Text, IntWritable, Text, IntWritable&gt; {

    public void reduce(Text key, Iterator&lt;IntWritable&gt; values,
                       OutputCollector&lt;Text, IntWritable&gt; output,
                       Reporter reporter) throws IOException {
      int sum = 0;
      while (values.hasNext()) {
        sum += values.next().get();
      }
      output.collect(key, new IntWritable(sum));
    }
  }

  // The main driver for word count map/reduce program.
  // Invoke this method to submit the map/reduce job.
  public static void main(String[] args) throws Exception {
    JobConf conf = new JobConf(getConf(), WordCount.class);
    conf.setJobName(&quot;wordcount&quot;);

    // the keys are words (strings)
    conf.setOutputKeyClass(Text.class);
    // the values are counts (ints)
    conf.setOutputValueClass(IntWritable.class);

    conf.setMapperClass(MapClass.class);
    conf.setCombinerClass(Reduce.class);
    conf.setReducerClass(Reduce.class);

    FileInputFormat.setInputPaths(conf, new Path(args[0]));
    FileOutputFormat.setOutputPath(conf, new Path(args[1]));

    JobClient.runJob(conf);
  }
}
</pre>
<p>自分はJavaに馴染みないのだが、短いプログラムなので理解するは難しくない。<code>MapClass</code>クラスの<code>map()</code>関数で、入力ファイルの各行を<code>StringTokenizer</code>で単語に区切り、&lt;単語, 1&gt;というペアを出力する（Map処理）。次に<code>Reduce</code>クラスの<code>reduce()</code>関数で、<code>MapClass</code>の出力したペアの値に対して総計を算出する（Reduce処理）。<code>main()</code>関数では、<code>JobConf</code>をセットアップして、コマンドライン引数で渡された入出力先ディレクトリを指定している。</p>
<p>HadoopのMap/Reduceチュートリアルの<a href="http://oss.infoscience.co.jp/hadoop/common/docs/current/mapred_tutorial.html#Walk-through">ウォークスルーの節</a>に、詳しい説明が日本語で書かれているので参考にするといいだろう。</p>
<p><code>WordCount.java</code>をコンパイルして、クラスコードをjarファイルにパッケージングする。</p>
<pre>
cluster# cd ~/wordcount
cluster# mkdir classes
cluster# javac -classpath $HADOOP_HOME/hadoop-0.19.0-core.jar -d classes WordCount.java
cluster# jar -cf wordcount.jar -C classes .
cluster# tree
.
|-- WordCount.java
|-- classes
|   `-- org
|       `-- apache
|           `-- hadoop
|               `-- examples
|                   |-- WordCount$MapClass.class
|                   |-- WordCount$Reduce.class
|                   `-- WordCount.class
`-- wordcount.jar
5 directories, 5 files
</pre>
<h3>分散ファイルシステム（HDFS）の構築</h3>
<p>Hadoopの入出力ファイルは、ローカルのファイルシステムとは異なる、Hadoop専用の分散ファイルシステム（HDFS: Hadoop Distributed File System）を介して配置しなければならない。HadoopクラスタではデフォルトでHDFSがマウントされているので、ファイルシステム自体のセットアップは不要だ。HDFS内のファイルやディレクトリを操作するには<code>hadoop dfs</code>コマンドを使う（参考：<a href="http://www.mwsoft.jp/programming/hadoop/hadoop_hdfs_command.html">Hadoop HDFSコマンド実行メモ</a>）。</p>
<p>まず、WordCountの入力ディレクトリをHDFS内に作成する。</p>
<pre>
cluster# hadoop dfs -mkdir input
cluster# hadoop dfs -ls
Found 1 items
drwxr-xr-x   - root supergroup          0 2012-01-24 18:33 /user/root/input
</pre>
<p>Hadoopのマスターノードにrootとしてログインしているので、<code>/user/root</code>がHDFS内でのホームディレクトリになっている。試しにローカルファイルシステムに適当なファイルを作成して、それをHDFS内の<code>input</code>ディレクトリにコピーしてみよう。</p>
<pre>
cluster# echo Hello > hello.txt
cluster# hadoop dfs -put hello.txt input/
cluster# hadoop dfs -lsr
drwxr-xr-x   - root supergroup          0 2012-01-24 18:38 /user/root/input
-rw-r--r--   3 root supergroup          6 2012-01-24 18:38 /user/root/input/hello.txt
cluster# hadoop dfs -cat input/hello.txt
Hello
cluster# hadoop dfs -rm input/hello.txt
cluster# rm -f hello.txt
</pre>
<p>では実際にWordCountのアプリケーションで処理させる入力ファイルを用意しよう。それなりのボリュームの入力があった方がいいので、RFCドキュメントをローカルのファイルシステム上に巡回ダウンロードするスクリプトを作ってみた。</p>
<pre>
cluster# cd ~/wordcount
cluster# vi wgetrfc
</pre>
<pre class="brush: bash; title: ; notranslate">
#!/bin/bash

INDEX=1
COUNTER=0
BASEURL=http://www.ietf.org/rfc
OUTDIR=$PWD/input

rm -rf $OUTDIR
mkdir -p $OUTDIR

while test $COUNTER -lt $1; do
  FILENAME=rfc$INDEX
  if wget -q -O $OUTDIR/$FILENAME $BASEURL/$FILENAME; then
    COUNTER=`expr $COUNTER + 1`
    echo &quot;$FILENAME OK&quot;
  else
    rm -rf $OUTDIR/$FILENAME
  fi
  INDEX=`expr $INDEX + 1`
done
</pre>
<p>とりあえず100個のRFCドキュメントをダウンロードしておこう。</p>
<pre>
cluster# chmod +x wgetrfc
cluster# ./wgetrc 100
rfc1 OK
rfc2 OK
...
rfc103 OK
cluster# cat input/* | wc
  32907  157746 1162188
</pre>
<p>3つくらい欠番があるようだが、1MBほどの入力ファイルができたのでHDFSにコピーする。</p>
<pre>
cluster# hadoop dfs -put input/* input
cluster# hadoop dfs -ls input
Found 100 items
-rw-r--r--   3 root supergroup      21088 2012-01-24 19:22 /user/root/input/rfc1.txt
-rw-r--r--   3 root supergroup       4510 2012-01-24 19:22 /user/root/input/rfc10.txt
...
-rw-r--r--   3 root supergroup      24529 2012-01-24 19:22 /user/root/input/rfc98.txt
-rw-r--r--   3 root supergroup       1010 2012-01-24 19:22 /user/root/input/rfc99.txt
</pre>
<h3>WordCountの実行</h3>
<p>これでWordCountを実行する準備が整った。以下のコマンドでHadoopクラスタに処理をさせてみよう。WordCountの第1引数は入力ファイル群が置かれているHDFS上のディレクトリ（<code>/user/root/input</code>）、第2引数は同じくHDFS上の出力先のディレクトリ（<code>/user/root/output</code>）を指定する。出力先ディレクトリは自分で先に作ってしまうと&#8221;Output directory already exists&#8221;という<code>FileAlreadyExistsException</code>エラーが発生してしまう。Hadoopが勝手に生成してくれるのでお膳立ては不要だ。</p>
<pre>
cluster# cd ~/wordcount
cluster# hadoop jar wordcount.jar org.apache.hadoop.examples.WordCount input output
12/01/24 19:36:54 INFO mapred.FileInputFormat: Total input paths to process : 100
12/01/24 19:36:54 INFO mapred.JobClient: Running job: job_201201241700_0001
12/01/24 19:36:55 INFO mapred.JobClient:  map 0% reduce 0%
12/01/24 19:37:03 INFO mapred.JobClient:  map 1% reduce 0%
...
12/01/24 19:40:51 INFO mapred.JobClient:     Map output records=157747
12/01/24 19:40:51 INFO mapred.JobClient:     Reduce input records=56339
</pre>
<p>Map/Reduceの処理結果は<code>output/part-00000.deflate</code>というファイルに出力されている。</p>
<pre>
cluster# hadoop dfs -ls output
Found 2 items
drwxr-xr-x   - root supergroup          0 2012-01-24 19:36 /user/root/output/_logs
-rw-r--r--   3 root supergroup      67154 2012-01-24 19:40 /user/root/output/part-00000.deflate
</pre>
<p><code>hadoop dfs -cat</code>コマンドで出力ファイルの内容を標準出力にダンプしてみるとわかるが、中身はバイナリデータになっている。拡張子の<code>.deflate</code>から推測できるようにDeflateアルゴリズムで圧縮されているからだ。Hadoopではクラスタ間でデータを転送する際のネットワーク帯域を節約するために、デフォルトでデータを圧縮するようになっているらしい。</p>
<p>Deflateの圧縮を解凍するために、unzipコマンドを使ってみたりしたがうまくいかなかったので（誰か知っていたら教えてください）、Hadoopの設定ファイルを変更して出力データを圧縮しないようにする。<code>$HADOOP_HOME/conf/hadoop-site.xml</code>をエディタで開いて、<code>mapred.output.compress</code>の値を<code>true</code>から<code>false</code>に変更する。</p>
<pre>
cluster# vi $HADOOP_HOME/conf/hadoop-site.xml
</pre>
<pre class="brush: xml; first-line: 36; title: ; notranslate">
&lt;property&gt;
  &lt;name&gt;mapred.output.compress&lt;/name&gt;
  &lt;value&gt;false&lt;/value&gt;
&lt;/property&gt;
</pre>
<p>出力ディレクトリを削除して、WordCountを再実行しよう。</p>
<pre>
cluster# cd ~/wordcount
cluster# hadoop dfs -rmr output
cluster# hadoop jar wordcount.jar org.apache.hadoop.examples.WordCount input output
cluster# hadoop dfs -ls output
Found 2 items
drwxr-xr-x   - root supergroup          0 2012-01-24 20:01 /user/root/output/_logs
-rw-r--r--   3 root supergroup     186137 2012-01-24 20:04 /user/root/output/part-00000
</pre>
<p>今度は<code>.deflate</code>という拡張子は付いていないので、圧縮されていないことがわかる。実行結果を標準出力に表示させてみよう。</p>
<pre>
cluster# hadoop dfs -cat output/part-00000
!	13
!=,	1
"	22
"#33,	1
"--"	1
...
||=======>|	1
||=>-	1
}	6
~	4
�sec	1
</pre>
<p>記号ばかりだがテキストとして読める状態にはなっている。HDFS上のファイルをローカルのファイルシステムに取り出す場合は</p>
<pre>
cluster# hadoop dfs -get output/part-00000 .
</pre>
<p>を実行すればよい。エディタでファイルの中身を見てみるといいだろう。</p>
<p>WordCountは単語の出現回数を数えるだけのつまらないプログラムだが、Map/ReduceのアーキテクチャやHDFSの操作方法を学ぶには十分なサンプルだ。</p>
<p><code>$HADOOP_HOME/src/examples/org/apache/hadoop/examples/</code>には他のサンプルもあるので、どのようにMap/Reduceの処理をさせるか参考にするといいだろう。サンプルソースを読むだけなら、わざわざHadoopクラスタのマスターノードにログインしなくても、<a href="http://www.gtlib.gatech.edu/pub/apache/hadoop/core/hadoop-1.0.0/hadoop-1.0.0.tar.gz">Hadoopのソースをダウンロード</a>すればローカルで学習できる。</p>
<p>以下、ギークサロンをホストしてくださった山中氏よりコメント。</p>
<blockquote><p>
私は以前から画像処理など各種科学技術計算用のPCクラスタを開発してきました。オリジナルで分散PCクラスタを構築しようとすると、非常に沢山の機能が必要になります。例えば実行ファイルや入力データを各ワークステーションに配置する機能や中間実行結果を取り出して他のクラスタに配信する機能、リモートでプロセスの実行を管理したり発生したエラーをハンドリングする機能も必要です。これらを全て提供し、かつJavaのクラスファイルから柔軟に計算フレームワークを構築できるのがHadoopなのです。
</p></blockquote>
<h3>Amazon S3ストレージをHDFSとして使う</h3>
<p>ここまではマスターノードのローカルにマウントされたデフォルトのHDFSを使ってきたが、今度は<a href="http://aws.amazon.com/s3/">Amazon S3</a>にHDFSをマウントするようにしてみる。S3をHDFSのストレージとして利用することで、多数のHadoopクラスタから入出力先を相互に設定できるようになる。例えば、1つのHadoopクラスタが出力したデータをS3上に保存しておき、別のHadoopクラスタがそれを入力データとして利用するといったことが可能になる。Hadoopはクラウド環境と非常に相性がいい。</p>
<p>ローカルにマウントされたHDFSは、EC2上でHadoopクラスタを稼働させている間でなければ、入出力データを取り出すことができないという欠点がある。EC2 API Toolsの<code>hadoop-ec2 launch-cluster</code>コマンドによって起動されるHadoopクラスタはルートデバイスにインスタンスストアを使っている（EBSではない）ため、<code>hadoop-ec2 terminate-cluster</code>コマンドでHadoopクラスタを終了すると同時に、HDFSに保存されていたデータも消失する。EC2上でHadoopクラスタを構築すると、たとえ計算処理をしていなくても、インスタンスを立ち上げているだけで課金されてしまい、油断すると簡単にクラウド破産しかねない。Hadoopの出力データをS3上に保存できれば、Hadoopクラスタが不要になったら即インスタンスを停止、または終了させることができるので、そういった面でもS3をストレージとして使うメリットは大きいだろう。</p>
<p>それではまず、Amazon S3のセットアップをしておこう。</p>
<p>AWSの管理コンソールにログインして[Amazon S3]のタブを開き、左上にある[Create Bucket]ボタンをクリックする。<br />
<img src="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/CreateBucket.jpg" alt="" title="CreateBucket" class="aligncenter size-full wp-image-359" /></p>
<p>ダイアログが表示されたら、[Bucket Name]にS3バケット名を入力する。<br />
<img src="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/CreateBucketDialog.jpg" alt="" title="CreateBucketDialog" class="aligncenter size-full wp-image-360" /></p>
<p>なおバケット名には、Amazon S3を使用しているすべてのユーザー間で一意なものを選ばなければならない。ここで設定している「<code>h2plus-hadoop-hdfs</code>」と同じバケット名はもう使えないので、オリジナルのバケット名を付けるようにしよう。ダイアログで[Create]ボタンをクリックするとS3バケットが作成される。</p>
<p><a href="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/S3Console.jpg" rel="lightbox[347]" title="S3Console"><img src="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/S3Console.jpg" alt="" title="S3Console" class="aligncenter size-full wp-image-361" /></a></p>
<p>次にHadoopのマスターノード上で<code>$HADOOP_HOME/conf/hadoop-site.xml</code>を編集する。</p>
<pre class="brush: xml; first-line: 11; title: ; notranslate">
&lt;property&gt;
  &lt;name&gt;fs.default.name&lt;/name&gt;
  &lt;value&gt;s3://h2plus-hadoop-hdfs&lt;/value&gt;
&lt;/property&gt;

&lt;property&gt;
  &lt;name&gt;fs.s3.awsAccessKeyId&lt;/name&gt;
  &lt;value&gt;Your Access key ID&lt;/value&gt;
&lt;/property&gt;

&lt;property&gt;
  &lt;name&gt;fs.s3.awsSecretAccessKey&lt;/name&gt;
  &lt;value&gt;Your Secret Access Key&lt;/value&gt;
&lt;/property&gt;
</pre>
<p><code>fs.default.name</code>を先ほど作成したS3バケットへのURLに変更して、後続の行に<code>fs.s3.awsAccessKeyId</code>と<code>fs.s3.awsSecretAccessKey</code>というプロパティを追加する。<code>fs.s3.awsAccessKeyId</code>と<code>fs.s3.awsSecretAccessKey</code>の値は、<a href="http://h2plus.biz/hiromitsu/entry/267">前編</a>で<code>hadoop-ec2-env.sh</code>に設定したものと同じで、AWSのSecurity CredentialsページのAccess Credentialsに表示されていたものだ。<br />
<a href="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/AccessKey.jpg" rel="lightbox[347]" title="AccessKey"><img alt="" src="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/AccessKey.jpg" title="AccessKey" class="aligncenter" width="610" /></a></p>
<p>これでHDFSがS3上にマウントされるようになった。</p>
<p>まず、WordCount用の入力データをHDFSに転送する。AWSの管理コンソールにはS3バケットにファイルをアップロードする機能がついているが、HDFSには対応していないため<code>hadoop dfs</code>コマンドを使う必要がある。</p>
<pre>
cluster# cd ~/wordcount
cluster# hadoop dfs -mkdir input
cluster# hadoop dfs -put input/* input
</pre>
<p>AWSの管理コンソールからS3バケットの中身を見てみると、なにやらファイルがたくさん作られているのがわかる。</p>
<p><a href="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/HDFSBlocks.jpg" rel="lightbox[347]" title="HDFSBlocks"><img src="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/HDFSBlocks.jpg" alt="" title="HDFSBlocks" class="aligncenter size-full wp-image-365" /></a></p>
<p>では同じようにHadoopクラスタにWordCountを処理させてみよう。</p>
<pre>
cluster# hadoop jar wordcount.jar org.apache.hadoop.examples.WordCount input output
12/01/24 20:34:08 INFO mapred.FileInputFormat: Total input paths to process : 100
12/01/24 20:34:10 INFO mapred.JobClient: Running job: job_201201241846_0001
12/01/24 20:34:11 INFO mapred.JobClient:  map 0% reduce 0%
...
12/01/24 20:37:27 INFO mapred.JobClient:     Combine input records=157747
12/01/24 20:37:27 INFO mapred.JobClient:     Map output records=157747
12/01/24 20:37:27 INFO mapred.JobClient:     Reduce input records=56339
cluster# hadoop dfs -ls output
Found 2 items
drwxrwxrwx   -          0 1969-12-31 19:00 /user/root/output/_logs
-rwxrwxrwx   1     186137 1969-12-31 19:00 /user/root/output/part-00000
</pre>
<p>設定ファイル（<code>hadoop-site.xml</code>）を変更するだけで、簡単にS3のクラウドストレージ上に分散ファイルシステムを構築することができた。</p>
<p>Hadoopクラスタのマスターノードからログアウトして、クラスタ用のEC2インスタンスをすべて停止させた後でも、ローカル環境にHadoopをインストールしておけば、後からクラスタの出力を取得することができる。</p>
<pre>
cluster# exit
ubuntu$ hadoop-ec2 terminate-cluster  hadoop-cluster
ubuntu$ exit
local$ hadoop dfs -ls output
Found 2 items
drwxrwxrwx   -          0 1969-12-31 19:00 /user/root/output/_logs
-rwxrwxrwx   1     186137 1969-12-31 19:00 /user/root/output/part-00000
local$ hadoop dfs -get output/part-00000
</pre>
<h3>感想</h3>
<p>ギークサロンで手を動かしてHadoopに触ったのはここまでだった。だいたい18時くらいから人が集まりだして、22時近くまで「あ～そうか！」とか「動かねぇorz」とかこぼしながら、参加者全員がラップトップに向かって黙々とHadoopと戯れていた。</p>
<p>今回、山中氏が準備してくださった事前資料は、「Hadoopって聞いたことあるけど触ったことない」という参加者を想定して作られていたこともあり、ウィザード形式で着々とHadoopの環境を整備することができ、ギークサロンではHadoopの分散並列処理を目の前で体感することができた。</p>
<p>実はギークサロンで予定されていた内容はもうワンステップ先があり、1GBほどのfacebookのユーザーデータを解析するという、より実践的なハッカソンとなるはずで、このブログエントリのソースにもなっている山中氏の資料でも続きがあるのだが、ひとまずはHadoopの入門ということでここで区切りたいと思う（余裕があったら別エントリ立てるかも）。</p>
<p>ブログへの転載を快諾してくださった山中仁氏に、この場を借りて御礼申し上げます。</p>
]]></content:encoded>
			<wfw:commentRss>http://h2plus.biz/hiromitsu/entry/347/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://h2plus.biz/hiromitsu/entry/347" />
	</item>
		<item>
		<title>64ビット環境で32ビット版boostバイナリをインストールする</title>
		<link>http://h2plus.biz/hiromitsu/entry/326</link>
		<comments>http://h2plus.biz/hiromitsu/entry/326#comments</comments>
		<pubDate>Mon, 23 Jan 2012 06:17:53 +0000</pubDate>
		<dc:creator>Hiro</dc:creator>
				<category><![CDATA[boost]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[64ビット]]></category>
		<category><![CDATA[bjam]]></category>
		<category><![CDATA[Boost.Build]]></category>
		<category><![CDATA[Fedora]]></category>
		<category><![CDATA[RPM]]></category>
		<category><![CDATA[yum]]></category>
		<category><![CDATA[インストール]]></category>

		<guid isPermaLink="false">http://h2plus.biz/hiromitsu/?p=326</guid>
		<description><![CDATA[64ビット版Fedora14にboost-1.48.0の32ビット版バイナリをインストールしようとしたら、結構手こずってしまったので忘れないようにメモ。RPMがあればyumでインストールしてしまいたいが、あいにくFedo<a href="http://h2plus.biz/hiromitsu/entry/326"> <br /><br /> (More)…</a>]]></description>
			<content:encoded><![CDATA[<p>64ビット版Fedora14にboost-1.48.0の32ビット版バイナリをインストールしようとしたら、結構手こずってしまったので忘れないようにメモ。RPMがあれば<code>yum</code>でインストールしてしまいたいが、あいにく<a href="http://download.fedora.redhat.com/pub/fedora/linux/updates/14/i386/" class="broken_link">Fedora14のRPMリポジトリ</a>はboost-1.44.0以降、更新される気配がなくなってしまったので（本エントリ執筆時点でFedora16はboost-1.47.0まで公開されていた）、自前でビルドせざるを得なくなった。開発マシンが32ビット環境から64ビット環境に変わっても、32ビット版のモジュールをコンパイルすることはまだあるので、64ビット環境でも32ビット版を一緒にコンパイルできた方がずっと楽だ。</p>
<p>まず64ビット版のboostをビルドするには、<a href="http://www.boost.org/doc/libs/1_48_0/more/getting_started/unix-variants.html" target="_blank">Boost Getting Started on Unix Variants</a>の手順に従えばなんなくビルドできるのだが、バージョンアップを考慮してインストール先のディレクトリをデフォルトから変更してビルドする。</p>
<p><span id="more-326"></span></p>
<pre>
$ tar zxf boost_1_48_0.tar.gz
$ cd boost_1_48_0
$ ./bootstrap.sh --libdir=/usr/local/lib64/boost_1_48_0 \
  --includedir=/usr/local/include/boost_1_48_0
$ ./b2
$ sudo ./b2 install
</pre>
<p>boostを使ったC++ソースをコンパイルする場合は、<code>-I</code>オプション、<code>-L</code>オプションを使ってサーチパスを追加すればよい。</p>
<pre>
$ g++ -I/usr/local/include/boost_1_48_0 \
  -L/usr/local/lib64/boost_1_48_0 -o test main.cpp
</pre>
<p>では、64ビット環境で32ビット版のboostをビルドするにはどうすればよいか？<a href="http://www.boost.org/boost-build2/doc/html/bbv2/overview/invocation.html" target="_blank">Boost.Buildのドキュメント</a>を見ると、<code>bjam</code>の引数で<code>address-model</code>オプションを追加できるようなので、32ビット版としてコンパイルするようにオプションを指定する。</p>
<pre>
$ ./bootstrap.sh --libdir=/usr/local/lib/boost_1_48_0 \
  --includedir=/usr/local/include/boost_1_48_0.i686
$ ./bjam address-model=32
$ sudo ./bjam address-model=32 install
$ sudo rm -rf /usr/local/include/boost_1_48_0.i686
</pre>
<p>共有ライブラリのインストール先ディレクトリは64ビット版（<code>/usr/local/lib64</code>）と区別するように、<code>/usr/local/lib</code>配下に32ビット版を配置する。</p>
<p>ヘッダファイルは<code>/usr/local/include/boost_1_48_0.i686</code>にインストールしているが、32ビット版も64ビット版も同じなのでインストール後に削除。</p>
<p>32ビット版のプログラムをコンパイルする場合も同じようにサーチパスを追加してやればよいと。</p>
<pre>
$ g++ -m32 -I/usr/local/include/boost_1_48_0 \
  -L/usr/local/lib/boost_1_48_0 -o test main.cpp
</pre>
]]></content:encoded>
			<wfw:commentRss>http://h2plus.biz/hiromitsu/entry/326/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://h2plus.biz/hiromitsu/entry/326" />
	</item>
		<item>
		<title>Hadoopで始める並列データ解析／前編</title>
		<link>http://h2plus.biz/hiromitsu/entry/267</link>
		<comments>http://h2plus.biz/hiromitsu/entry/267#comments</comments>
		<pubDate>Sat, 21 Jan 2012 07:21:36 +0000</pubDate>
		<dc:creator>Hiro</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Amazon Web Services]]></category>
		<category><![CDATA[AMI]]></category>
		<category><![CDATA[EC2]]></category>
		<category><![CDATA[EC2 API Tools]]></category>
		<category><![CDATA[Hadoop]]></category>
		<category><![CDATA[JTPA]]></category>
		<category><![CDATA[S3]]></category>
		<category><![CDATA[SSH]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[X.509証明書]]></category>
		<category><![CDATA[ギークサロン]]></category>

		<guid isPermaLink="false">http://h2plus.biz/hiromitsu/?p=267</guid>
		<description><![CDATA[1月13日（金）にPalo Altoで行われたJTPAのギークサロンに参加してきた。今回は参加者がラップトップ持ち込みでコーディングしていくハッカソン形式で、会場入りする前までにHadoopが使える環境を自前で用意してお<a href="http://h2plus.biz/hiromitsu/entry/267"> <br /><br /> (More)…</a>]]></description>
			<content:encoded><![CDATA[<p>1月13日（金）にPalo Altoで行われた<a href="http://www.jtpa.org/000562.html">JTPAのギークサロン</a>に参加してきた。今回は参加者がラップトップ持ち込みでコーディングしていくハッカソン形式で、会場入りする前までにHadoopが使える環境を自前で用意しておく必要があった。もうそれだけで、いつものギークサロンよりハードルが高いのだが、当日は15人ほどのギークたち（中には3日前にベイエリアに来たばかりという学生もいた）が集まって、おのおのラップトップとにらめっこしながらHadoopと戯れていた。</p>
<p>今回のギークサロンをホストしてくださった山中仁氏が、EC2上にHadoopクラスタを構築する方法を、参加者向けの資料としてWeb上に準備してくださり、「Hadoop＝未知の領域」だった自分でもすんなりHadoopクラスタを組むことができた。だが残念なことに、この資料自体がEC2上に一時的に立てたサーバーに置かれており情報が恒久的には残らないとのこと（山中氏談）なので、山中氏に一部転載の許可をいただき、自分なりの咀嚼も含めてEC2上にHadoopクラスタを構築する手順を書き留めておくことにした。</p>
<p><span id="more-267"></span></p>
<h3>概要</h3>
<p>Hadoopは並列分散処理を行うための仕組みなので、当然のことながら複数台のマシンを用意する必要がある。自前で物理的なマシンを並べたり、ローカルに仮想マシンを並べたりすることも可能だが、手っ取り早くHadoopを動かすのであれば、Amazon EC2を使うのが時間的にも金銭的にも手軽である。</p>
<p>大まかな手順としては、まずHadoopをコントロールするためのLinuxマシンをEC2上に用意する。そこにHadoopと<a href="http://aws.amazon.com/developertools/351">EC2 API Tools</a>をインストールして、Hadoopを利用するための環境をセットアップする。計算処理を行うためのHadoopクラスタを立ち上げ、処理用の入力データをアタッチして、メインとなる処理を実行する。最後に処理結果の出力データを抽出する。</p>
<h3>Amazon EC2へのサインアップ</h3>
<p>なによりも先に、<a href="http://aws.amazon.com/">AWS (Amazon Web Services)</a>、および<a href="http://aws.amazon.com/ec2/">EC2 (Elastic Compute Cloud)</a>が使えなければならないので、AWSのアカウントを持っていない場合は、以下のサイトを参考にしてサインアップしよう。</p>
<ul>
<li><a href="http://webos-goodies.jp/archives/getting_started_with_amazon_ec2_and_route_53_volume_1_sign_up.html">Amazon EC2とRoute 53のはじめかた その１：サインアップ | WebOS Goodies</a></li>
</ul>
<p>AWSにサインアップしたら（既にAWSアカウントを持っている場合も同じ）、<a href="http://aws.amazon.com/">AWSのホームページ</a>の右上にあるMy Account / Consoleから<a href="https://console.aws.amazon.com/console/home">AWS Management Console</a>をクリックする。</p>
<p><a href="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/AWS-Home.jpg" rel="lightbox[267]" title="AWS-Home"><img src="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/AWS-Home.jpg" alt="" title="AWS-Home" class="alignright size-full wp-image-276" /></a></p>
<p>メールアドレスとパスワードを入力してサインインしよう。<br />
<a href="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/AWS-SignIn.jpg" rel="lightbox[267]" title="AWS-SignIn"><img src="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/AWS-SignIn.jpg" alt="" title="AWS-SignIn" class="alignnone size-full wp-image-282" /></a></p>
<h3>EC2上でLinuxマシンを起動</h3>
<p>管理コンソールが開いたらEC2のタブを選択する。左側のNavigationメニューにあるRegionは[US East]にしておく（インスタンス費が一番安いので）。今回AWSにサインアップしたばかりの人は、<a href="http://aws.amazon.com/free/">無料</a>なので気にすることはないだろう。</p>
<p><img src="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/EC2-Console.jpg" alt="" title="EC2-Console" class="alignnone size-full wp-image-285" /></p>
<p>次にEC2上でクライアントとして起動させるLinuxのマシンイメージ（AMI）を選択する。Linuxのディストリビューションは好みもあるだろうが、ここでは<a href="http://cloud-images.ubuntu.com/releases/10.10/release/">Ubuntu 10.10の公開AMIリスト</a>からEBS上でブートできる64ビットマシンを使うことにする。なお、Ubuntuの他のバージョンの公開AMIリストは、<a href="https://help.ubuntu.com/community/EC2StartersGuide">EC2スターターズガイド</a>から辿ることができる。US EastリージョンでEBSブータブルな64ビットマシンのAMIを探すと、<code>ami-cf33fea6</code>というAMIが見つかる。後ほど検索に使うのでイメージIDをメモしておく。</p>
<p>管理コンソールに戻り、Regionが[US East]になっていることを確認して、EC2 Dashboardに表示されている[Launch Instance]ボタンをクリックする。<br />
<img src="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/EC2-Dashboard.jpg" alt="" title="EC2-Dashboard" class="alignnone size-full wp-image-288" /></p>
<p>[Launch Classic Wizard]を選択して、[Continue]ボタンをクリックする。<br />
<a href="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/CreateInstance.jpg" rel="lightbox[267]" title="CreateInstance"><img src="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/CreateInstance.jpg" alt="" title="CreateInstance" class="alignnone size-full wp-image-289" /></a></p>
<p>[Community AMIs]タブを選択して、上部の検索フォームに先ほどメモしておいた<code>ami-cf33fea6</code>を入力すると、UbuntuのAMIが見つかるので[Select]ボタンをクリックする。<br />
<a href="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/ChooseAnAMI.jpg" rel="lightbox[267]" title="ChooseAnAMI"><img src="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/ChooseAnAMI.jpg" alt="" title="ChooseAnAMI" class="alignnone size-full wp-image-293" /></a></p>
<p>インスタンスの種類は一番下のスペックでも十分なのでMicroインスタンスを選択。Availability Zoneは[us-east-1c]を選んで、[Continue]ボタンをクリックする。<br />
<a href="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/InstanceDetails.jpg" rel="lightbox[267]" title="InstanceDetails"><img src="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/InstanceDetails.jpg" alt="" title="InstanceDetails" class="alignnone size-full wp-image-294" /></a></p>
<p>このページはデフォルトのまま[Continue]ボタンをクリック。<br />
<a href="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/InstanceConfigs.jpg" rel="lightbox[267]" title="InstanceConfigs"><img src="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/InstanceConfigs.jpg" alt="" title="InstanceConfigs" class="alignnone size-full wp-image-295" /></a></p>
<p>このページも基本デフォルトのままでもいいが、他にもEC2のインスタンスを立ち上げている場合は、EC2 Dashboardでインスタンスを見つけやすいように名前を付けておくといいだろう。<br />
<a href="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/InstanceTags.jpg" rel="lightbox[267]" title="InstanceTags"><img src="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/InstanceTags.jpg" alt="" title="InstanceTags" class="alignnone size-full wp-image-296" /></a></p>
<p>UbuntuにSSHでアクセスする際に使用するRSA秘密鍵／公開鍵の鍵ペアを新たに作成する。鍵ペアの名前をここでは<code>ec2-hadoop</code>として、[Create &#038; Download your Kay Pair]をクリックすると、<code>ec2-hadoop.pem</code>というファイルがダウンロードされる。SSHでアクセスする際に必要になる秘密鍵なので、うっかり消さないように要注意（失くしたらまた新しい鍵ペアを作らなければならない）。<br />
<a href="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/CreateKeyPair.jpg" rel="lightbox[267]" title="CreateKeyPair"><img src="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/CreateKeyPair.jpg" alt="" title="CreateKeyPair" class="alignnone size-full wp-image-297" /></a></p>
<p>UbuntuにSSHでアクセスできるようにするためファイアウォールに穴を開ける。[Create a new Security Group]のラジオボタンを選んで、Group NameとGroup Descriptionはわかりやすいようなものを入力しておく。[Create a new Rule]でSSHを選択して[Add Rule]ボタンをクリックする。右側の一覧にSSHが追加されたことを確認したら[Continue]ボタンをクリックする。<br />
<a href="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/Firewall.jpg" rel="lightbox[267]" title="Firewall"><img src="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/Firewall.jpg" alt="" title="Firewall" class="alignnone size-full wp-image-298" /></a></p>
<p>最後にウィザードで設定した内容の確認ページが表示され、[Launch]ボタンをクリックすると、EC2上にUbuntuのインスタンスが作成・起動される。<br />
<a href="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/Review.jpg" rel="lightbox[267]" title="Review"><img src="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/Review.jpg" alt="" title="Review" class="alignnone size-full wp-image-299" /></a></p>
<p>EC2の管理コンソールで左側のNavigationメニューからInstancesを選ぶと、インスタンスの起動状態が確認できる。<br />
<a href="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/Instances.jpg" rel="lightbox[267]" title="Instances"><img src="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/Instances.jpg" alt="" title="Instances" class="alignnone size-full wp-image-300" /></a></p>
<p>最後に必須ではないが、もし今回AWSにサインアップしたばかりであれば、Elastic IPが1つ無料で使えるらしいので、インスタンスにグローバルIPを割り当てておくといいだろう。NavigationメニューからElastic IPsを選び、[Allocate New Address]ボタンをクリックすると、さらにダイアログが出てくるので[Yes, Allocate]ボタンをクリックする。<br />
<a href="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/ElasticIPs.jpg" rel="lightbox[267]" title="ElasticIPs"><img src="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/ElasticIPs.jpg" alt="" title="ElasticIPs" class="alignnone size-full wp-image-305" /></a></p>
<p>追加されたElastic IPを右クリックすると、[Release]と[Associate]というプルダウンが出てくるので、[Associate]をクリック。Elastice IPを割り当てるインスタンスに、先ほど起動させた<code>hadoop-client</code>を選択して[Yes, Allocate]ボタンをクリックする。<br />
<img src="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/EIP-Associate.jpg" alt="" title="EIP-Associate" class="alignnone size-full wp-image-306" /></p>
<p>Elastic IPを使わない場合は、インスタンス起動時に割り当てられるパブリックDNS名でアクセスすることになる。NavigationメニューのInstancesから<code>hadoop-client</code>のインスタンスを選択して、画面下部に表示される詳細情報にあるPublic DNSをメモしておこう。Elastic IPを使えばインスタンスを再起動しても同じIPアドレスでアクセスできるが、パブリックDNSはインスタンスが起動するたびにコロコロ変わる。短時間で遊ぶ分にはパブリックDNSでも十分だろう。<br />
<a href="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/PublicDNS.jpg" rel="lightbox[267]" title="PublicDNS"><img src="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/PublicDNS.jpg" alt="" title="PublicDNS" class="alignnone size-full wp-image-307" /></a></p>
<p>えらくスペースを割いてしまったが、ここまではHadoopはまったく関係ない。EC2上にLinuxマシンを立ち上げたに過ぎない。</p>
<h3>HadoopとEC2 API Toolsのインストール</h3>
<p>EC2をセットアップする過程でダウンロードしたSSH用の秘密鍵を使って、UbuntuのインスタンスにSSHでログインして、Hadoopに必要なソフトをインストールしていく。Windowsならば<a href="http://sourceforge.jp/projects/ttssh2/">TeraTerm</a>や<a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html">PuTTY</a>を使う。Linux/Macならばターミナルからアクセスする。</p>
<p>ダウンロードした秘密鍵（<code>ec2-hadoop.pem</code>）は、<code>~/.ssh</code>ディレクトリに移動してパーミッションを<code>600</code>に変更する。ファイル名も秘密鍵だとわかるように<code>id_rsa.ec2-hadoop</code>に変更しておく。</p>
<pre>
local$ mv ~/Downloads/ec2-hadoop.pem ~/.ssh/id_rsa.ec2-hadoop
local$ chmod 600 ~/.ssh/id_rsa.ec2-hadoop
</pre>
<p>インスタンスにElastic IPを割り当てた場合はIPアドレスを、Elastic IPを使っていない場合はパブリックDNSを、接続先のホストとして指定することになる。Ubuntuコミュニティが提供しているAMIには予め<code>ubuntu</code>というユーザーが作られているので、このアカウントを使ってログインする。sshで指定するオプションが非常に長くなるので、<code>~/.bashrc</code>あたりにエイリアスを書いおこう。</p>
<pre class="brush: bash; title: ; notranslate">
export EC2_HADOOP_HOST=&quot;ec2-50-17-70-166.compute-1.amazonaws.com&quot;
export EC2_HADOOP_KEY=~/.ssh/id_rsa.ec2-hadoop
alias ec2hadoop=&quot;ssh -i $EC2_HADOOP_KEY ubuntu@$EC2_HADOOP_HOST&quot;
</pre>
<p>これで<code>ec2hadoop</code>とタイプするだけで、Ubuntuにログインできるようになる。</p>
<pre>
local$ . ~/.bashrc
local$ ec2hadoop
The authenticity of host 'ec2-50-17-70-166.compute-1.amazonaws.com (50.17.70.166)' can't be established.
RSA key fingerprint is 66:65:ef:40:2a:49:67:e2:dd:4e:42:d3:00:a2:f4:ad.
Are you sure you want to continue connecting (yes/no)? <strong>yes</strong>

ubuntu$
</pre>
<p>まずはHadoopとEC2 API Toolsを動作させるためにJDKをインストールする。</p>
<pre>
ubuntu$ sudo apt-add-repository "deb http://archive.canonical.com/ lucid partner"
ubuntu$ sudo apt-get update
ubuntu$ sudo apt-get install sun-java6-jdk
</pre>
<p>次にEC2 API Toolsをインストールする。</p>
<pre>
ubuntu$ sudo apt-add-repository ppa:awstools-dev/awstools
ubuntu$ sudo apt-get update
ubuntu$ sudo apt-get install ec2-api-tools
</pre>
<p>最後にHadoopをダウンロードして、<code>/usr/local</code>に展開する。</p>
<pre>
ubuntu$ wget www.gtlib.gatech.edu/pub/apache/hadoop/core/hadoop-1.0.0/hadoop-1.0.0.tar.gz
ubuntu$ tar -zxf hadoop-1.0.0.tar.gz
ubuntu$ sudo mv hadoop-1.0.0 /usr/local/hadoop
</pre>
<p>UbuntuにHadoop、EC2 API Toolsをインストールする方法は、<a href="https://help.ubuntu.com/community/EC2StartersGuide">EC2スターターズガイド</a>でも紹介されているので参考に。</p>
<h3>EC2-Hadoopクラスタの設定</h3>
<p>HadoopにはデフォルトでEC2上にクラスタを構築する機能が搭載されている。これを利用するために必要なセットアップを行っていく。</p>
<p>まず、HadoopがEC2にアクセスするためのX.509証明書と秘密鍵を、AWSの管理コンソールからダウンロードする。AWSの管理コンソールの右上にあるアカウントメニューから[Security Credentials]をクリックする。<br />
<img src="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/SecurityCredentials.jpg" alt="" title="SecurityCredentials" class="alignnone size-full wp-image-312" /></p>
<p>Access Credentialsの[X.509 Certificates]タブを選択して[Create a new Certificate]をクリックする。<br />
<a href="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/CreateCertificate.jpg" rel="lightbox[267]" title="CreateCertificate"><img src="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/CreateCertificate.jpg" alt="" title="CreateCertificate" class="alignnone size-full wp-image-315" /></a></p>
<p>[Download Private Key File]ボタンと[Download X.509 Certificate]ボタンをそれぞれクリックすると、秘密鍵とX.509証明書がダウンロードされる。ダウンロードが完了したら[Close]ボタンをクリックする。<br />
<img src="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/DownloadKeyPair.jpg" alt="" title="DownloadKeyPair" class="alignnone size-full wp-image-316" /></p>
<p>ダウンロードしたX.509証明書と秘密鍵を、EC2上のUbuntuにscpでアップロードする。Windowsの場合は、<a href="http://winscp.net">WinSCP</a>を使うといいだろう。</p>
<pre>
local$ cd ~/Downloads
local$ mv pk-XXXXXXXXXXXXXXXXXXXXXXXXXXXX.pem pk.pem
local$ mv cert-XXXXXXXXXXXXXXXXXXXXXXXXXXXX.pem cert.pem
local$ scp -i $EC2_HADOOP_KEY ~/Downloads/{pk,cert}.pem \
  ubuntu@$EC2_HADOOP_HOST:/home/ubuntu
</pre>
<p>なお、Ubuntuの環境はHadoopの利用専用で、かつ自分以外に他のユーザーが使わないという前提で設定している。もし、既存の共用Linux環境で設定する場合は、秘密鍵の保存ディレクトリやパーミッションを適切に設定するように。</p>
<p>Ubuntuに再度SSHでログインして、HadoopとEC2 API Toolsを使う上で必要になる環境変数を<code>~/.profile</code>に追記していく。</p>
<pre>
local$ ec2hadoop
ubuntu$ vi .profile
</pre>
<pre class="brush: bash; title: ; notranslate">
# 以下のスクリプトを追記する
export JAVA_HOME=&quot;/usr/lib/jvm/java-6-sun&quot;
export EC2_HOME=&quot;/usr/lib/ec2-api-tools&quot;
export HADOOP_HOME=&quot;/usr/local/hadoop&quot;
export PATH=&quot;$PATH:$EC2_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/src/contrib/ec2/bin&quot;
export EC2_PRIVATE_KEY=&quot;$HOME/pk.pem&quot;
export EC2_CERT=&quot;$HOME/cert.pem&quot;
</pre>
<p><code>~/.profile</code>を読み込んで、<code>ec2-describe-instances</code>コマンドが実行できることを確認する。</p>
<pre>
ubuntu$ . .profile
ubuntu$ ec2-describe-instances
</pre>
<p>UbuntuがHadoopクラスタとの通信するために使うアクセスキーを、<code>id_rsa-gsg-keypair</code>というファイルに保存する。<code>id_rsa-gsg-keypair</code>ファイルは<code>$EC2_PRIVATE_KEY</code>が保存されているディレクトリと同じにする必要がある。また、パーミッションは<code>600</code>に設定する。</p>
<pre>
ubuntu$ ec2-add-keypair gsg-keypair | tail -n +2 > id_rsa-gsg-keypair
ubuntu$ chmod 600 id_rsa-gsg-keypair
</pre>
<p>最後に<code>hadoop-ec2-env.sh</code>を編集して、HadoopのEC2クラスタ用の環境変数を設定する。</p>
<pre>
ubuntu$ vi $HADOOP_HOME/src/contrib/ec2/bin/hadoop-ec2-env.sh
</pre>
<p>設定が必要な箇所は18～25行目にある3つの変数。</p>
<ul>
<li>AWS_ACCOUNT_ID</li>
<li>AWS_ACCESS_KEY_ID</li>
<li>AWS_SECRET_ACCESS_KEY</li>
</ul>
<p><code>AWS_ACCOUNT_ID</code>は、AWSのSecurity Credentialsページの右上、Account Numberに表示されている12桁の数字（設定時はハイフンを取り除く）。<br />
<a href="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/AccountNumber.jpg" rel="lightbox[267]" title="AccountNumber"><img src="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/AccountNumber.jpg" alt="" title="AccountNumber" class="alignnone size-full wp-image-319" /></a></p>
<p>次にアクセスキーを作成する。同じくSecurity CredentialsページにあるAccess Credentialsの[Access Keys]タブを選択して[Create a new Access Key]をクリックする。<br />
<a href="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/CreateAccessKey.jpg" rel="lightbox[267]" title="CreateAccessKey"><img src="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/CreateAccessKey.jpg" alt="" title="CreateAccessKey" class="alignnone size-full wp-image-320" /></a></p>
<p><code>AWS_ACCESS_KEY_ID</code>には、作成したアクセスキーの[Access Key ID]欄の文字列を指定する。<code>AWS_SECRET_ACCESS_KEY</code>には[Show]をクリックしたときに表示される文字列を設定する。<br />
<a href="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/AccessKey.jpg" rel="lightbox[267]" title="AccessKey"><img src="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/AccessKey.jpg" alt="" title="AccessKey" class="alignnone size-full wp-image-321" /></a></p>
<p><code>hadoop-ec2-env.sh</code>を保存したら、いよいよHadoopのクラスタを立ち上げる。</p>
<pre>
ubuntu$ hadoop-ec2 launch-cluster hadoop-cluster 2
</pre>
<p>3番目の引数<code>hadoop-cluster</code>はクラスタ群に付ける名前なので任意で構わない。最後の引数では起動するスレーブクラスタの数（今回は2台）を指定している。クラスタの起動にはかなり時間がかかるので、コーヒーでも飲みながら待つこととしよう。</p>
<p>これでHadoopを使うための準備は完了である。EC2をセットアップするところから説明してきているので非常に面倒な気もするが、物理マシンや仮想マシンを自前で用意するよりもずっと楽なはず。</p>
<p>クラスタの起動が完了したら、Hadoopのマスタークラスタにログインして、試しにサンプルの円周率計算ソフトを実行してみよう。</p>
<pre>
ubuntu$ hadoop-ec2 login hadoop-cluster
cluster# hadoop jar $HADOOP_HOME/hadoop-0.19.0-examples.jar pi 10 10000000
Number of Maps = 10 Samples per Map = 10000000
Wrote input for Map #0
Wrote input for Map #1
Wrote input for Map #2
Wrote input for Map #3
Wrote input for Map #4
Wrote input for Map #5
Wrote input for Map #6
Wrote input for Map #7
Wrote input for Map #8
Wrote input for Map #9
Starting Job
12/01/19 21:41:34 INFO mapred.FileInputFormat: Total input paths to process : 10
12/01/19 21:41:35 INFO mapred.JobClient: Running job: job_201201192136_0001
12/01/19 21:41:36 INFO mapred.JobClient:  map 0% reduce 0%
12/01/19 21:41:48 INFO mapred.JobClient:  map 10% reduce 0%
12/01/19 21:41:53 INFO mapred.JobClient:  map 20% reduce 0%
12/01/19 21:42:00 INFO mapred.JobClient:  map 30% reduce 0%
12/01/19 21:42:01 INFO mapred.JobClient:  map 40% reduce 0%
12/01/19 21:42:03 INFO mapred.JobClient:  map 50% reduce 0%
12/01/19 21:42:04 INFO mapred.JobClient:  map 60% reduce 0%
12/01/19 21:42:09 INFO mapred.JobClient:  map 70% reduce 0%
12/01/19 21:42:11 INFO mapred.JobClient:  map 80% reduce 0%
12/01/19 21:42:14 INFO mapred.JobClient:  map 90% reduce 6%
12/01/19 21:42:17 INFO mapred.JobClient:  map 100% reduce 20%
12/01/19 21:42:22 INFO mapred.JobClient:  map 100% reduce 26%
12/01/19 21:42:23 INFO mapred.JobClient:  map 100% reduce 100%
12/01/19 21:42:24 INFO mapred.JobClient: Job complete: job_201201192136_0001
12/01/19 21:42:24 INFO mapred.JobClient: Counters: 16
12/01/19 21:42:24 INFO mapred.JobClient:   File Systems
12/01/19 21:42:24 INFO mapred.JobClient:     HDFS bytes read=1180
12/01/19 21:42:24 INFO mapred.JobClient:     HDFS bytes written=255
12/01/19 21:42:24 INFO mapred.JobClient:     Local bytes read=366
12/01/19 21:42:24 INFO mapred.JobClient:     Local bytes written=1066
12/01/19 21:42:24 INFO mapred.JobClient:   Job Counters
12/01/19 21:42:24 INFO mapred.JobClient:     Launched reduce tasks=1
12/01/19 21:42:24 INFO mapred.JobClient:     Launched map tasks=10
12/01/19 21:42:24 INFO mapred.JobClient:     Data-local map tasks=10
12/01/19 21:42:24 INFO mapred.JobClient:   Map-Reduce Framework
12/01/19 21:42:24 INFO mapred.JobClient:     Reduce input groups=2
12/01/19 21:42:24 INFO mapred.JobClient:     Combine output records=0
12/01/19 21:42:24 INFO mapred.JobClient:     Map input records=10
12/01/19 21:42:24 INFO mapred.JobClient:     Reduce output records=0
12/01/19 21:42:24 INFO mapred.JobClient:     Map output bytes=320
12/01/19 21:42:24 INFO mapred.JobClient:     Map input bytes=240
12/01/19 21:42:24 INFO mapred.JobClient:     Combine input records=0
12/01/19 21:42:24 INFO mapred.JobClient:     Map output records=20
12/01/19 21:42:24 INFO mapred.JobClient:     Reduce input records=20
Job Finished in 50.49 seconds
Estimated value of PI is 3.14146444
</pre>
<p><code>3.141</code>までしか計算合ってないが&#8230;とりあえず動いていることは確認できた。</p>
<p>立ち上げたクラスタをそのまま放置してしまうとEC2で課金されてしまうので、不要になったらクラスタを落としておこう。自分はギークサロンの前日に準備だけして当日まで放置しておいたら、HadoopのクラスタがLinuxのSmallインスタンスとして起動することもあり（マスタークラスタ1台とスレーブクラスタ2台の計3台分）、一晩で$6くらい課金されてしまったorz</p>
<pre>
hadoop-ec2 terminate-cluster hadoop-cluster
</pre>
<h4>参考サイト</h4>
<ul>
<li><a href="http://wiki.apache.org/hadoop/AmazonEC2">Running Hadoop on Amazon EC2 &#8211; Hadoop Wiki</a></li>
<li><a href="http://developer.yahoo.com/hadoop/tutorial/module4.html">Hadoop Tutorial Module4: MapReduce &#8211; Yahoo! Developer Network</a></li>
<li><a href="http://codezine.jp/article/detail/2841">blogeyeの実装に学ぶ、Amazon EC2/S3でのHadoop活用術 &#8211; CodeZine</a></li>
<li><a href="http://d.hatena.ne.jp/rx7/20080528/p1">Amazon EC2/S3を使ってみた &#8211; まとめ (Amazon Web Services関連エントリ目次) &#8211; RX-7乗りの適当な日々</a></li>
</ul>
<p><a href="http://h2plus.biz/hiromitsu/entry/347">後編</a>に続く</p>
]]></content:encoded>
			<wfw:commentRss>http://h2plus.biz/hiromitsu/entry/267/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://h2plus.biz/hiromitsu/entry/267" />
	</item>
		<item>
		<title>My Favorite Buffalo Wings</title>
		<link>http://h2plus.biz/hiromitsu/entry/257</link>
		<comments>http://h2plus.biz/hiromitsu/entry/257#comments</comments>
		<pubDate>Wed, 18 Jan 2012 05:57:31 +0000</pubDate>
		<dc:creator>Hiro</dc:creator>
				<category><![CDATA[食卓]]></category>
		<category><![CDATA[Sprouts Farmers Market]]></category>
		<category><![CDATA[サニーベール]]></category>
		<category><![CDATA[バッファローウィング]]></category>

		<guid isPermaLink="false">http://h2plus.biz/hiromitsu/?p=257</guid>
		<description><![CDATA[バッファローウィングと言えば、ビールのお伴にぴったりなアパタイザーだが、外で食べるとどうも味が濃くて、チキンを食べているというよりもソースを食べている感覚になる。喉が渇いてビールを加速させるという算段なのだろうが&#82<a href="http://h2plus.biz/hiromitsu/entry/257"> <br /><br /> (More)…</a>]]></description>
			<content:encoded><![CDATA[<p><img src="http://h2plus.biz/hiromitsu/wp-content/uploads/2012/01/M0015655-300x225.jpg" alt="" title="オーブンで焼くだけ。簡単だけど美味い。" width="300" class="alignright size-medium wp-image-258" />バッファローウィングと言えば、ビールのお伴にぴったりなアパタイザーだが、外で食べるとどうも味が濃くて、チキンを食べているというよりもソースを食べている感覚になる。喉が渇いてビールを加速させるという算段なのだろうが&#8230;</p>
<p>そんな味の濃いバッファローウィングに飽きてしまったら、さっぱり系のバッファローウィングはいかがだろうか？<a href="http://sprouts.com/stores/sprouts-sunnyvale">Sprouts Farmers Market</a>にお気に入りのバッファローウィングがある。</p>
<p><span id="more-257"></span><br />
店内に入って右側に肉とシーフードのコーナーがあり、赤いソースに漬かった手羽先が陳列されている。以前はBuffalo Wingsというラベルがあったのに、先日行ったときにはHot Winggestとかいう微妙な命名がされていたので、同じ商品かどうか悩ましかったが、食べてみたら味は変わっていなかった（実に紛らわしい）。</p>
<p>Sproutsはオーガニックな商品を取り揃えている店だけあって、チキンがジューシーでやわらかくて美味しい。味付けも軽いスパイシーさと酸味が絶妙。バッファローウィングと言えばサワークリームが定番だが、Sproutsのバッファローウィングはサワークリームなどつけてはもったいない。</p>
<p>値段は$3.49/lbくらいで、妻と二人で食べるには1ポンド（12本くらい）でちょうどいい。オーブンで350～400Fで15分も焼けばできあがり。BBQでも人気の一品である。焼き過ぎてしまうとジューシーさが失われてしまうので放置プレイは禁物だ。</p>
<p><strong>Sprouts Farmer&#8217;s Market</strong><br />
<a href="http://g.co/maps/zbg5y">111 East El Camino Real, Sunnyvale, CA</a></p>
<p><iframe width="610" height="400" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="http://maps.google.com/maps?f=q&#038;source=s_q&#038;hl=en&#038;geocode=&#038;q=Sprouts+Farmers+Market,+East+El+Camino+Real,+Sunnyvale,+CA&#038;aq=2&#038;oq=sprouts&#038;sll=37.0625,-95.677068&#038;sspn=40.137381,68.994141&#038;ie=UTF8&#038;hq=Sprouts+Farmers+Market,+East+El+Camino+Real,+Sunnyvale,+CA&#038;t=m&#038;ll=37.377387,-122.029953&#038;spn=0.027282,0.052271&#038;z=14&#038;iwloc=A&#038;output=embed"></iframe><br /><small><a href="http://maps.google.com/maps?f=q&#038;source=embed&#038;hl=en&#038;geocode=&#038;q=Sprouts+Farmers+Market,+East+El+Camino+Real,+Sunnyvale,+CA&#038;aq=2&#038;oq=sprouts&#038;sll=37.0625,-95.677068&#038;sspn=40.137381,68.994141&#038;ie=UTF8&#038;hq=Sprouts+Farmers+Market,+East+El+Camino+Real,+Sunnyvale,+CA&#038;t=m&#038;ll=37.377387,-122.029953&#038;spn=0.027282,0.052271&#038;z=14&#038;iwloc=A" style="color:#0000FF;text-align:left">View Larger Map</a></small></p>
]]></content:encoded>
			<wfw:commentRss>http://h2plus.biz/hiromitsu/entry/257/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://h2plus.biz/hiromitsu/entry/257" />
	</item>
	</channel>
</rss>

