クックパッドの24contestに参加しました

クックパッドさんは仕事でもプライベートでもお付き合いがあるのですが、そのクックパッドが24時間限定の開発コンテストをやるということで参加しました。
未踏やってる時にどうしてもGAE/JRuby + twitterアプリをやりたかったのですが、それを便乗してやってしまおうということです。
(ちなみに未踏は無事終了しました。)

ネタ

コンテストの課題が「朝起きてから学校や会社に行くまでの時間をより便利にするためには」でした。朝に役立つtwitterアプリ、、ということで最初に思いついたのが、朝気になるのは夜流れてしまったTLの内容だよね!ってことで、夜中の自分のTLを保存できるアプリがあれば嬉しい人いるんじゃないかということで、安易に「丑三つったー」という名前をつけて開発を始めました。

開発した時のメモ

開発時の設計メモをさらしてみます。時間がなくて妥協したものも多いですが、実装もこんな感じになりました。


■仕様
必要
・寝てる間のtweetを保存しておいて起きたときに見るツール
・「おやすみ」ボタンから「おはよう!」ボタンまでのtweetをためる
・デフォルト昨日のが見れる

あるといい
・今までのリンクもあるとよい
・認証はgoogle
twitterの人で絞り込めるといいなぁ
iPhone用画面とか

■設計
<アプリ構成>
・GAE/J with appengine gem
sinatra

<動作>
tweet収集部はcronで1hに1回
- limit 24h
・Web画面では、「おやすみ」か「おはよう!」ボタンがあって、
 おはよう!したら昨日の一覧が見れる。

<モデル>
・user has n tls
- login
・tl has n tweets
- start
- end
tweet
- twitterに準じる http://apiwiki.twitter.com/Return-Values

作業メモ

$ sudo gem install google-appengine
$ appcfg.rb generate_app ushi3tter
$ cd ushi3tter

Gemfileとconfig.ruでsinatraを有効に

Gemfile

# Critical default settings:
disable_system_gems
disable_rubygems
bundle_path ".gems/bundler_gems"

# List gems to bundle here:
gem "dm-appengine"
gem "sinatra"
gem "json-jruby"

json-jrubytwitterのデータパースに必要

config.ru

require 'appengine-rack'
AppEngine::Rack.configure_app(          
    :application => "ushi3tter",           
    :precompilation_enabled => true,
    :version => "1")

require 'app'
run Sinatra::Application

app.rbに実装
モデルとかパスのハンドラとか書く。こちらを参照> ushi3tter/app.rb at master · fujibee/ushi3tter · GitHub

テスト!テスト!!テスト!!!

$ dev_appserver.rb .

ある程度できたらgoogle app engineにアップロード

$ appcfg.rb update .

また実装とテストに戻る

はまりポイント

主にappengine-jrubyではまったんですが、datamapperでモデルにidをSerial型で定義していないと変なエラーが出ます。(30分くらいはまり)
あと、開発環境でモデルが中途半端にできてると壊れるので、clearするような仕組みがあるといいかもしれません。
最大のハマリは、appengine本番にアップしたあと直後は、必要なindexがappengine上で作成されていないため、エラーになります。。
とりあえず必要なindexをgoogleに作成しておいて、開発を進めるのがよいようです。

感想

まずはこのような機会を与えてくれたクックパッドさんに感謝です。
で、このコンテスト127人もの開発者が参加したとのことで、twitter上でその人達が開発している様子が伺えて、それがとてもおもしろかったですね。
もし今度やるときは、もっとネタを練って少しは入賞に手がかかるようにしたいですね。

おまけ

後日、Asakusa.rbで@urekatさんに会っていろいろお話を聞けました。日本のappengine-jrubyの第一人者です。
@masui さんがまとめサイトを作ってくれています。 24contest / Index

11月のイベント参加まとめ その1

11月にいくつかのカンファレンス、イベント、勉強会に、会社や未踏などいろいろな立場で参加してきました。まったくブログに書けていないので、備忘も兼ねてまとめて書きます。

