ブログ移動しました
英語のブログが書きたくなったので、この機会にオリジナルドメインで日本語と英語の両方のブログを自前サーバでホスティングすることにしました。WordPressです。
- http://fujibee.org/ (日本語)
- http://fujibee.org/en/ (英語)
今後もよろしくお願いします!
クックパッドの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"
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に作成しておいて、開発を進めるのがよいようです。
できたもの
現時点では完成度低いです。。ソースはgithubにも公開してます。
感想
まずはこのような機会を与えてくれたクックパッドさんに感謝です。
で、このコンテスト127人もの開発者が参加したとのことで、twitter上でその人達が開発している様子が伺えて、それがとてもおもしろかったですね。
もし今度やるときは、もっとネタを練って少しは入賞に手がかかるようにしたいですね。
おまけ
後日、Asakusa.rbで@urekatさんに会っていろいろお話を聞けました。日本のappengine-jrubyの第一人者です。
@masui さんがまとめサイトを作ってくれています。 24contest / Index
参考にしたURL
- Google Code Archive - Long-term storage for Google Code Project Hosting.
- http://apiwiki.twitter.com/Twitter-API-Documentation
- appengine-jrubyで簡単GAE/JRuby開発 - しばそんノート
- Google App Engine + JRuby + Sinatra + Ruby Twitter Gem でTwitter APIを利用したWebアプリを作る - 愛と勇気と缶ビール
- GoogleAppEngine/JRuby+RailsでscaffoldからTwitterBotまで - urekatのスカンク日記3
11月のイベント参加まとめ その1
11月にいくつかのカンファレンス、イベント、勉強会に、会社や未踏などいろいろな立場で参加してきました。まったくブログに書けていないので、備忘も兼ねてまとめて書きます。
Hadoop Conference Japan 2009
今やっている未踏のプロジェクトテーマがHadoopなので、この第1回目のHadoopカンファレンスは外すわけには行きませんでした。(実は未踏の合宿と日程がかぶって、調整が大変でした。。管理組織の方、ありがとうございます。。)
さらに開催数日前に懇親会中のLT枠があるということで、急遽申し込み、未踏プロジェクトのLTをしてきました。
そのときのスライドも公開しています。
カンファレンスの内容自体も素晴らしく、特にHadoopディストリビュートサービスを行っているClouderaとHadoopWorldの報告はとても興味深いものでした。
いろいろな方がレポートを書いているので、貼っておきます。
- http://hugjp.org/
- 高まるHadoopの導入機運、日本のHadooperが集結 - ITmedia エンタープライズ
- 分散処理ソフト「Hadoop」のユーザー会が日本で発足、企業の導入が広がる | 日経 xTECH(クロステック)
- 「Hadoop Conference Japan 2009」開催される Hadoopユーザー会も始動:CodeZine(コードジン)
- Scala on Hadoop: Hadoop Conference - stanaka's blog
- Hadoop Conference Japan 2009 に参加してきました! - (゚∀゚)o彡 sasata299's blog
- http://blog.pasonatech.co.jp/counselor/career_blog/104/12056.html
- http://donrails.araki.net/archives/id/6849 http://donrails.araki.net/archives/id/6850
- Loading...
- Shudo's Notes (2009/11)
Bridge2009
Bridge2009も今回始めて開催されるイベントで、未踏のPMもやられているIBMの勝屋さんと、本荘さんという人脈の広いお二方が、人と人をつなげるというテーマで行われました。
勝屋さん主催だけあって、未踏ネタも多かったのですが、キーノートがtsudaるの津田さんとウノウの山田さんだったり、サイボウズ創業者の高須賀さんと未踏ユースPMの首藤さんのセッションがあったり、今年の未踏スーパークリエイターたちのLTがあったりと、盛りだくさんで楽しめました。
その中でも、高須賀さんのセッションで出た、「日本のベンチャーが世界で戦うには」というテーマはとても面白かったです。3つ要素があって、1.マーケティングはメディア中心ではなく、アメリカではブロガーを中心にして行う。2.モノマネサービスじゃダメ、オリジナリティが重要。3.やはりアメリカに住まないと。という話は、実際にアメリカで戦ってらっしゃったかたの含蓄があるないようだと思いました。
それを受けて、首藤さんの、「日本で出資してもらったら、日本市場で上場を目指すので、世界では戦えない」というのもなるほどと納得しました。
リンクは以下のページに集約されていました。
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をビルドする
$ 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
次回はこれをビルドしてみます。
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 8月 14 00:22 svn.simple drwxrwxr-x 2 fujibee fujibee 4096 8月 14 00:10 svn.ssl.client-passphrase drwxrwxr-x 2 fujibee fujibee 4096 8月 14 00:10 svn.ssl.server drwxrwxr-x 2 fujibee fujibee 4096 8月 14 00:10 svn.username
確かに認証系のファイルができてそうです。
$ chmod -R go-rwx ~/.subversion/auth/ $ ls -l ~/.subversion/auth/ 合計 16 drwx------ 2 fujibee fujibee 4096 8月 14 00:22 svn.simple drwx------ 2 fujibee fujibee 4096 8月 14 00:10 svn.ssl.client-passphrase drwx------ 2 fujibee fujibee 4096 8月 14 00:10 svn.ssl.server drwx------ 2 fujibee fujibee 4096 8月 14 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