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

<channel>
	<title>ReSTARTR</title>
	<atom:link href="http://blog.restartr.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.restartr.com</link>
	<description>PythonとかScalaとか弄ります。</description>
	<lastBuildDate>Wed, 28 Dec 2011 12:27:52 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>EventStatsはherokuとMongoLabとさくらVPSで動いている</title>
		<link>http://blog.restartr.com/2011/12/28/eventstats-consist-of-heroku-mongolab-and-sakura-vps/</link>
		<comments>http://blog.restartr.com/2011/12/28/eventstats-consist-of-heroku-mongolab-and-sakura-vps/#comments</comments>
		<pubDate>Wed, 28 Dec 2011 12:27:52 +0000</pubDate>
		<dc:creator>ReSTARTR</dc:creator>
				<category><![CDATA[python]]></category>
		<category><![CDATA[Scala]]></category>
		<category><![CDATA[Webサービス]]></category>
		<category><![CDATA[casbah]]></category>
		<category><![CDATA[eventstats]]></category>
		<category><![CDATA[heroku]]></category>
		<category><![CDATA[mongodb]]></category>
		<category><![CDATA[pymongo]]></category>
		<category><![CDATA[unfiltered]]></category>

		<guid isPermaLink="false">http://blog.restartr.com/?p=1174</guid>
		<description><![CDATA[今月頭にブログ書きましたが、EventStatsという勉強会の参加者の推移が見れるサービスを公開しました。 EventStats &#8211; イベントの統計情報が見れます まぁ自分が欲しかっただけなんですけど、使って [...]]]></description>
			<content:encoded><![CDATA[<p>今月頭に<a href="http://blog.restartr.com/2011/12/10/eventststs">ブログ書きました</a>が、EventStatsという勉強会の参加者の推移が見れるサービスを公開しました。</p>

<ul>
<li><a href="http://eventstats.restartr.com">EventStats &#8211; イベントの統計情報が見れます</a></li>
</ul>

<p>まぁ自分が欲しかっただけなんですけど、使ってみて頂ければ幸いです。</p>

<p>今回はそのサービスの構成とかについて書いてみます。</p>

<h3>アジェンダ</h3>

<ol>
<li>全体像</li>
<li>システム構成</li>
<li>Gitリポジトリ</li>
<li>MongoDBのPaaS</li>
<li>各イベント管理サービスAPIの違い</li>
<li>開発メモ</li>
</ol>

<h3>1.全体像</h3>

<p>開発環境も含めて全体像を図にしてみました。(初Cacooですが超べんりですね！)<br />
赤い線がGit操作で、黒い点線がMongoDBへのアクセスです。</p>

<p><a href="https://cacoo.com/diagrams/Cp2yo6tQNlxCm5av"><img border="1" alt="全体像" src="https://cacoo.com/diagrams/Cp2yo6tQNlxCm5av-2260A.png"></a></p>

<h3>2.システム構成</h3>

<p>大きく分けてwebとクローラーの２つです。</p>

<p>webはherokuに、クローラーはさくらのVPSに配置。<br />
まずは優先してデータ蓄積を…ということでクローラーをpythonとmongodbで作成しました。<br />
(サービス的にはやいとこデータためないと意味ないので。)</p>

<p>クローラーは５分おきに起動するのでScalaよりPythonを選択しました。起動コスト重視です。<br />(<em>Scalaでサクサク開発できる程のスキルではないというのもありますが…</em>)</p>

<p>実行場所はherokuのworkerも考えたましたが、最終的に既に利用していたさくらVPSでcronジョブとして運用することに。<br />
ということでScalaのWebはデータ参照のみで、データの更新はしません。</p>

<h3>3.Gitリポジトリ</h3>

<p>webとクローラーは分けてGitで管理。リモートリポジトリはどちらもさくらのVPS上においています。<br />
ただし、本番リリースは開発PCからherokuに別途pushします。<br />
※webもさくらVPSにリモートリポジトリを持って、本番データを参照するステージング環境として利用しています。</p>

<h4>eventstats-web</h4>

<ul>
<li>host: <a href="http://www.heroku.com/">heroku</a> (Chedar)</li>
<li>scala

<ul>
<li>フレームワーク: <a href="https://github.com/unfiltered/unfiltered">unfiltered</a> 0.5.1</li>
<li>mongodb接続: <a href="http://api.mongodb.org/scala/casbah/2.1.5.0/">casbah</a> 2.1.5-1</li>
<li>テンプレートエンジン: <a href="https://github.com/unfiltered/unfiltered/tree/master/scalate">unfiltered-scalate</a> (ssp)</li>
<li>テスティングライブラリ: <a href="https://github.com/unfiltered/unfiltered/tree/master/spec">unfiltered-specs</a></li>
</ul></li>
<li>チャートのレンダリング: <a href="http://code.google.com/apis/chart/index.html">Google Chart Tools</a></li>
</ul>

<h4>eventstats-crawler</h4>

<ul>
<li>host: さくらのvps</li>
<li>python 2.6

<ul>
<li>フレームワーク: なし</li>
<li>mongodb接続: <a href="http://api.mongodb.org/python/1.11/">pymongo</a> 1.11</li>
<li>テスティングライブラリ: <a href="http://readthedocs.org/docs/nose/en/latest/">nose</a></li>
<li>その他: <a href="http://www.crummy.com/software/BeautifulSoup/">BeautifulSoup</a> (<em>partake.inのwebスクレイピングに利用</em>)</li>
</ul></li>
</ul>

<h3>4.MongoDBのPaas</h3>

<p>herokuプラグインとして<a href="https://addons.heroku.com/mongolab">MongoLab</a>と<a href="https://addons.heroku.com/mongohq">MongoHQ</a>の２つが提供されています。どちらも無料枠があるのですが、<strong>MongoLabの方が無料で利用できる容量が大きい</strong>のでこちらを選択。<br />
月額の利用料金は以下です。（括弧内は1MBあたりの金額の目安です）</p>

<p><em>これ以上の容量も利用可能ですが個人で払う範囲ではないと思い除外してます。</em></p>

<h4>MongoLab</h4>

<ul>
<li>$ 0.00/240MB</li>
<li>$10.00/0.5GB  ($0.020/MB)</li>
<li>$20.00/2.0GB  ($0.009/MB)</li>
</ul>

<h4>MongoHQ</h4>

<ul>
<li>$ 0.00/ 16MB</li>
<li>$ 5.00/256MB  ($0.019/MB)</li>
<li>$15.00/2.0GB  ($0.007/MB)</li>
</ul>

<h3>5.各イベント管理サービスAPIの違い</h3>

<p>まずは<strong>atnd, zusaar, partake.inの３サービスに対応</strong>。<br />
それぞれ検索APIを提供してくれているのですが、当然ながら規格とかもないのでリクエストもレスポンスも違いがあります。
データ蓄積する際にそのAPIの差異を吸収して、webアプリから参照する際は気にしなくていい戦略をとりました。</p>

<p>APIの違い検索のみに特化して違いをまとめると以下の通りです。</p>

<h4>atnd</h4>

<p>イベント数も多いので、このAPIをスタンダードに設定。</p>

<ul>
<li>API仕様

<ul>
<li><a href="http://api.atnd.org/">http://api.atnd.org/</a></li>
</ul></li>
<li>リクエストパス

<ul>
<li><a href="http://api.atnd.org/events/">/events/</a></li>
<li>イベントの検索</li>
<li><a href="http://api.atnd.org/events/users/">/events/users/</a></li>
<li>イベントに参加しているユーザーの検索</li>
</ul></li>
</ul>

<h4>zusaar</h4>

<p>基本的にはatnd準拠っぽい感じだけど細かい違いがあります。</p>

<ul>
<li>API仕様

<ul>
<li><a href="http://www.zusaar.com/doc/api.html">http://www.zusaar.com/doc/api.html</a></li>
</ul></li>
<li>リクエストパス

<ul>
<li><a href="http://www.zusaar.com/api/event/">/api/event/</a>

<ul>
<li>イベントの検索</li>
</ul></li>
<li><a href="http://www.zusaar.com/api/event/user/">/api/event/user/</a>

<ul>
<li>イベントに参加しているユーザーの検索</li>
</ul></li>
</ul></li>
</ul>

<p>atndとの違い</p>

<ul>
<li>エントリポイントやデータのキー名が単数形

<ul>
<li>events→event</li>
<li>users→user</li>
</ul></li>
<li>明確なフィールドとしてのtwitter_idが無い

<ul>
<li>管理者も参加ユーザーも</li>
</ul></li>
<li>ハッシュタグがない</li>
<li>レスポンスはjson一択</li>
</ul>

<h4>partake.in</h4>

<p>全然違うAPI。APIリストにあっても未実装がほとんどなので、利用する際はソースを確認したほうが良いです。</p>

<p>今回必要になりそうなAPIは２つくらいでした。</p>

<ul>
<li>API仕様

<ul>
<li><a href="http://code.google.com/p/partakein/wiki/PublicWebAPI">http://code.google.com/p/partakein/wiki/PublicWebAPI</a></li>
</ul></li>
<li>リクエストパス

<ul>
<li><a href="http://partake.in/api/event/search/">/api/event/search</a>

<ul>
<li>イベントの検索</li>
</ul></li>
<li><a href="http://partake.in/api/event/get/">/api/event/get</a>

<ul>
<li>イベントの詳細データ取得</li>
</ul></li>
</ul></li>
<li>APIのソース(抜粋)

<ul>
<li><a href="http://code.google.com/p/partakein/source/browse/trunk/Partake/src/main/java/in/partake/controller/api/event/SearchAction.java">in.partake.controller.api.event.SearchAction.java</a></li>
<li><a href="http://code.google.com/p/partakein/source/browse/trunk/Partake/src/main/java/in/partake/controller/api/event/EventAction.java">in.partake.controller.api.event.EventAction.java</a></li>
</ul></li>
</ul>

<p>その他の特徴は以下。</p>

<ul>
<li>複数イベントを特定して一括取得するAPIはない</li>
<li>フィールド名がcamelCase形式</li>
<li>レスポンスはjson一択</li>
<li>検索パラメータも特殊かつ少数</li>
<li>検索APIで取得できるのはイベントの固定情報のみ

<ul>
<li>参加枠数はAPIから取得可能</li>
<li>変動するユーザー数は取得不可能</li>
<li>→Webページをスクレイピングするしかないという結論</li>
</ul></li>
</ul>

<p>上記をふまえ、atnd/zusaarはJSON形式でAPIからデータ取得。<br />
partake.inのみイベントのリストをAPIから取得して、ユーザー数はWebページのスクレイピングで対応しました。</p>

<h3>6.開発メモ</h3>

<h4>web(heroku)からもクローラー(さくらのvps)からも離れた場所にある</h4>

<p>開発PC上だと気にならなかったのですが、1件1件findしてinsertやupdateをしていると当然遅いです。なのである程度まとめて一気にinsertする方針に変更しました(ベンチ結果はありません ^^;)。</p>

<p>更新はクローラーの１プロセスからのみ実行されるので、トランザクションとか意識しなくて良いです。なので比較的自由な構成がとれます。</p>

<h4>ScalaでJSON API</h4>

<p>まずはUnfilteredでJSON APIを作成。けど、jsでjson取得〜チャート生成の実行時間が思いの外大きいので、jsonも１枚のHTMLに埋め込む方針に変更。</p>

<h3>さいごに</h3>

<p>ざっと書きだすとこんな感じです。まぁこんな構成もあるよ、ってくらいにしか言えませんが。<br />
webとクローラーを分けたことで、開発中のスキーマ変更が柔軟に行えたのは良かったのですが、スキーマ定義を共通で管理していないので、そのあたりうまく管理できると良いなと思ったり。</p>

<p>当初はもう少しwebの機能も多かったのですが、効率化をしているうちにシンプルな形に落ち着きました。Scalaのコードもかなり小規模なものになっています。</p>

<p>イベント管理者の方からのご意見ご要望などいただけると嬉しいです <img src='http://blog.restartr.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>

<ul>
<li><a href="http://eventstats.restartr.com">EventStats &#8211; イベントの統計情報が見れます</a></li>
</ul>
<div class="TweetButton_button" style="float: right; margin-left: 10px;;height:20px;margin-bottom:5px;"><a href="http://twitter.com/share data-url="http://blog.restartr.com/2011/12/28/eventstats-consist-of-heroku-mongolab-and-sakura-vps/" data-text="EventStatsはherokuとMongoLabとさくらVPSで動いている"data-count="vertical" data-via="ReSTARTR" data-lang="ja" data-related="casbah,eventstats,heroku,mongodb,pymongo,python,Scala,unfiltered""><img src="http://blog.restartr.com/wp-content/plugins/tweetbutton-for-wordpress/images/tweet.png" style="border:none" /></a></div>]]></content:encoded>
			<wfw:commentRss>http://blog.restartr.com/2011/12/28/eventstats-consist-of-heroku-mongolab-and-sakura-vps/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>イベントの参加人数の遷移が見れるサービス『EventStats』を作りました。 #atnd #zusaar #partake</title>
		<link>http://blog.restartr.com/2011/12/10/eventstats/</link>
		<comments>http://blog.restartr.com/2011/12/10/eventstats/#comments</comments>
		<pubDate>Sat, 10 Dec 2011 09:58:51 +0000</pubDate>
		<dc:creator>ReSTARTR</dc:creator>
				<category><![CDATA[Webサービス]]></category>

		<guid isPermaLink="false">http://blog.restartr.com/?p=1096</guid>
		<description><![CDATA[イベント管理サービスについて 勉強会などでよく利用されるのが、イベント管理サービス。 ATNDやZusaar,Partakeなど、様々なサービスがあり、現在も新しいものが生まれている状況。 今や勉強会を開催する上で必須の [...]]]></description>
			<content:encoded><![CDATA[<h3>イベント管理サービスについて</h3>

<p>勉強会などでよく利用されるのが、イベント管理サービス。<br />
ATNDやZusaar,Partakeなど、様々なサービスがあり、現在も新しいものが生まれている状況。</p>

<p>今や勉強会を開催する上で必須のサービスとなっていますよね。</p>

<p>ですが、主催者や参加者にとってそれらのサービスで閲覧できるのは『今どのような状況か』ということだけです。それまでどのように参加者が増えてきたのか、その後も参加者が増えそうか、ということまでは見ることができません。</p>

<p>「今」ではなく「過去」を知りたい。(by @ReSTARTR)</p>

<p>ということで作りました。</p>

<h3>イベントごとに登録数、補欠数、枠数を記録するサービス「EventStats｣</h3>

<ul><li><a href="http://eventstats.restartr.com">EventStats &#8211; イベントの統計情報が見れます</a></li></ul>

<p>簡単にいうと<a href="http://klout.com">Klout</a>の勉強会バージョン（のとっかかり）です。
このサービスを使えば、登録数と枠数の推移を時系列のチャートで確認することができます。<br />
5分おきに各イベント管理サービスの情報を取得して蓄積し、情報を表示しているだけのシンプルなサービスです。<br />
<em>(※ SVGベースのチャートのため、androidでは2.4/3.0以降でないと見れません)</em></p>

<p>あと、2011年11月頭くらいからデータ蓄積開始したのでそれ以前のイベントの履歴は見れない場合があるのと、Partakeの枠数が0人なのも蓄積ミスです。</p>

<h3>使い方</h3>

<ol>
<li><a href="javascript:(function(){s=window.location.href.split('/');type='';if(s[2]=='atnd.org'&#038;&#038;s[3]=='events')type='atnd';else if(s[2]=='www.zusaar.com'&#038;&#038;s[3]=='event')type='zusaar';else if(s[2]=='partake.in'&#038;&#038;s[3]=='events')type='partake';else return false; window.location.href=['http://eventstats.restartr.com/events/'+type,s[4]].join('/');})();">ブックマークレット</a>をブラウザに登録する</li>
<li>履歴を知りたいイベント管理サービスの詳細ページに移動する</li>
<li>ブックマークレットを実行する</li>
</ol>

<h3>技術的なこと</h3>

<p>とりあえずHeroku上でScalaのUnfilteredを使って動かしています。<br />
技術的な話しは追々。</p>

<h3>今後どう料理するか</h3>

<p>実はMA7の締切りぎりぎりに公開してました。（証拠↓）</p>

<p><a href="https://ma7.mashupaward.jp/works/478?locale=ja">https://ma7.mashupaward.jp/works/478?locale=ja</a></p>

<p>が、リソースが足りてないさくらのVPSで動かしていたので、公開したことはとくにアナウンスとかしてませんでした。（MA7には当然のごとく選考漏れでしたが。）で、それからHerokuへの移行を進めつつ機能の修正などをやってたという訳です。</p>

<p>今後は蓄積したデータをもとに、勉強会運営や勉強会への参加の助けとなる数値を加えていければいいなと。
実はテストとか負荷試験とかあんまりできてないのであまりイジメないでください^^;</p>

<ul><li><a href="http://eventstats.restartr.com">EventStats &#8211; イベントの統計情報が見れます</a></li></ul>
<div class="TweetButton_button" style="float: right; margin-left: 10px;;height:20px;margin-bottom:5px;"><a href="http://twitter.com/share data-url="http://blog.restartr.com/2011/12/10/eventstats/" data-text="イベントの参加人数の遷移が見れるサービス『EventStats』を作りました。 %23atnd %23zusaar %23partake"data-count="vertical" data-via="ReSTARTR" data-lang="ja""><img src="http://blog.restartr.com/wp-content/plugins/tweetbutton-for-wordpress/images/tweet.png" style="border:none" /></a></div>]]></content:encoded>
			<wfw:commentRss>http://blog.restartr.com/2011/12/10/eventstats/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>（もうすぐ）退職します。</title>
		<link>http://blog.restartr.com/2011/12/02/dropped-out/</link>
		<comments>http://blog.restartr.com/2011/12/02/dropped-out/#comments</comments>
		<pubDate>Fri, 02 Dec 2011 12:27:57 +0000</pubDate>
		<dc:creator>ReSTARTR</dc:creator>
				<category><![CDATA[雑記]]></category>

		<guid isPermaLink="false">http://blog.restartr.com/?p=1109</guid>
		<description><![CDATA[私事ですが現職の会社を退職することになり、本日無事に最終出社を終えてきました。 退職日は年明けですが、これから有給消化期間に入ります。 ということで記念碑的に退職エントリを書いておこうと思います。 有益な退職エントリをご [...]]]></description>
			<content:encoded><![CDATA[<p>私事ですが現職の会社を退職することになり、本日無事に最終出社を終えてきました。
退職日は年明けですが、これから有給消化期間に入ります。</p>

<p>ということで記念碑的に退職エントリを書いておこうと思います。</p>

<p>有益な退職エントリをご希望の方は下記まとめに移動することをオススメします。</p>

<ul>
<li><a href="http://matome.naver.jp/odai/2128832350940033301">「退職しました」ブログエントリのまとめ &#8211; NAVER まとめ</a></li>
<li><a href="http://matome.naver.jp/odai/2132023611765736801">「退職しました。」系エントリーに学びが多い件 &#8211; NAVER まとめ</a></li>
</ul>

<h3>現職のはなし</h3>

<p>現職では、2006年に新卒入社してから約5年半、某ポータルサイトの開発全般を担当してました。</p>

<p>1年に1回部署異動が発生するくらい頻繁に体制変更があったおかげで様々な経験をさせてもらい、「自分がやりたいこと」を見つけるにはとても良い環境だったと思います。</p>

<p>入社してすぐ営業研修で外回りとか経験した後、データ入稿まわりを担当。その後1年間で二度のサイトリニューアルプロジェクトを経験。1年間のサイト運用期間を経て、今担当しているログシステムの開発をやりました。
入社から数年はPHP+RDBMSを中心としたWebアプリ開発に従事してましたが、ここ1年くらいはログシステムをHadoop/Hiveにリプレースする担当をやってました。年を経るごとにインフラに近づいていってる感じです。</p>

<h3>技術的知見が広がるシロモノ</h3>

<p>Hadoopって技術的には上から下まで幅広い知識とか素養が必要なんですよね。
実際のクラスタ構築はインフラチームの担当でしたが、それに至るまでの導入実験とかは自分でもひと通り経験していて、それにを肌で実感していくうちにもっとシステム全般に関わりたいと思うようになりました。現職ではアプリケーションとそれを載せるインフラの担当が明確に分かれていました。そのおかげで我々はアプリケーションの開発に専念できるのですが、一方でインフラにはどうしても疎くなりがちでした。(現在社内ではその垣根を改善する動きが出てきているので今後はもっと良い体制に変わっていくと思います)</p>

<p>そういう意味でHadoopは「技術の交差点」なんだと思います。非常に低いレイヤーからアルゴリズムまでがごっちゃごちゃに混ざったおもちゃ箱のような。それまでPHPのステートレスなシングルスレッド内であれこれするだけしたが、そこでは得られなかったものに興味関心が広がっていきました。Hadoopで実際何を実現するかはさておき、それをひと通り経験することで技術者として一歩前にすすむことができるし、その中でさらに深堀りしたいものを見つけることのできるシロモノだったと思います。</p>

<h3>オープンソースコミュニティ</h3>

<p>ここ1年ほどは社外のカンファレンスや勉強会へも平日休日問わずよく参加してたのですが、上司にもそれついてよく理解して頂き、本当自分の動きたいようにさせてもらえたことは有難い限りです。
外の世界は自分が想像している以上でした。勉強会で発表を聴いたり懇親会で話しをさせていただいたりすることで、自分の足りないところが嫌でも見えてきました。現職に限らず今後どのように成長したいのか、について改めて考えるきっかけにもなりました。
今はちょっとメンタル的な問題もあって勉強会参加は自粛していますが、年明け以降にまた少しづつ参加させていただこうと思ってます。</p>

<h3>さいごに</h3>

<p>年明けまでは旅行とか帰省とかしてゆっくり静養しつつ、技術的な取り組みも継続していこうと思います。暇を見つけて開発しているものもあるのですが、それも近々公開できると思います。あと、次の会社も決まっているのですが今後の話しはまたあらためて別の機会に。</p>

<p>（このブログの読者に現職の方がどれくらいいるのかわかりませんが）とにかく現職で関わった皆様には本当に大変お世話になりました。改めて御礼もうしあげます。</p>

<p>約5年半、どうもありがとうございました。</p>
<div class="TweetButton_button" style="float: right; margin-left: 10px;;height:20px;margin-bottom:5px;"><a href="http://twitter.com/share data-url="http://blog.restartr.com/2011/12/02/dropped-out/" data-text="（もうすぐ）退職します。"data-count="vertical" data-via="ReSTARTR" data-lang="ja""><img src="http://blog.restartr.com/wp-content/plugins/tweetbutton-for-wordpress/images/tweet.png" style="border:none" /></a></div>]]></content:encoded>
			<wfw:commentRss>http://blog.restartr.com/2011/12/02/dropped-out/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>第二回 #Playframework 勉強会 in Tokyo #play_ja に行ってきた</title>
		<link>http://blog.restartr.com/2011/10/10/play-framework-study-in-tokyo/</link>
		<comments>http://blog.restartr.com/2011/10/10/play-framework-study-in-tokyo/#comments</comments>
		<pubDate>Mon, 10 Oct 2011 06:59:13 +0000</pubDate>
		<dc:creator>ReSTARTR</dc:creator>
				<category><![CDATA[Scala]]></category>

		<guid isPermaLink="false">http://blog.restartr.com/?p=1073</guid>
		<description><![CDATA[第二回 #Playframework 勉強会 in Tokyo #play_ja 第一回は大阪開催だったのとそもそも開催を知らなくて参加できませんでしたが、第二回は有難いことに休日に東京で開催されたので行ってきました。運 [...]]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://atnd.org/events/19107">第二回 #Playframework 勉強会 in Tokyo #play_ja</a></li>
</ul>

<p><a href="http://atnd.org/events/17724">第一回</a>は大阪開催だったのとそもそも開催を知らなくて参加できませんでしたが、第二回は有難いことに休日に東京で開催されたので行ってきました。運営の皆様、参加者の皆様、懇親会でお話させて頂いた皆様、どうも有難うございました。</p>

<h3>勉強会のまとめ記事</h3>

<p>下記ブログにありますのでそちらをどうぞ。</p>

<ul>
<li>
<a href="http://d.hatena.ne.jp/ikeike443/20111009/p1">
第二回 Playframework 勉強会 in Tokyo やりました #play_ja &#8211; 複雑系スパゲティソース(はてな版)
</a><br />まとめ記事へのリンクが最後にあります。</li></li>
<li><a href="http://ponta027.blogspot.com/2011/10/playframework.html">Playframework勉強会#2まとめ（スライド）</a><br />発表資料をまとめてあります。</li></li>
</ul>

<p>なのでここでは、全体的な話しではなく関心の強いところに関してのみ書こうと思います。
ただの感想文です。</p>

<h3>Play!の今とこれから</h3>

<p>Play!がどのような分野で使われ、どのように変化していくのかが今の大きな関心事であり、今回の参加理由でした。
今回の発表を聞いていると、Java界隈の救世主（候補）的な位置づけとして期待されているという段階なのでしょう。
主催者の@<a href="https://twitter.com/ikeike443">ikeike443</a>さんの会社のシャノンさんでは実際業務でPlay!を使われていたり、@<a href="https://twitter.com/genki_">genki_</a>さんは今まさに<a href="http://harp.ruru.ne.jp/sol/play/play2.pdf">SI案件で業務アプリケーションにPlay!を導入しようとしている</a>ところだそうで。</p>

<h3>Play!2.x系による変化</h3>

<p>ただ、Play!が今後2.x系でScalaベースでの開発に切り替わるので、それによって今の勢いがどう変わっていくのでしょうか。JavaベースのPlay!1.xにScalaユーザーを引き込むのと、ScalaベースのPlay!2.xにJavaユーザーを引きこむのでは、大きく状況が変わってくると思います。自分はScalaユーザーなのでこの動きは非常に嬉しいですが、もしかしたら勢いが減速してしまうのではとちょっと不安になったり。
（プラグインのサポートがどちらか一方の言語に限定されていて、結局導入を見送るなんてこともあると思います。）</p>

<h3>Play!の外部環境</h3>

<p>とはいえ、外部環境としてはPlay!のサポートPassSがちょくちょく出てきているので当分は勢いが衰えることはないと思います。単体でサーバーとして動作させることが可能なだけでなく、war化も可能なのでTomcatやJettyに載っけることができる環境なら動かせてしまいます。とくに@<a href="http://twitter.com/hagikuratakeshi">hagikuratakeshi</a>さんや@<a href="https://twitter.com/mitsuhiro">mitsuhiro</a>さんが取り上げていたようにHerokuのPlay!サポートによって趣味プログラミングとして手を出しやすくなってますし。</p>

<h3>ScalaのフレームワークとしてのPlay!</h3>

<p>Scala界隈ではUnfilteredやBlueEyesのような積極的にScalaの機能を利用したFWが注目されています。（少なくとも私のTwitterのTL上では…)ただし、日本語ベースのScalaのフレームワークのリファレンスや関連記事はまだまだ少ないのが現状です。
Play!の場合は翻訳も積極的に行われていますし、勉強会に100人近く参加するような日本のPlay!コミュニティの存在は正直無視できないと思います。今後のPlay!界隈の動向に注目です。</p>
<div class="TweetButton_button" style="float: right; margin-left: 10px;;height:20px;margin-bottom:5px;"><a href="http://twitter.com/share data-url="http://blog.restartr.com/2011/10/10/play-framework-study-in-tokyo/" data-text="第二回 %23Playframework 勉強会 in Tokyo %23play_ja に行ってきた"data-count="vertical" data-via="ReSTARTR" data-lang="ja""><img src="http://blog.restartr.com/wp-content/plugins/tweetbutton-for-wordpress/images/tweet.png" style="border:none" /></a></div>]]></content:encoded>
			<wfw:commentRss>http://blog.restartr.com/2011/10/10/play-framework-study-in-tokyo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Scalaで設定ファイルを使いたい時どうしたらいいの？</title>
		<link>http://blog.restartr.com/2011/08/30/config-libraries-in-scala/</link>
		<comments>http://blog.restartr.com/2011/08/30/config-libraries-in-scala/#comments</comments>
		<pubDate>Mon, 29 Aug 2011 15:02:15 +0000</pubDate>
		<dc:creator>ReSTARTR</dc:creator>
				<category><![CDATA[Scala]]></category>
		<category><![CDATA[config]]></category>
		<category><![CDATA[library]]></category>

		<guid isPermaLink="false">http://blog.restartr.com/?p=1049</guid>
		<description><![CDATA[2011.08.31 kmizushimaさんから頂いたコメントを元に、下記の記述を修正＆追記しました。 Twitterのutil-evalの一時ファイル生成について AkkaのConfigファイルのパース手法について  [...]]]></description>
			<content:encoded><![CDATA[<p><em style="color:red">2011.08.31 kmizushimaさんから頂いた<a href="http://blog.restartr.com/2011/08/30/config-libraries-in-scala/?preview=true&#038;preview_id=1049&#038;preview_nonce=ad0bbeeef6#comment-108">コメント</a>を元に、下記の記述を修正＆追記しました。<br /></p>

<ul>
<li>Twitterのutil-evalの一時ファイル生成について</li>
<li>AkkaのConfigファイルのパース手法について</li>
</ul>

<p></em></p>

<p>TwitterのOAuthの鍵やDB接続情報など、アプリを書く上で環境によって切り替える設定が大抵の場合あると思います。普段使っているPHPの場合、設定を外部ファイルに書きだす場合、ini,yaml,xml,phpのいずれかを使うことが多いのですが、Scalaの場合、設定ファイルってどうするのか気になりました。</p>

<p>ということで、適当に思いついたライブラリやフレームワークがどのように対応しているのか調査。</p>

<h2>ライブラリ</h2>

<h3>propertiesファイル</h3>

<ul>
<li>javaの古くから使われている</li>
<li>キーと値のみ設定可能</li>
<li>依存関係がないので手軽。</li>
<li>すべてが文字列</li>
<li>例えばこんな感じ</li>
</ul>

<p>path/to/conf.properties</p>

<div class="codecolorer-container text default" style="border:1px solid #9F9F9F;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">hoge = &quot;moge&quot;</div></td></tr></tbody></table></div>

<div class="codecolorer-container scala default" style="border:1px solid #9F9F9F;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br /></div></td><td><div class="scala codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0000ff; font-weight: bold;">val</span> p <span style="color: #000080;">=</span> <span style="color: #0000ff; font-weight: bold;">new</span> java.<span style="color: #000000;">util</span>.<span style="color: #000000;">Properties</span><span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#41;</span><br />
<span style="color: #0000ff; font-weight: bold;">val</span> config <span style="color: #000080;">=</span> p.<span style="color: #000000;">load</span><span style="color: #F78811;">&#40;</span><span style="color: #0000ff; font-weight: bold;">new</span> java.<span style="color: #000000;">io</span>.<span style="color: #000000;">FileInputStream</span><span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;path/to/conf.properties&quot;</span><span style="color: #F78811;">&#41;</span><span style="color: #000080;">;</span><br />
config.<span style="color: #000000;">get</span><span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;hoge&quot;</span><span style="color: #F78811;">&#41;</span> <span style="color: #008000; font-style: italic;">// &quot;moge&quot;</span></div></td></tr></tbody></table></div>

<h3>twitterのconfiggy</h3>

<ul>
<li><a href="https://github.com/robey/configgy">https://github.com/robey/configgy</a></li>
<li>独自フォーマット</li>
<li>オワコン</li>
</ul>

<h3>twitterのutil-eval</h3>

<ul>
<li><a href="http://twitter.github.com/util/">http://twitter.github.com/util/</a></li>
<li>Evalした値をそのまま利用</li>
<li>Scalaのコンパイラに任せられる。つまりScalaコードがそのまま設定ファイルに。</li>
<li>型安全</li>
<li>詳しいことはこちらを参照

<ul>
<li><a href="http://d.hatena.ne.jp/xuwei/20110805/1312551980">twitter が Scala 大好きすぎて (?) 設定ファイルまで Scala のソースコードな件 &#8211; scalaとか・・・</a></li>
<li><a href="http://blog.youhei.jp/scala-util-eval">Scala アプリケーションのコンフィグレーションに Twitter 製の util-eval を使ってみた &#8211; blog.youhei.jp</a></li>
</ul></li>
<li>下記処理にて設定クラスインスタンスをapply経由で取り出せる

<ul>
<li><a href="https://github.com/twitter/util/blob/master/util-eval/src/main/scala/com/twitter/util/Eval.scala#L247">com.twitter.util.Eval#L247</a></li>
</ul></li>
<li><p><del>一時的にjarファイルを生成するので環境に制約あるとダメ（たぶん）</del></p>

<ul>
<li>一時ファイルを生成するのは、ローカルにcloneした古いままのバージョン（1.2.5）で動作確認していたためでした。</li>
<li>古いコード: <a href="https://github.com/twitter/util/blob/7c81842286f30aee4b2176bceb8c79ded710c88e/src/main/scala/com/twitter/util/Evaluator.scala">com.twitter.util.Evaluator</a>のコメントに<a href="https://github.com/twitter/util/blob/7c81842286f30aee4b2176bceb8c79ded710c88e/src/main/scala/com/twitter/util/Evaluator.scala#L57">All generated .scala and .class files are stored, by default, in System.getProperty(&#8220;java.io.tmpdir&#8221;)</a>と書いてあったので、「一時ファイルが生成される」と認識し、実際の動作確認でもその一時ファイルが確認できていました。</li>
<li>しかし、新しいコード: <a href="https://github.com/twitter/util/blob/master/util-eval/src/main/scala/com/twitter/util/Eval.scala">com.twitter.util.Eval</a>のコメントには<a href="https://github.com/twitter/util/blob/master/util-eval/src/main/scala/com/twitter/util/Eval.scala#L50">If target is None, the results are compiled to memory (and are therefore ephemeral)</a>とある通り、パス指定がない場合はメモリ上の仮想ディレクトリに対して操作を行う模様です。</li>
</ul></li>
<li><p>使い方</p></li>
</ul>

<p>設定のtraitを定義</p>

<p>src/main/scala/com/restartr/utilSample/MyConfig.scala</p>

<div class="codecolorer-container scala default" style="border:1px solid #9F9F9F;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br /></div></td><td><div class="scala codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0000ff; font-weight: bold;">package</span> com.<span style="color: #000000;">restartr</span>.<span style="color: #000000;">utilSample</span><br />
<span style="color: #0000ff; font-weight: bold;">trait</span> MyConfig <span style="color: #F78811;">&#123;</span><br />
&nbsp; <span style="color: #0000ff; font-weight: bold;">val</span> num<span style="color: #000080;">:</span> Int<br />
&nbsp; <span style="color: #0000ff; font-weight: bold;">val</span> str<span style="color: #000080;">:</span> String<br />
<span style="color: #F78811;">&#125;</span></div></td></tr></tbody></table></div>

<p>実際の設定ファイルでは、設定のTraitを継承してインスタンス生成<br />
※クラスインスタンスでなくても文字列やリストでもOK。</p>

<p>path/to/config/MyConfig.scala</p>

<div class="codecolorer-container scala default" style="border:1px solid #9F9F9F;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br /></div></td><td><div class="scala codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0000ff; font-weight: bold;">import</span> com.<span style="color: #000000;">restartr</span>.<span style="color: #000000;">utilSample</span>.<span style="color: #000000;">MyConfig</span><br />
<span style="color: #0000ff; font-weight: bold;">new</span> MyConfig <span style="color: #F78811;">&#123;</span><br />
&nbsp; <span style="color: #0000ff; font-weight: bold;">val</span> num <span style="color: #000080;">=</span> <span style="color: #F78811;">1</span><br />
&nbsp; <span style="color: #0000ff; font-weight: bold;">val</span> str <span style="color: #000080;">=</span> <span style="color: #6666FF;">&quot;san&quot;</span><br />
<span style="color: #F78811;">&#125;</span></div></td></tr></tbody></table></div>

<p>使いたい場所でEval。</p>

<div class="codecolorer-container scala default" style="border:1px solid #9F9F9F;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br /></div></td><td><div class="scala codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0000ff; font-weight: bold;">val</span> conf <span style="color: #000080;">=</span> Eval<span style="color: #F78811;">&#91;</span>MyConfig<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#40;</span><span style="color: #0000ff; font-weight: bold;">new</span> java.<span style="color: #000000;">io</span>.<span style="color: #000000;">File</span><span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;path/to/config/MyConfig.scala&quot;</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span><br />
conf.<span style="color: #000000;">num</span> <span style="color: #008000; font-style: italic;">// 1</span><br />
conf.<span style="color: #000000;">str</span> <span style="color: #008000; font-style: italic;">// &quot;san&quot;</span></div></td></tr></tbody></table></div>

<h3>configrity</h3>

<ul>
<li><a href="https://github.com/paradigmatic/Configrity">https://github.com/paradigmatic/Configrity</a></li>
<li>akkaのフォーマットと同等

<ul>
<li><a href="https://github.com/paradigmatic/Configrity/wiki/Formats">設定のフォーマット</a></li>
<li>Scala 2.9以上対象。</li>
<li>configファイルの<strong>読み書き</strong>ができる

<ul>
<li>immutable, thread safe, allow functional design pattern</li>
</ul></li>
</ul></li>
</ul>

<h2>各種フレームワーク</h2>

<p>以下のフレームワークはすべて独自実装でした。Propertiesじゃ役不足だし、かといってデファクトな設定用ライブラリがないからなのでしょうか。</p>

<h3>akkaのconfig</h3>

<ul>
<li>akka.confとかがそれ。</li>
<li>独自パーサーを使用

<ul>
<li>70行程度のシンプルなパーサー</li>
<li><a href="https://github.com/jboner/akka/blob/master/akka-actor/src/main/scala/akka/config/ConfigParser.scala">akka.config.ConfigParser</a></li>
<li><del>正規表現で定義されてる</del>Scalaのパーザコンビネータ(RegexParsersを継承)で定義されている

<ul>
<li>&#8220;{&#8220;と&#8221;}&#8221;で階層構造を表現</li>
</ul></li>
</ul></li>
</ul>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">akka {<br />
&nbsp; cluster{<br />
&nbsp; &nbsp; name = &quot;test-cluster&quot;<br />
&nbsp; }<br />
}</div></td></tr></tbody></table></div>

<ul>
<li>使える型

<ul>
<li>数値</li>
<li>文字列</li>
<li>真偽値（on/off , true/false)</li>
<li>リスト [1,2,3] / ["hoge","moge"]</li>
</ul></li>
</ul>

<h3>play!frameworkのconfig</h3>

<ul>
<li>独自パーサー

<ul>
<li><a href="https://github.com/playframework/play/blob/master/framework/src/play/utils/OrderSafeProperties.java">play.utils.OrderSafeProperties</a></li>
</ul></li>
<li>java.util.propertiesを継承したもの。</li>
<li>環境ごとにIDを割り当てられる

<ul>
<li>http://playdocja.appspot.com/documentation/1.2.1/production</li>
<li>http://playdocja.appspot.com/documentation/1.2.1/guide11</li>
<li>IDごとに%{ID}を頭につければ切り替えてくれるみたい</li>
</ul></li>
</ul>

<h3>Lift</h3>

<ul>
<li>LiftRulesが設定をもつ

<ul>
<li><a href="http://simply.liftweb.net/index-3.1.html#toc-Subsection-3.1.2">http://simply.liftweb.net/index-3.1.html#toc-Subsection-3.1.2</a></li>
<li>実装はここ
*<a href="https://github.com/lift/framework/blob/master/web/webkit/src/main/scala/net/liftweb/http/LiftRules.scala">net.liftweb.http.LiftRules</a></li>
<li>たぶんこのへん

<ul>
<li><a href="https://github.com/lift/framework/blob/master/core/util/src/main/scala/net/liftweb/util/Props.scala">net.liftweb.util.Props</a></li>
</ul></li>
</ul></li>
</ul>

<p>ざっと調べて使ってみたところ、手軽にやるならProperties、フレームワークを使うならそれに則り、厳密にやるならTwitterのEvalや、設定ファイルを読み書きできる独特なConfigrityなんかがよさそうです。</p>

<p>XMLは…まぁないでしょうね。</p>
<div class="TweetButton_button" style="float: right; margin-left: 10px;;height:20px;margin-bottom:5px;"><a href="http://twitter.com/share data-url="http://blog.restartr.com/2011/08/30/config-libraries-in-scala/" data-text="Scalaで設定ファイルを使いたい時どうしたらいいの？"data-count="vertical" data-via="ReSTARTR" data-lang="ja" data-related="config,library,Scala""><img src="http://blog.restartr.com/wp-content/plugins/tweetbutton-for-wordpress/images/tweet.png" style="border:none" /></a></div>]]></content:encoded>
			<wfw:commentRss>http://blog.restartr.com/2011/08/30/config-libraries-in-scala/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>ScalaのORMapperのSquerylを試してみてハマった３つのこと</title>
		<link>http://blog.restartr.com/2011/08/16/3-things-that-i-was-in-trouble-using-squeryl/</link>
		<comments>http://blog.restartr.com/2011/08/16/3-things-that-i-was-in-trouble-using-squeryl/#comments</comments>
		<pubDate>Mon, 15 Aug 2011 23:00:15 +0000</pubDate>
		<dc:creator>ReSTARTR</dc:creator>
				<category><![CDATA[Scala]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[ORM]]></category>
		<category><![CDATA[squeryl]]></category>

		<guid isPermaLink="false">http://blog.restartr.com/?p=1024</guid>
		<description><![CDATA[ScalaのORMとしてSquerylってのがあります。 Squeryl &#8211; A Scala ORM for SQL Databases 使い方は上記リンク先を見ればだいたいわかります。 あと、@jugyoさ [...]]]></description>
			<content:encoded><![CDATA[<p>ScalaのORMとしてSquerylってのがあります。</p>

<ul>
<li><a href="http://squeryl.org/index.html">Squeryl &#8211; A Scala ORM for SQL Databases</a></li>
</ul>

<p>使い方は上記リンク先を見ればだいたいわかります。
あと、<a href="http://twitter.com/jugyo">@jugyo</a>さんのブログに導入あたりはまとまっていますし、つまづいたらGoogleGroupで検索すれば何か見つかるかもしれません。</p>

<ul>
<li><a href="http://blog.twiwt.org/e/f34763"> Twiwt:Blog / jugyo : squeryl を試す </a></li>
<li><a href="http://blog.twiwt.org/e/7e40ce">Twiwt:Blog / jugyo : Squeryl の使い方 &#8211; セットアップ, モデルの定義, テーブル作成</a></li>
<li><a href="https://groups.google.com/group/squeryl/about"> Squeryl | Google Groups </a></li>
</ul>

<p>さて、今回はTwitterっぽいものを想定して機能を試してみたのですが、３つほどハマったところを記しておきます。
環境はScala2.9.0.1、Sbt0.7.7、MySQL5.5、Squeryl0.9.4です。<br />
ソースはgistに登録。それを本文末尾にも掲載しておきました。</p>

<h3>１．プライマリーキーの指定での嵌りどころ</h3>

<p>1つのカラムがPKとなるテーブルスキーマの場合、org.squeryl.KeyedEntity[T]を継承して使います。</p>

<div class="codecolorer-container scala default" style="border:1px solid #9F9F9F;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="scala codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0000ff; font-weight: bold;">class</span> Users<span style="color: #F78811;">&#40;</span>id<span style="color: #000080;">:</span> Long, text<span style="color: #000080;">:</span> String<span style="color: #F78811;">&#41;</span> <span style="color: #0000ff; font-weight: bold;">extends</span> KeyedEntity<span style="color: #F78811;">&#91;</span>Long<span style="color: #F78811;">&#93;</span></div></td></tr></tbody></table></div>

<p>KeyedEntityにはidというフィールドが用意されていて、継承時に型を指定することで、PKの型に適用させることができます。今回の場合であればLong型のPK「id」ということになります。<br />
ただし、この場合、PKはautoincrementedになってしまいます。</p>

<p>コード的には下記のようにKeyedEntity[T]を使わずSchema継承時に定義するのと同等になるわけです。</p>

<div class="codecolorer-container scala default" style="border:1px solid #9F9F9F;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td><div class="scala codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0000ff; font-weight: bold;">class</span> Users<span style="color: #F78811;">&#40;</span>id<span style="color: #000080;">:</span> Long, text<span style="color: #000080;">:</span> String<span style="color: #F78811;">&#41;</span><br />
<br />
<span style="color: #0000ff; font-weight: bold;">class</span> Db <span style="color: #0000ff; font-weight: bold;">extends</span> Schema <span style="color: #F78811;">&#123;</span><br />
&nbsp; <span style="color: #0000ff; font-weight: bold;">val</span> users <span style="color: #000080;">=</span> table<span style="color: #F78811;">&#91;</span>User<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;users&quot;</span><span style="color: #F78811;">&#41;</span><br />
&nbsp; on<span style="color: #F78811;">&#40;</span>users<span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#40;</span>u <span style="color: #000080;">=&gt;</span> declare<span style="color: #F78811;">&#40;</span><br />
&nbsp; &nbsp; u.<span style="color: #000000;">id</span> is <span style="color: #F78811;">&#40;</span>primaryKey, autoincremented<span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span><br />
<span style="color: #F78811;">&#125;</span></div></td></tr></tbody></table></div>

<p>これは結構困ります。そんな場合はSchemaを継承するときに定義を上書きすればOK。</p>

<div class="codecolorer-container scala default" style="border:1px solid #9F9F9F;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td><div class="scala codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0000ff; font-weight: bold;">class</span> Users<span style="color: #F78811;">&#40;</span>id<span style="color: #000080;">:</span> Long, text<span style="color: #000080;">:</span> String<span style="color: #F78811;">&#41;</span> <span style="color: #0000ff; font-weight: bold;">extends</span> KeyedEntity<span style="color: #F78811;">&#91;</span>Long<span style="color: #F78811;">&#93;</span><br />
<br />
<span style="color: #0000ff; font-weight: bold;">class</span> Db <span style="color: #0000ff; font-weight: bold;">extends</span> Schema <span style="color: #F78811;">&#123;</span><br />
&nbsp; <span style="color: #0000ff; font-weight: bold;">val</span> users <span style="color: #000080;">=</span> table<span style="color: #F78811;">&#91;</span>User<span style="color: #F78811;">&#93;</span><span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;users&quot;</span><span style="color: #F78811;">&#41;</span><br />
&nbsp; on<span style="color: #F78811;">&#40;</span>users<span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#40;</span>u <span style="color: #000080;">=&gt;</span> declare<span style="color: #F78811;">&#40;</span><br />
&nbsp; &nbsp; u.<span style="color: #000000;">id</span> is <span style="color: #F78811;">&#40;</span>primaryKey<span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span><br />
<span style="color: #F78811;">&#125;</span></div></td></tr></tbody></table></div>

<p>これはSquerylのGoogleGroupに書いてました。</p>

<ul>
<li><a href="https://groups.google.com/forum/#!topic/squeryl/BTrKBwikMqs">how to cancel &#8220;autoincremented&#8221; from KeyedEntity[T]</a></li>
</ul>

<h3>２．DDLのカラムの順番の嵌りどころ</h3>

<p>Db.printDdlを実行した時にカラムの順番が予測できません。<br />
PKが最初にくるのかと思えばそうでもないみたい。ここは細かく追ってないですが、これもGoogleGroupに答えがありました。</p>

<ul><li><a href="https://groups.google.com/forum/#!topic/squeryl/ZwiDf5Q-IUI">CREATE TABLE columns in order of constructor arguments</a></li></ul>

<p>答えとしては、org.squeryl.internals.DatabaseAdapter:: writeCreateTableあたりをorverrideしてなんとかしてくれとのこと。
<a href="https://github.com/max-l/Squeryl/blob/master/src/main/scala/org/squeryl/internals/DatabaseAdapter.scala#L255">https://github.com/max-l/Squeryl/blob/master/src/main/scala/org/squeryl/internals/DatabaseAdapter.scala#L255</a></p>

<p>なんか良い方法はないの…
とりあえず、printDdlした結果をコピーして、順番だけ書き換えて、手動で直接DBにクエリ発行すればなんとかなるでしょう。</p>

<h3>３．外部キーの利用でのはまりどころ</h3>

<p>２つのテーブルにRelationを設定してからDb.createした際、外部キーが設定されない問題がありました。
MySQLは5.5を使っているので外部キーに対応していない訳でもないです。
問題はAdapterの選定にありました。
org.squeryl.adapter.MySQLAdapter
をつかっていたのですが、
org.squeryl.adapter.MySQLInnoDBAdapter
を使えばOKでした。</p>

<p>根本の原因は、org.squeryl.adapter.MySQLAdapterに</p>

<div class="codecolorer-container scala default" style="border:1px solid #9F9F9F;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="scala codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0000ff; font-weight: bold;">override</span> <span style="color: #0000ff; font-weight: bold;">def</span> supportsForeignKeyConstraints <span style="color: #000080;">=</span> <span style="color: #0000ff; font-weight: bold;">false</span></div></td></tr></tbody></table></div>

<p>と定義してあり、一方のorg.squeryl.adapter.MySQLInnoDBAdapterには</p>

<div class="codecolorer-container scala default" style="border:1px solid #9F9F9F;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="scala codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0000ff; font-weight: bold;">override</span> <span style="color: #0000ff; font-weight: bold;">def</span> supportsForeignKeyConstraints <span style="color: #000080;">=</span> <span style="color: #0000ff; font-weight: bold;">true</span></div></td></tr></tbody></table></div>

<p>と定義してあります。<br />
この値がtrueになっていないとForeignKeyの制約がDDLに含まれなくなってしまうので注意です。
<a href="https://github.com/max-l/Squeryl/blob/master/src/main/scala/org/squeryl/adapters/MySQLAdapter.scala#L75">Docコメントにも書いてある</a>ので注意です。</p>

<p>以上、Squerylを弄ってみて嵌ったことをまとめてみました。</p>

<h3>Squerylの使用感</h3>

<p>ちょっと前にTwitterのStreamAPIのデータをMySQLに格納するためにSquerylを使ったのと今回少し弄ってみただけなのでまだまだ知らないことだらけです。他にも機能的はたくさん用意されていると思いますし、APIも割となじみやすいので複雑すぎないテーブル定義の場合には積極的にSquerylを使っていこうと思います。</p>

<p><em>※ドキュメントや本体のソースを追いかけたりしながら使い方を学ぶのは非常に楽しいです:)</em></p>

<p>で、ソースは以下です。</p>

<script src="https://gist.github.com/1146854.js"> </script>
<div class="TweetButton_button" style="float: right; margin-left: 10px;;height:20px;margin-bottom:5px;"><a href="http://twitter.com/share data-url="http://blog.restartr.com/2011/08/16/3-things-that-i-was-in-trouble-using-squeryl/" data-text="ScalaのORMapperのSquerylを試してみてハマった３つのこと"data-count="vertical" data-via="ReSTARTR" data-lang="ja" data-related="mysql,ORM,Scala,squeryl""><img src="http://blog.restartr.com/wp-content/plugins/tweetbutton-for-wordpress/images/tweet.png" style="border:none" /></a></div>]]></content:encoded>
			<wfw:commentRss>http://blog.restartr.com/2011/08/16/3-things-that-i-was-in-trouble-using-squeryl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Varnish勉強会 #tokyovcl に行ってきた</title>
		<link>http://blog.restartr.com/2011/06/21/go-to-varnish-study-tokyovc/</link>
		<comments>http://blog.restartr.com/2011/06/21/go-to-varnish-study-tokyovc/#comments</comments>
		<pubDate>Tue, 21 Jun 2011 14:56:40 +0000</pubDate>
		<dc:creator>ReSTARTR</dc:creator>
				<category><![CDATA[雑記]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[study]]></category>
		<category><![CDATA[varnish]]></category>

		<guid isPermaLink="false">http://blog.restartr.com/?p=996</guid>
		<description><![CDATA[6/18(土)に開催されたVarnish勉強会 Tokyo.vcl : ATNDに行ってきました。 初のクックパッドさんオフィス訪問です。 Varnish3のリリースパーティーも兼ねての開催だったようで、ステッカーもいた [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.flickr.com/photos/53244662@N04/5856931526/" title="IMAG0053 by ReSTARTR_y, on Flickr"><img src="http://farm6.static.flickr.com/5029/5856931526_1119c53a87.jpg" width="500" height="299" alt="IMAG0053"></a></p>

<p>6/18(土)に開催された<a href="http://atnd.org/events/16681">Varnish勉強会 Tokyo.vcl : ATND</a>に行ってきました。
初のクックパッドさんオフィス訪問です。</p>

<p>Varnish3のリリースパーティーも兼ねての開催だったようで、ステッカーもいただいてしまいました。<br />
インフラ屋じゃない上に、Varnish触ったのは前日の晩という超初心者だったので結構不安でしたが、<br />
ビアバッシュを含め色々な話しが聞けた実りある良い勉強会でした。</p>

<p>主催の@hmskさんをはじめ登壇者の皆様、ならびにビアバッシュで交流してくださった皆様ありがとうございました。</p>

<h3>雑感</h3>

<ul>
<li>Varnishは画像配信の事例が多い</li>
<li>HTTPサーバーの前だけじゃなくてSolrのような内部ネットワーク間の通信にも適用できる。</li>
<li>Varnish落ちたときにApacheの負荷を避けるためにSquidが使える。</li>
<li>拡張次第でHTTPサーバーにもKVSにも化ける（やりすぎ注意？）。</li>
<li>クラウドでの運用はフロンティア。</li>
<li>設定ファイルのvclはもはやプログラム</li>
<li>ESIの事例なかったけど使いにくいのかな？</li>
<li>とりあえず実戦投入して様子見ないとわからないことが多そう。</li>
<li>あ、どれだけ高速化したかについての言及がなかったような…</li>
</ul>

<h2>各発表メモ</h2>

<p>スライドと、その丸写しみたいな感じのメモをペタペタ。</p>

<h3>VarnishCache3.0新機能とVUPの仕方(@xcir)</h3>

<div style="width:425px" id="__ss_8344516"> <strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/xcir/tokyovclvarnishcache30vup" title="tokyo.vcl発表資料（VarnishCache3.0新機能とVUPの仕方）">tokyo.vcl発表資料（VarnishCache3.0新機能とVUPの仕方）</a></strong> <iframe src="http://www.slideshare.net/slideshow/embed_code/8344516" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe> <div style="padding:5px 0 12px"> View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/xcir">xcir</a> </div> </div>

<ul>
<li>ESIでのgzip

<ul>
<li>ブロックが圧縮されているとESIできなかった(~2）</li>
<li>defaultパラメータが改善された</li>
</ul></li>
<li>stream support

<ul>
<li>別のストリームは待機させられる（？</li>
</ul></li>
</ul>

<h3>イカ娘も終わったしVarnishでも使うか(@phji)</h3>

<div style="width:425px" id="__ss_8366215"> <strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/phji/varnishika" title="イカ娘も終わったしVarnishでも使うか">イカ娘も終わったしVarnishでも使うか</a></strong> <iframe src="http://www.slideshare.net/slideshow/embed_code/8366215" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe> <div style="padding:5px 0 12px"> View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/phji">Kazutoshi Fujimoto</a> </div> </div>

<ul>
<li>[RAM8G Xeon 4core SSD256GB ] x 20servers</li>
<li>pixiv

<ul>
<li>nginx -> (consistent hash) -> quid -> nginx -> apache</li>
<li>lookupとかかないとキャッシュされないｗ</li>
</ul></li>
</ul>

<h3>twitter検索(yats)でvarnish使ってみた(@PENGUINANA_)</h3>

<ul>
<li>API 7000M req/month</li>
<li>PV 150Mreq/month</li>
<li>varnish(vps) -> nginx[ webAPI -> varnish -> Solr ]</li>
<li>service : cache + failover</li>
<li>Solr: slaveのキャッシュクリアーが重いので、その前面にVarnishをおいている(ラウンドロビンとFailover）</li>
<li>autocomplete

<ul>
<li>キャッシュと相性よさそう</li>
</ul></li>
</ul>

<h3>EC2とvarnishで画像配信(@mirakui)</h3>

<div style="width:425px" id="__ss_8352369"> <strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/mirakui/ec2varnish" title="EC2とVarnishで画像配信">EC2とVarnishで画像配信</a></strong> <iframe src="http://www.slideshare.net/slideshow/embed_code/8352369" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe> <div style="padding:5px 0 12px"> View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/mirakui">Issei Naruta</a> </div> </div>

<ul>
<li>失敗談</li>
<li>TOFU

<ul>
<li>アップロード時ではなくオンデマンドでリサイズ</li>
<li>akamai（CDN)に7000RPSのうち、ELBには700RPSくる。60%受けるリクエストをキャッシュできればApache負荷軽減できるのでは？

<ul>
<li>という導入経緯（からの失敗</li>
</ul></li>
<li>1st challenge

<ul>
<li>EC2(M2.XLARGE[17.1GB RAM] + EBS[100GB for swap])</li>
<li>300rps</li>
<li>結果：オンメモリだけなら順調だけど、あふれてきてOSにSWAPさせたとたんLOADAVERAGEが爆発して死亡。</li>
</ul></li>
<li>2nd challenge

<ul>
<li>EC2(M2.XLARGE[17.1GB RAM] + EBS[100GB for ext3])</li>
<li>&#8220;file storage&#8221;を使っても結局メモリ容量が大量に必要</li>
</ul></li>
<li>ec2のxlargeインスタンスには、IO性能「標準」と「高」がある

<ul>
<li>今回は「標準」を利用して失敗</li>
<li>「高」ならうまくいくかも</li>
</ul></li>
</ul></li>
<li>varnish3

<ul>
<li>hash director

<ul>
<li>consistent hashingができるかも？</li>
<li>nginxいらずに複数varnish運用ができるかも？</li>
</ul></li>
</ul></li>
</ul>

<h3>Puppetでvarnishもsquidも面倒みる(@ar1)</h3>

<ul>
<li>ふつうはvarnishは落ちるのでLBつかって並列で運用</li>
<li>varnishおちるとWebサーバーが負荷かかってしまう

<ul>
<li>LB -> varnish -> squid -> apache</li>
<li>squidどうしでキャッシュを共有できるので、１つSquidおちてもWebサーバーにききにいかずにすむ。</li>
</ul></li>
<li>puppet

<ul>
<li>設定をらくにする</li>
<li>cacheのExpire</li>
<li>サーバーのぬきさし</li>
</ul></li>
</ul>

<h3>楽天でvarnish(@spchidren)</h3>

<ul>
<li>L7 balancingがやりたくてVarnish導入

<ul>
<li>URLによってWebサーバーのグループを切り替えたい</li>
</ul></li>
<li>akamai -> LB -> varnish(RAM24G[malloc18G/hitrate 75%] -> apache(+mod_thumb)</li>
<li>LBからVarnishを切り離すのはどうやる？</li>
<li>CDNやVarnishのcache clearをどうやるか

<ul>
<li>画像登録されたときにMQに登録して、必要に応じて消す</li>
<li>CDNは常にExpireされない状態にしておける。</li>
</ul></li>
<li>ImageMagicおもい

<ul>
<li>varnishにサムネイルをつくるしくみを組み込んでみれば？（FreeImage)</li>
<li>cc_commandでインクルードさせて、C言語でサムネイルつくるしくみをくみこむ</li>
</ul></li>
<li>varnishのいくさき

<ul>
<li>nginxにも近いしredisにもちかづいてきてる</li>
<li>どこにいくんでしょ</li>
</ul></li>
</ul>

<h3>TDDでVCL書いてデプロイ(@hmsk)</h3>

<ul>
<li>varnishtest

<ul>
<li>RSpecぽい書き方できる</li>
<li>xxx.vcltestファイルにケースを記述</li>
</ul></li>
<li>vmod

<ul>
<li>vclの設定をC言語っぽく描ける</li>
<li>パージや圧縮、エラーなどに使える</li>
<li>モバイル端末のリストのチェックにもVCLから外出しできる</li>
</ul></li>
</ul>

<h2>関連リンク</h2>

<ul>
<li>ATND

<ul>
<li><a href="http://atnd.org/events/16681">Varnish勉強会 Tokyo.vcl : ATND</a></li>
</ul></li>
<li>Ustream

<ul>
<li><a href="http://www.ustream.tv/recorded/15453305">http://www.ustream.tv/recorded/15453305</a></li>
<li><a href="http://www.ustream.tv/recorded/15453834">http://www.ustream.tv/recorded/15453834</a></li>
</ul></li>
<li>Togetter

<ul>
<li><a href="http://togetter.com/li/151585">Togetter &#8211; 「第一回 Varnish勉強会 Tokyo.vcl」</a></li>
</ul></li>
<li>勉強会レポート

<ul>
<li><a href="http://d.hatena.ne.jp/hxmasaki/20110620/1308547067">Varnish勉強会 Tokyo.vclを行いました &#8211; ククラフト</a></li>
<li><a href="http://d.hatena.ne.jp/mirakui/20110619/1308497959">私がクックパッドの画像配信野郎です &#8211; 床のトルストイ、ゲイとするとのこと</a></li>
<li><a href="http://blog.xcir.net/?p=438">Tokyo.vclでVarnishCache3の新機能とVUPの仕方を話してきました &laquo; cat /dev/random &gt; /dev/null &amp;</a></li>
<li><a href="http://blog.udzura.jp/2011/06/20/summary-of-tokyo-varnish-study-on-20110618/">東京varnish勉強会(Tokyo.vcl)まとめ &laquo;  blog.udzura.jp</a></li>
</ul></li>
</ul>
<div class="TweetButton_button" style="float: right; margin-left: 10px;;height:20px;margin-bottom:5px;"><a href="http://twitter.com/share data-url="http://blog.restartr.com/2011/06/21/go-to-varnish-study-tokyovc/" data-text="Varnish勉強会 %23tokyovcl に行ってきた"data-count="vertical" data-via="ReSTARTR" data-lang="ja" data-related="cache,study,varnish""><img src="http://blog.restartr.com/wp-content/plugins/tweetbutton-for-wordpress/images/tweet.png" style="border:none" /></a></div>]]></content:encoded>
			<wfw:commentRss>http://blog.restartr.com/2011/06/21/go-to-varnish-study-tokyovc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>東京から福島へ一泊二日でボランティアに行ってきた</title>
		<link>http://blog.restartr.com/2011/06/19/volunteer-at-shinchi-fukushima-pref/</link>
		<comments>http://blog.restartr.com/2011/06/19/volunteer-at-shinchi-fukushima-pref/#comments</comments>
		<pubDate>Sun, 19 Jun 2011 03:03:20 +0000</pubDate>
		<dc:creator>ReSTARTR</dc:creator>
				<category><![CDATA[雑記]]></category>

		<guid isPermaLink="false">http://blog.restartr.com/?p=970</guid>
		<description><![CDATA[6/11,12の土日を利用して、福島県相馬郡新地町にボランティア活動に行ってきました。 活動の経緯 東日本大震災がおきてから、被災地に対して何かできることを、ということでこれまで募金と献血をやってきました。が、それだけで [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.flickr.com/photos/53244662@N04/5847245836/" title="IMG_5100 by ReSTARTR_y, on Flickr"><img src="http://farm4.static.flickr.com/3538/5847245836_ca37b883fe_z.jpg" width="640" height="427" alt="IMG_5100"></a></p>

<p>6/11,12の土日を利用して、福島県相馬郡新地町にボランティア活動に行ってきました。</p>

<h2>活動の経緯</h2>

<p>東日本大震災がおきてから、被災地に対して何かできることを、ということでこれまで募金と献血をやってきました。が、それだけでなく何かできることはないかと常々考えていました。<br />
仕事柄、ITを利用した貢献も考えたのですが、イマイチ現地の状況がわからない。情報を得ようとしても地域やソースによって様々かつ時間とともに大きく変化しているからです。<br />
また、社会人とはいうものの土日の時間やお金については結構余裕があるので、じゃあ現地でボランティアをすることで現状を知ることができるのではないか、と考えたのが今回の経緯です。
その後、被災地の状況に詳しい元同僚に相談し、その子の母親と友人2名を加えた5名で活動をしてきました。</p>

<h3>活動内容</h3>

<p><a href="http://www.flickr.com/photos/53244662@N04/5846683717/" title="IMG_5090 by ReSTARTR_y, on Flickr"><img src="http://farm6.static.flickr.com/5109/5846683717_604f687639_m.jpg" width="240" height="160" alt="IMG_5090"></a></p>

<p>津波の被害をうけた民家の瓦礫撤去作業を行いました。<br />
とはいっても大きな物はあらかた自衛隊が撤去しているので、我々の役目は倒れた木の撤去や、瓦・ガラス等の破片の収集、側溝の泥かきなど、担当した民家の敷地内を綺麗にすること。<br />
計10名程度で、1日かけて行いましたが、天候が曇りだったこともあって順調に作業をすることができました。</p>

<h2>現地に行ってみて</h2>

<h4>ボランティアセンターすごい</h4>

<p><a href="http://www.flickr.com/photos/53244662@N04/5822614663/" title="現地到着。まだ受付前。 by ReSTARTR_y, on Flickr"><img src="http://farm3.static.flickr.com/2673/5822614663_ec084f0dfd_m.jpg" width="240" height="144" alt="現地到着。まだ受付前。"></a></p>

<p>被災地のボランティアセンターもずいぶん落ち着いてきているようです。<br />
活動に必要な道具（スコップやマスク）だけでなく、水や活動後のアイスコーヒーなどの提供もして頂きました。<br />
ボランティア活動自体初めてだったのですが、たとえ不慣れであっても、コーディネーターの方々や一緒に活動する方々の力を借りながら活動することは可能であると実感しました。<br />
現地でボランティアをしたいと考えているけど踏み出せなかった方は、真夏になる前に一度足を運んでみてはいかがでしょう。</p>

<h4>電波悪い</h4>

<p>SoftBankの黒SIMをDesireSに入れて利用しているのですが、ほぼ繋がりません。<br />
全然つながらない訳ではないですが、かなり不安定でたまにつながる程度。picplzで写真アップロードしようとしても100%失敗します。<br />
今回の震災でインターネットが活躍したという話は聞きますが、このような電波状況のままでは欲しい情報も手に入らないでしょう。震災後にこうなったのかもともと電波の弱い地域だったのかわかりませんが、これではインターネットの存在も無意味。<br /></p>

<p>利用した福島県伊達市（福島市の近く）の宿泊施設で、地震を体験したのですが、電波が皆無だったために震源や地震の規模などの情報が全く手に入りませんでした。<br /></p>

<p>これまで、インターネットでほしい情報をいつでもどこでもすぐに手に入れられると思っていただけに、手に入らない状況に出くわすとかなりの不安感を覚えます。<br />
こうなると、頼れるものはテレビやラジオ、町内放送やご近所ネットワークになってくるでしょう。
もちろん有線でのインターネットもあるかもしれませんが、緊急時にわざわざPCを起動したりしないでしょう。</p>

<p>そう考えると、インターネットの果たすべき役割はリアルタイムに必要な一次的情報ではなく、その後の情報配信とその整理に注力すべきだと実感しました。</p>

<h4>活動内容と現地で聞いたこと</h4>

<p>一日目は新地町でボランティアを行い、宿泊施設はりょうぜん里山がっこうを利用。
二日目は里山がっこうの自然体験をさせてもらい、その後温泉街で足湯につかって帰宅。</p>

<ul>
<li><a href="http://www.date-satoyama.com/">NPO法人りょうぜん里山がっこう</a></li>
</ul>

<p>里山がっこうでは、震災後の放射能の影響とその取組みについて色々お話を伺いました。友人のブログにその詳細が書かれていますので、そちらを参照してもらうほうが良いと思います。</p>

<ul>
<li><a href="http://agreenqoostar.blog129.fc2.com/blog-entry-604.html">AGREEN　イナカとトカイの橋渡し　 伊達市りょうぜん里山がっこうの「除染」への取り組み</a></li>
</ul>

<p>1日目の活動レポートもあります。</p>

<ul>
<li><a href="http://agreenqoostar.blog129.fc2.com/blog-entry-603.html">AGREEN　イナカとトカイの橋渡し　 新地町ボランティアレポート</a></li>
</ul>

<h2>ボランティア活動に必要な情報</h2>

<h4>ボランティアバスツアー</h4>

<p>被災地は基本的に交通が整備されていません。
一人暮らしで車も所有していない自分としては、現地の交通手段がネックになります。
幸い、「ボランティアバスツアー」というものがあったのでこれを利用することを考えました。</p>

<ul>
<li><a href="http://www.pref-f-svc.org/archives/1216">東日本大震災復興支援・新地町で活動する災害ボランティア募集 | 福島県災害ボランティアセンター</a></li>
</ul>

<p>これなら一人でも現地に向かうことも可能ですし、そこからはコーディネートしてもらえます。
結局は、冒頭にも書いたとおり、田舎暮らしのマッチングの仕事の関係で被災地にも詳しい友人に相談した結果、彼女のご家族に福島駅から現地まで車をだして頂けることになり、東京ー福島間は夜行バスを利用して、友人4人とともに活動する結果となったのですが。</p>

<h4>ボランティア情報のTwitterアカウント</h4>

<p>定期的にボランディアバスツアーなどの情報は下記Twitterアカウントをフォローしておけば、チェックすることができます。(他にもあるかもしれませんが私はこちらでチェックしています。）</p>

<ul>
<li><a href="http://twitter.com/tominvc">@tominvc</a> | 被災地支援都民ボランティア</li>
<li><a href="http://tiwtter.com/tokyovolunteer">@tokyovolunteer</a> | 東京ボランティア・市民活動センター</li>
<li><a href="http://twitter.com/Tasukeaijp">@Tasukeaijp</a> | 助けあいジャパン</li>
</ul>

<p>あとは、健康な体と必要不可欠な装備があれば十分貢献できると思います。</p>

<p>現地で少しばかり写真を撮ってきたのでFrickrにあげておきました。</p>

<p><object type="text/html" data="http://www.flickr.com/slideShow/index.gne?user_id=53244662@N04&#038;set_id=72157626993269710" width="500" height="500"> </object></p>
<div class="TweetButton_button" style="float: right; margin-left: 10px;;height:20px;margin-bottom:5px;"><a href="http://twitter.com/share data-url="http://blog.restartr.com/2011/06/19/volunteer-at-shinchi-fukushima-pref/" data-text="東京から福島へ一泊二日でボランティアに行ってきた"data-count="vertical" data-via="ReSTARTR" data-lang="ja""><img src="http://blog.restartr.com/wp-content/plugins/tweetbutton-for-wordpress/images/tweet.png" style="border:none" /></a></div>]]></content:encoded>
			<wfw:commentRss>http://blog.restartr.com/2011/06/19/volunteer-at-shinchi-fukushima-pref/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DotCloudのMongoDBをScalaから使ってみる</title>
		<link>http://blog.restartr.com/2011/05/28/access-from-scala-to-mongodb-on-dotcloud/</link>
		<comments>http://blog.restartr.com/2011/05/28/access-from-scala-to-mongodb-on-dotcloud/#comments</comments>
		<pubDate>Sat, 28 May 2011 11:00:57 +0000</pubDate>
		<dc:creator>ReSTARTR</dc:creator>
				<category><![CDATA[Scala]]></category>
		<category><![CDATA[dotcloud]]></category>
		<category><![CDATA[mongodb]]></category>
		<category><![CDATA[paas]]></category>

		<guid isPermaLink="false">http://blog.restartr.com/?p=942</guid>
		<description><![CDATA[DotCloudにDuoStackが買収されて、DotCloudでもMongoDBが使えるようになりましたし、node.jsも使えるしで、ますますDotCloudが魅力的なものになってきました。 ただし、node.jsは [...]]]></description>
			<content:encoded><![CDATA[<p>DotCloudにDuoStackが<a href="http://gigaom.com/cloud/exclusive-paas-startups-unite-dotcloud-buys-duostack/">買収され</a>て、DotCloudでもMongoDBが使えるようになりましたし、node.jsも使えるしで、ますますDotCloudが魅力的なものになってきました。
ただし、node.jsはサポートされても、WebSocketは正式サポートされていないと<a href="http://docs.dotcloud.com/components/nodejs/">公式マニュアル</a>にも書いてありますがWebSocketサポート済みのDuoStack買収によってどう流れるか気になるところです。</p>

<p>さて今回は、前回作ったものをベースにScalaからMongoDBへアクセスするサンプルをDotCloudで動かすまでを書いておきます。（まぁ、Scalaのコードはオマケみたいなものですけど…）<br />
前回の記事はこちらです。
 * <a href="http://blog.restartr.com/2011/05/09/sample-sbt-project-for-dotcloud/">ScalaをDotCloudにアップロードするためのsbtサンプル</a></p>

<p>ちなみにDotCloudは下記バージョンにて動作しているみたいです（2011.05.28現在)</p>

<ul>
<li>nginx 0.7.65</li>
<li>jetty 6.1</li>
<li>mongodb 1.8.1</li>
</ul>

<h3>作成したサンプルアプリ</h3>

<p>事情により停止する場合があるかもしれませんがご了承を。</p>

<ul>
<li><a href="http://samplemongo.ramee.dotcloud.com/">http://samplemongo.ramee.dotcloud.com/</a></li>
</ul>

<h3>DotCloudにMongoDBサーバーを準備する</h3>

<p>DotCloudのMongoDBマニュアルはこちら</p>

<ul>
<li><a href="http://docs.dotcloud.com/components/mongodb/">MongoDB — DotCloud documentation</a></li>
</ul>

<p>上記マニュアルにしたがって作成すればMongoDBサーバーを準備できます。<br />
基本的には、追加したいサーバーを登録して、ユーザーを作成するだけです。<br />
簡単。</p>

<p>今回は&#8221;example.mongo&#8221;という名前で作成する例を記してありますので、<br />
それぞれ自分の作成したいアプリ名に読み替えて下さい。</p>

<h4>サーバーを作成</h4>

<p>事前に&#8221;dotcloud create example&#8221;は実行してあるものとします。<br />
詳しくはこちらの<a href="http://docs.dotcloud.com/tutorials/firststeps/#id2">マニュアル</a>を見てください。</p>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$ dotcloud deploy -t mongo example.mongo</div></td></tr></tbody></table></div>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&gt; Created &quot;example.mongo&quot;.</div></div>

<h4>DB情報を確認（ID/PASS）</h4>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$ dotcloud info example.mongo</div></td></tr></tbody></table></div>

<p>deployコマンド実行してから実際に作成されるまで少し時間がかかります。<br />
すぐにinfoコマンドを実行すると下記エラーがでます。<br />
※正確に測ってませんが数十秒くらい？</p>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&gt; Sat May 28 08:14:43 Error: couldn't connect to server 127.0.0.1 shell/mongo.js:79<br />
&gt; exception: connect failed<br />
&gt; Connection to mongo.example.dotcloud.com closed.<br />
&gt; Abort.</div></div>

<p>作成完了していれば、下記情報が表示されますので、&#8221;mongodb_password: ******&#8221;に記載されたパスワードをメモしておきます。</p>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">cluster: wolverine<br />
config:<br />
&nbsp; &nbsp; mongodb_password: ******<br />
created_at: 1306570413.6722209<br />
name: example.mongo<br />
namespace: example<br />
ports:<br />
- &nbsp; name: ssh<br />
&nbsp; &nbsp; url: ssh://mongodb@mongo.example.dotcloud.com:5906<br />
- &nbsp; name: mongodb<br />
&nbsp; &nbsp; url: mongodb://root:******@mongo.example.dotcloud.com:5907<br />
state: running<br />
type: mongodb</div></div>

<h4>MongoDBサーバーへログイン</h4>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$ dotcloud run example.mongo mongo</div></td></tr></tbody></table></div>

<p>infoコマンドで表示されたパスワードを使って、&#8221;sampledb&#8221;というdbにアプリユーザーを追加します。</p>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&gt; use sampledb<br />
switched to db sampledb<br />
&gt; db.getSisterDB(&quot;admin&quot;).auth(&quot;root&quot;, &quot;&lt;infoコマンドで表示されるパスワード&gt;&quot;);<br />
1<br />
&gt; db.addUser(&quot;APPUSER_NAME&quot;, &quot;APPPUSER_PASS&quot;);<br />
{<br />
&nbsp; &nbsp; &nbsp;&quot;user&quot; : &quot;APPUSER_NAME&quot;,<br />
&nbsp; &nbsp; &nbsp;&quot;readOnly&quot; : false,<br />
&nbsp; &nbsp; &nbsp;&quot;pwd&quot; : &quot;xxxxxxxxxxxxxxxxxxxxxxxxxxxxx&quot;<br />
}<br />
&gt; exit<br />
bye<br />
Connection to mongo.example.dotcloud.com closed.</div></div>

<p>※とりあえず一旦ログアウトしてますが、別に必須じゃないです。</p>

<h4>再度ログインしてテスト操作してみる</h4>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$ dotcloud run example.mongo mongo</div></td></tr></tbody></table></div>

<p>新規作成したユーザーでDB操作が可能か確認してみます。</p>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"># mongo<br />
Warning: Permanently added '[mongo.example.dotcloud.com]:5906,[174.129.17.131]:5906' (RSA) &gt; to the list of known hosts.<br />
MongoDB shell version: 1.8.1<br />
connecting to: test<br />
&gt; use sampledb;<br />
switched to db sampledb<br />
&gt; db.auth(&quot;sampleuser&quot;, &quot;samplepass&quot;);<br />
1<br />
&gt; db.sampledb.save({id:1,name:&quot;foo&quot;}); &nbsp;<br />
&gt; db.sampledb.find();<br />
{ &quot;_id&quot; : ObjectId(&quot;4de0b033a1fd29eb0e1522fd&quot;), &quot;id&quot; : 1, &quot;name&quot; : &quot;foo&quot; }</div></div>

<p>問題なさそうなので、あとはアプリを&#8221;dotcloud push&#8221;して動かすだけです。</p>

<h3>scalaからアクセスするサンプル</h3>

<p>サービス名を「example.samplemongo&#8221;として作成する例です。</p>

<p>requirementsはイカのとおり。</p>

<ul>
<li>scala 2.9.0</li>
<li>sbt 0.7.7</li>
<li>jetty 7.3.1.v20110307</li>
<li>casbah 2.1.5.0</li>
</ul>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">sbt</div></td></tr></tbody></table></div>

<p>で基本ディレクトリを作成したら、下記プロジェクト設定を{root}/project/build/MongoSampleProject.scala&#8221;として保存します。</p>

<p>前回の設定クラスをコピーしてきたので、&#8221;sbt dot_create&#8221;と&#8221;sbt dot_push&#8221;も一応使えます。</p>

<p>※&#8221;example.mongo&#8221;の名称は適宜読み替えでお願いします。</p>

<h5>MongodbSampleProject.scala</h5>

<script src="https://gist.github.com/996769.js?file=MongodbSampleProject.scala"></script>

<p>配置できたら、</p>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">sbt reload update</div></td></tr></tbody></table></div>

<p>でライブラリを読み込みます。</p>

<p>あとは下記Servletの実装とweb.xmlを用意したらOK．</p>

<h5>MongodbServlet.scala</h5>

<script src="https://gist.github.com/996769.js?file=MonbodbServlet.scala"></script>

<h5>web.xml</h5>

<script src="https://gist.github.com/996769.js?file=web.xml"></script>

<p>できたら、&#8221;sbt dot_push&#8221;でdotcloudへアップロードされるはずです。</p>

<p>最後に、&#8221;http:／／samplemongo.exapmle.dotcloud.com&#8221;にアクセスして、フォームからデータ登録ができれば成功です。</p>

<p>RDBMSにくらべてデータ保存・取得までが圧倒的に簡単で、PaaSでもMongoDBはいい感じですね！</p>
<div class="TweetButton_button" style="float: right; margin-left: 10px;;height:20px;margin-bottom:5px;"><a href="http://twitter.com/share data-url="http://blog.restartr.com/2011/05/28/access-from-scala-to-mongodb-on-dotcloud/" data-text="DotCloudのMongoDBをScalaから使ってみる"data-count="vertical" data-via="ReSTARTR" data-lang="ja" data-related="dotcloud,mongodb,paas,Scala""><img src="http://blog.restartr.com/wp-content/plugins/tweetbutton-for-wordpress/images/tweet.png" style="border:none" /></a></div>]]></content:encoded>
			<wfw:commentRss>http://blog.restartr.com/2011/05/28/access-from-scala-to-mongodb-on-dotcloud/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ScalaをDotCloudにアップロードするためのsbtサンプル</title>
		<link>http://blog.restartr.com/2011/05/09/sample-sbt-project-for-dotcloud/</link>
		<comments>http://blog.restartr.com/2011/05/09/sample-sbt-project-for-dotcloud/#comments</comments>
		<pubDate>Mon, 09 May 2011 14:35:43 +0000</pubDate>
		<dc:creator>ReSTARTR</dc:creator>
				<category><![CDATA[Scala]]></category>
		<category><![CDATA[dotcloud]]></category>
		<category><![CDATA[paas]]></category>
		<category><![CDATA[sbt]]></category>

		<guid isPermaLink="false">http://blog.restartr.com/?p=914</guid>
		<description><![CDATA[dotcloudを必要最低限操作するためのactionをsbtに追加してみました。 sbtのアクション自体はじめてなので作法がよくわかってないので、間違っているかも知れませんが。 使い方 ※scalaファイルは最後に掲載 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://dotcloud.com/">dotcloud</a>を必要最低限操作するためのactionをsbtに追加してみました。</p>

<p>sbtのアクション自体はじめてなので作法がよくわかってないので、間違っているかも知れませんが。</p>

<h3>使い方</h3>

<p>※scalaファイルは最後に掲載しています。
とりあえず下記を作成するサービス名に置き換えればOKです。</p>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; val dotApplicationName = &quot;APPNAME&quot;<br />
&nbsp; val dotServiceName = dotApplicationName + &quot;.SERVNAME&quot;</div></td></tr></tbody></table></div>

<p>あとは、下記を順に実行すればOK(dot_prepareはdot_pushの前に必ず実行されるので省略可能)</p>

<ul>
<li>&#8220;sbt dot_create&#8221; : サービスの作成</li>
<li>&#8220;sbt dot_prepare&#8221; : リリース用ディレクトリ作成とwarファイルのコピー</li>
<li>&#8220;sbt dot_push&#8221; : dotcloudへのwarファイルpush</li>
</ul>

<h3>dotcloud用に注意すべきこと</h3>

<p>&#8220;sbt package&#8221;を使用すると、&#8221;＜projectName＞-＜scala_ver＞-＜app_ver＞.war&#8221;の形式でwarファイルが作成されます。
が、dotcloudのドキュメントにはこう書いてあるので、&#8221;root.war&#8221;で作成するのが望ましいです。</p>

<blockquote>
The java service will make your application available at http://frontend.myapp.dotcloud.com/ if your archive is named root.war or http://frontend.myapp.dotcloud.com/webapp/ if your archive is named webapp.war (../foobar/ if the archive was named foobar.war and so on). So, you can effectively serve multiple web applications with the same java service.
</blockquote>

<p><a href="http://docs.dotcloud.com/components/java/">Java &mdash; DotCloud documentation</a></p>

<p>さらに、&#8221;dotcloud push&#8221;はwarファイルを含むディレクトリを指定することになり、それ以下がすべて同期されてしまいます。デフォルトだと、&#8221;./target/scala_2.8.1/&#8221;以下のすべてが。</p>

<p>なので、warのみ格納する&#8221;release&#8221;ディレクトリを作り、 そこに&#8221;root.war&#8221;としてひとつだけ存在させておきました。
順番に書くと、</p>

<ul>
<li>sbt packageでtarget/scala_2.8.1/＜projectName＞-＜scala_ver＞-＜app_ver＞.warを生成</li>
<li>そのwarファイルをtarget/release/root.warにコピー</li>
<li>&#8220;dotcloud push ＜dotcloud_appname＞ target/release/&#8221; でwarのみアップロード</li>
</ul>

<p>という方法で対応しました。</p>

<p>以下、サンプルのプロジェクト設定です。</p>

<script src="https://gist.github.com/962534.js?file=RameeProject.scala"></script>

<h3>参考リンク</h3>

<ul>
<li><a href="http://docs.dotcloud.com/cli/">DotCloud command line &mdash; DotCloud documentation</a> </li>
<li><a href="http://code.google.com/p/simple-build-tool/wiki/Process">Process &#8211; simple-build-tool &#8211; A build tool for Scala &#8211; Google Project Hosting</a></li>
</ul>
<div class="TweetButton_button" style="float: right; margin-left: 10px;;height:20px;margin-bottom:5px;"><a href="http://twitter.com/share data-url="http://blog.restartr.com/2011/05/09/sample-sbt-project-for-dotcloud/" data-text="ScalaをDotCloudにアップロードするためのsbtサンプル"data-count="vertical" data-via="ReSTARTR" data-lang="ja" data-related="dotcloud,paas,sbt,Scala""><img src="http://blog.restartr.com/wp-content/plugins/tweetbutton-for-wordpress/images/tweet.png" style="border:none" /></a></div>]]></content:encoded>
			<wfw:commentRss>http://blog.restartr.com/2011/05/09/sample-sbt-project-for-dotcloud/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