Hadoop Conference Japan 2009

今やっている未踏のプロジェクトテーマがHadoopなので、この第1回目のHadoopカンファレンスは外すわけには行きませんでした。(実は未踏の合宿と日程がかぶって、調整が大変でした。。管理組織の方、ありがとうございます。。)
さらに開催数日前に懇親会中のLT枠があるということで、急遽申し込み、未踏プロジェクトのLTをしてきました。
そのときのスライドも公開しています。

カンファレンスの内容自体も素晴らしく、特にHadoopディストリビュートサービスを行っているClouderaとHadoopWorldの報告はとても興味深いものでした。

いろいろな方がレポートを書いているので、貼っておきます。

公式ハッシュタグは、#hcj2009でした。

Bridge2009

BRIDGE2009

Bridge2009も今回始めて開催されるイベントで、未踏のPMもやられているIBMの勝屋さんと、本荘さんという人脈の広いお二方が、人と人をつなげるというテーマで行われました。
勝屋さん主催だけあって、未踏ネタも多かったのですが、キーノートがtsudaるの津田さんとウノウの山田さんだったり、サイボウズ創業者の高須賀さんと未踏ユースPMの首藤さんのセッションがあったり、今年の未踏スーパークリエイターたちのLTがあったりと、盛りだくさんで楽しめました。

その中でも、高須賀さんのセッションで出た、「日本のベンチャーが世界で戦うには」というテーマはとても面白かったです。3つ要素があって、1.マーケティングはメディア中心ではなく、アメリカではブロガーを中心にして行う。2.モノマネサービスじゃダメ、オリジナリティが重要。3.やはりアメリカに住まないと。という話は、実際にアメリカで戦ってらっしゃったかたの含蓄があるないようだと思いました。
それを受けて、首藤さんの、「日本で出資してもらったら、日本市場で上場を目指すので、世界では戦えない」というのもなるほどと納得しました。

リンクは以下のページに集約されていました。

公式ハッシュタグは、#bridge09でした。

あと2つのイベントに参加しました

・・のですが、また別の日に書きます。本業がらみのすくすくスクラムというスクラム勉強会と、クックパッドで開催された分散処理に関する勉強会です。

JavaからRuby実行がより簡単に!JRuby1.4.0RC1にJRuby Embedがバンドル

10月2日にJRuby1.4.0RC1がリリースされたようですが、InfoQの記事によると、それに原田洋子さんが開発したJRuby Embed(コードネーム?Red Bridge)がバンドルされたとのことです。
JRuby Embedは、Java6のScripting APIをよりJRubyで使いやすくしたもののようで、本当に簡単にJavaからRuby Scriptが呼べるみたいです。

ということで、実験してみました。

まずはJRuby1.4.0RC1をダウンロード。

$ wget http://dist.codehaus.org/jruby/1.4.0RC1/jruby-complete-1.4.0RC1.jar

これにパスを通して、以下のコードを実行してみます。

import org.jruby.embed.ScriptingContainer;

public class JRuby14Test {
    public static void main(String[] args) {
        ScriptingContainer container = new ScriptingContainer();
        container.runScriptlet("puts 'Hello, World!'");
    }
}

実行結果。

$ java -cp jruby-complete-1.4.0RC1.jar:. JRuby14Test
Hello, World!

おー、すごく簡単になりましたね。
ここのサンプルを見ると、JSR223やBSFに比べて、どのくらい簡単になったかがわかります。

今やっている未踏プロジェクトでも、JavaからのRuby呼び出しは肝ですので、Java Scripting APIからこれを使ったものに置き換えようと思っています。

原田さんはServlet Gardenの中の人ですね。昔、Servletを勉強するときにお世話になった覚えがあります。またもや、ありがとうございます。

githubのHudsonをビルドする

前回取得したgithubのHudsonをビルドしてみます。

$ cd fujibee-hudson
$ mvn install
...
[INFO] BUILD SUCCESSFUL

もちろん、kohsukeのものを取得してビルドしても構いません(というかそれが普通)。
少し時間がかかりましたが、問題なくビルドできました。

Hudson本体は war/target/hudson.war にできているので、これを実行します。

$ java -jar war/target/hudson.war
Running from: /home/fujibee/work/dev/fujibee-hudson/war/target/hudson.war
[Winstone 2009/08/16 17:34:12] - Beginning extraction from war file
[Winstone 2009/08/16 17:34:14] - No webapp classes folder found - /home/fujibee/.hudson/war/WEB-INF/classes
hudson home directory: /home/fujibee/.hudson
[Winstone 2009/08/16 17:34:15] - HTTP Listener started: port=8080
[Winstone 2009/08/16 17:34:15] - AJP13 Listener started: port=8009

このホストの8080にアクセスすると、今ビルドしたHudsonを使うことができます。
画面の下のほうに、ビルドしたバージョンと時間が表示されています。

Hudson ver. 1.320-SNAPSHOT (private-08/16/2009 03:34-fujibee)

githubに公式(?)Hudsonリポジトリができたようです

前回のエントリーでHudsonをgit-svnで取得するネタを書いたのですが、Kohsuke(川口耕介さん・Hudsonのメインコミッター)がコメントをつけてくれて、githubのkohsukeアカウントにHudson SVNからトラックしているとのことです!

履歴(Networkページ)を見てみると、できたばかりのようですね。ということで、これを自分アカウントにフォークして使うことにします。

フォークの方法は簡単で、githubに自分のアカウントにログインした後、さっきのページで「Fork」ボタンを押すだけです。すると、自分のページにフォークされたプロジェクトがでてきます。

これをローカルに持ってきます。
もし、自分のgithubに認証用キーをまだ登録していなければ、昔のエントリーを参考にしてください。

$ git clone git@github.com:fujibee/hudson.git fujibee-hudson
Initialized empty Git repository in /home/fujibee/work/dev/fujibee-hudson/.git/
remote: Counting objects: 88830, done.
remote: Compressing objects: 100% (26961/26961), done.
Indexing 88830 objects...
remote: Total 88830 (delta 57165), reused 87832 (delta 56467)
 100% (88830/88830) done
Resolving 57165 deltas...
 100% (57165/57165) done

取得は、svnやgit-svnよりかなり早かったです。

次回はこれをビルドしてみます。

Hudsonの開発環境をgit-svnで準備する

Hudsonの開発ソースコードSubversionでホストされているので、Hudson本体やプラグインを開発するにはSubversionを使う必要があります。でも、Hudsonは多数のコントリビュータによって開発されていますので、Subversionのような中央リポジトリに対する頻繁なコミットは慣れないと気が引けますし、でもローカルに変更は持ち続けたくないので、できれば今流行のGitなどの分散SCMを使いたいところです。

そこで、Gitにはgit-svnという、Subversion中央リポジトリ + Gitローカルリポジトリという使い方ができるものがあるようなので、これを使ってHudsonの開発環境を整えてみます。

こちらのサイトを参考にしました。

まずはyumでgitをインストールします。

$ sudo yum install git

Hudsonの独自ビルド方法は公式ページにあります。

これによると、普通のSubversionによるチェックアウトはこのようにやるようです。

$ svn co https://svn.dev.java.net/svn/hudson/trunk/hudson

git-svnでは次のようになります。

$ git svn clone https://fujibee@svn.dev.java.net/svn/hudson/trunk/hudson
Using existing [svn-remote "svn"]
Authentication realm: <https://svn.dev.java.net:443> CollabNet Subversion Repository
Password for 'fujibee': Can't locate Term/ReadKey.pm in @INC (@INC contains: /usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.8 /usr/lib/perl5/site_perl/5.8.7/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.6/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.5/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.7 /usr/lib/perl5/site_perl/5.8.6 /usr/lib/perl5/site_perl/5.8.5 /usr/lib/perl5/site_perl /usr/lib/perl5/vendor_perl/5.8.8/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.7/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.6/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.5/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.8 /usr/lib/perl5/vendor_perl/5.8.7 /usr/lib/perl5/vendor_perl/5.8.6 /usr/lib/perl5/vendor_perl/5.8.5 /usr/lib/perl5/vendor_perl /usr/lib/perl5/5.8.8/i386-linux-thread-multi /usr/lib/perl5/5.8.8 .) at /usr/bin/git-svn line 2272.

うーん、Perlモジュールエラー?おそらく、認証が通らなかっただけだと思うので、認証だけsvnコマンドで通してみます。

$ svn info --username fujibee https://svn.dev.java.net/svn/hudson/trunk/hudson
認証領域: <https://svn.dev.java.net:443> CollabNet Subversion Repository
'fujibee' のパスワード:
-----------------------------------------------------------------------
**注意**  認証領域

   <https://svn.dev.java.net:443> CollabNet Subversion Repository

のパスワードは暗号化されていないディスクに保存されるだけです! 可能なら、
Subversion がパスワードを暗号化して保存できるよう、システムを設定するこ
とをお勧めします。詳しくはドキュメントを参照してください。

'/home/fujibee/.subversion/servers''store-plaintext-passwords' オプションの値を 'yes' または 'no'
に設定すると、この警告がこれ以上現れないようにすることができます。
-----------------------------------------------------------------------
暗号化されていないパスワードを保存しますか (yes/no)? yes

怪しげな警告が。。でも、平文でパスワードが保存されているだけだと思うので、パーミッションを変えればいいでしょう。

$ ls -l ~/.subversion/auth/
合計 16
drwxrwxr-x 2 fujibee fujibee 4096  814 00:22 svn.simple
drwxrwxr-x 2 fujibee fujibee 4096  814 00:10 svn.ssl.client-passphrase
drwxrwxr-x 2 fujibee fujibee 4096  814 00:10 svn.ssl.server
drwxrwxr-x 2 fujibee fujibee 4096  814 00:10 svn.username

確かに認証系のファイルができてそうです。

$ chmod -R go-rwx ~/.subversion/auth/
$ ls -l ~/.subversion/auth/
合計 16
drwx------ 2 fujibee fujibee 4096  814 00:22 svn.simple
drwx------ 2 fujibee fujibee 4096  814 00:10 svn.ssl.client-passphrase
drwx------ 2 fujibee fujibee 4096  814 00:10 svn.ssl.server
drwx------ 2 fujibee fujibee 4096  814 00:10 svn.username

これでOK。気を取り直して、git-svn、をしてみたのですが、先ほどのエラーで残骸が残ってしまったようなのでいったん消します。

$ rm -rf hudson/

再度。

$ git svn clone https://fujibee@svn.dev.java.net/svn/hudson/trunk/hudson
Initialized empty Git repository in .git/
        A       hudson.iml
        A       lib/retroweaver/retroweaver.jar
        A       lib/retroweaver/bcel-5.1.jar
        A       lib/retroweaver/Regex.jar
        A       lib/retroweaver/jace.jar
        A       lib/stapler.jar

うまくいきました!でも、リポジトリ取得まで時間がかかる様子。。screen上で実行していてよかった。

途中経過。

        A       plugins/jwsdp-sqe/src/main/webapp/help.html
        A       plugins/jwsdp-sqe/pom.xml
        A       plugins/jwsdp-sqe/.cvsignore
r974 = b51ffed625c3fdbd2cc41a2a76330a8835c63d54 (git-svn)
        M       main/war/pom.xml
r975 = 96ae059f1bc3dbf6f064e1ce89ad233cfdc6dd1f (git-svn)
        M       main/core/src/main/resources/hudson/model/JobCollection/index.jelly
r976 = 0ed7f7113b33f3041de7738ed43cbebc92a20e95 (git-svn)
        A       tools/maven-hpi-plugin/.cvsignore
        A       main/core/pom.xml
        A       main/core/README.txt

過去のSVNコミットを順にローカルリポジトリに取り込んでいるようです。