カテゴリー「Ruby」の17件の投稿

2010年4月 8日 (木)

Ernie : Ruby/Erlang Hybrid BERT-RPC Server

Ruby
この辺で紹介したバイナリフォーマットBERT。

当時は単なるRubyでも使用できるバイナリフォーマットとRuby実装のRPCサーバ、という程度にしか認識してなかったんですけど、仕様を再調査してたら

BERT (Binary ERlang Term) is a flexible binary data interchange format based on (and compatible with) Erlang's binary serialization format (as used by erlang:term_to_binary/1).
ということで、どうやらErlangでノード間通信するときのシリアライズフォーマットであるExternal Term Format(ETF)を拡張しているみたいです。

Erlangはちょうど勉強中ということもあり俄然、興味が沸いてきたのでもうちょっと調べたら、Ruby実装だと思っていたBERT-RPCサーバErnieはRubyとErlangによる実装だった模様。

Ernieの内部でどうやってRubyとErlangが連携しているかも興味があるし、これは試してみなければ。

まずはErlangのインストール。

次にErnieをRubyGemsでインストール。

$ sudo gem install ernie
Password:
Building native extensions.  This could take a while...
Building native extensions.  This could take a while...
Successfully installed bert-1.1.2
Successfully installed bertrpc-1.3.0
Successfully installed ernie-2.2.0
3 gems installed

BERT本体であるbertや、クライアントのbertrpcも同時にインストールされる。

んで、BERT-RPCサーバ側のハンドラを作る。
最初はIntroducing BERT and BERT-RPCと同じコードにしてみた。

# calc.rb
require 'ernie'
mod(:calc) do fun(:add) do |a, b| a + b end end

Ernieを起動。

$ ernie -p 9999 -n 10 -h calc.rb
(略)/1.8/optparse.rb:1450:in `complete': invalid option: -n (OptionParser::InvalidOption)
  :

動かねえじゃん!!
つか、-nオプションがマズいみたいだ。

パラメタなしで起動すると…

$ ernie
A config file must be specified: ernie -c /path/to/config.yml

-cオプションでコンフィグファイルが必要みたい。

どうも初期BERTとは仕様が違うみたいなので、GitHubの最新の仕様を参照。って、サンプルも載ってんじゃん。最初から見ろよ、おれ。

というわけでハンドラを作り直し。

require 'rubygems'
require 'ernie'
module Ext def add(a, b) a + b end end
Ernie.expose(:ext, Ext)

普通のRubyモジュールの書き方なので、こっちの方がイイね。

このRubyハンドラをcalc.rbとして保存し、次にコンフィグファイルを作成。

[{module, ext},
 {type, external},
 {command, "ruby calc.rb"},
 {count, 2}].

calc.cfgとして保存。
最後がピリオド(.)で終わってるし、Erlangのリスト形式なんだと思う。
これで(たぶん)externalなハンドラ(つまりRubyのハンドラ)をextというモジュール名で、Ernieに教えてあげてるんだと思う。countはworkerの数らしい。

コンフィグファイルを使ってErnieを起動。
コンフィグファイル内で"ruby calc.rb"としているので、コンフィグファイルがあるディレクトリで下記を実行する。

$ ernie -d -p 9999 -c calc.cfg
erl -boot start_sasl -detached +Bc +K true -smp enable -pz (略)/ernie-2.2.0/bin/../ebin \
 -ernie_server_app port 9999 -ernie_server_app config '"calc.cfg"' -ernie_server_app log_level 2 -run ernie_server_app boot

うまく立ち上がった!!

$ ps x | grep ruby
 3501   ??  Ss     0:00.18 ernie handler 2.2.0 (ruby) - calc.rb - [1] waiting
 3502   ??  Ss     0:00.18 ernie handler 2.2.0 (ruby) - calc.rb - [0] waiting
 3579 s000  R+     0:00.00 grep ruby

確かにRubyプロセスが2つ待機しているようだ。

実際にErnieと通信してみる。
もちろんRubyによるクライアント実装bertrpcを使う。
スクリプトを書くほどでもないので、irbを使ってインタプリタ実行。

$ irb
>> require 'bertrpc'
=> true
>> svc = BERTRPC::Service.new('localhost',9999)
=> #<BERTRPC::Service:0x1011369b8 @port=9999, @host="localhost", @timeout=nil>
>> svc.call.ext.add(1,2)
=> 3
>> 

おお!!
call request(同期処理)がちゃんと実行されてる!!
localhostなのでありがたみがないけど。

BERTが流れる通信路の暗号化はどうすんの?とか、非同期処理(cast request)はどうすんの?とか、興味はつきないけど、ひとまず超お手軽にRPCが実現できることは分かった。

| | コメント (0) | トラックバック (0)
|

2010年4月 2日 (金)

Ruby Twitter Gem

Ruby今までRubyでTwitterを扱うときはTwitter4Rというライブラリを使うか、簡単なモノなら直接Twitter APIを叩いていたんだけど、最近の流行りはもしかしたらTwitter gemかもしれない。

認証(というか認可か…)にOAuthも使えるようだし。(Twitter4Rはあまり活発に開発が行なわれていない様子)

というアレで、試してみた。
例によってgemでインストール。

$ sudo gem install twitter

twitterの他にもいくつかライブラリがインストールされた。

Successfully installed oauth-0.3.6
Successfully installed hashie-0.2.0
Successfully installed crack-0.1.6
Successfully installed httparty-0.5.2
Successfully installed json-1.2.3
Successfully installed twitter-0.9.4
6 gems installed

hashie? httparty??
最近、Ruby界隈をマジメにウォッチしてなかったせいか、知らないライブラリが多い。

で、サンプルどおりにつぶやきスクリプトを書いてみる。

require 'rubygems'
require 'twitter'
httpauth = Twitter::HTTPAuth.new('username', 'password') client = Twitter::Base.new(httpauth) client.update('Tweet from the Twitter Gem.')

結果はこちら
まったく 簡単 だ。

| | コメント (0) | トラックバック (0)
|

2010年3月 3日 (水)

Twitter + Googleマップ

定時退社日を利用して、久しぶりにウェブアプリを作ってみた。

http://twip.heroku.com/

ホスティングにはRails用PaaS環境であるherokuを利用。データベース周りでハマったんだけど、きちんと調べてないので詳細はまた今度。

このアプリ、単にTwitterの直近200個のタイムラインからモバツイの位置情報をひろって、Googleマップにインポートしているだけなんですけど、…残念ながら、モバツイ専用です。
あと、定期処理を行なっているわけでもないので、取りこぼしも発生すると思われます。

マッシュアップの一例ということで。

| | コメント (4) | トラックバック (0)
|

2009年11月17日 (火)

BERT

この辺で紹介したProtocol Buffers。
XMLの代替として使えるシリアライズバイナリデータ形式だったわけですけども。

clipProtocol Buffers/Thriftに対する動的な代替手段としてのBERT

BERTはASN.1やProtocol Buffersとは違って、フォーマットのスキーマやIDL仕様を必要としない。つまり、BERTはJSONの背景にある考え方のバイナリ版のようなものだ、とTom Preston-Werner氏は説明する。
(略)
BERT-RPCは、BERTを使って呼び出しの引数と戻り値をエンコードすることにより、BERT-RPCサーバにホストされているコードをリモートから呼び出すことができる。
あまりRemote Procedure Callを使うシーンには遭遇しないんですけど、スケールアウトがトレンドの昨今においては、マシン間での同期とかプロセス間通信を利用するシーンも案外増えるかもしんないなぁ、とか思ったり。

BERTのSpecificationはこちら
BERT-RPCサーバのRuby実装はこちら

| | コメント (0) | トラックバック (0)
|

2009年10月10日 (土)

デザインパターン

連休初日。

内職デイ。

今さらながらデザインパターンの重要性を再認識。

JavaとかC#とかで大きめの開発をやるときは、まずい設計だとソッコーで破綻するので、ときにはデザインパターンも参考にして「誰が実装しても同じようなコードになる」よーなアプローチを取り、品質が一定になるよう、スキルの差が生産性の差にならないよう、全体最適されるように開発を進めるんですけれども。

Rubyのよーに柔軟性の高い言語だと、言語側である程度問題を吸収してくれるというか、お任せできちゃうというか、わざわざデザインパターンを適用しなくても直感的なコードが書けちゃったりする。
ので、あんまりきっちりした設計はせずに、コードを書きながら設計を進めたりするんですけど。その分コードは何度も書き直すけど(でも生産性が高いので案外平気だったりする)。

んですけれども。
それでも、コードが増えてくると今ひとつエレガントじゃないコードになったり、拡張性が低かったり、自分しか分からなかったり、コードを読むための前提知識が必要だったりするよーな状況に陥ることが分かった。Rubyと言えども。

というわけで再読。

オブジェクト指向における再利用のためのデザインパターン/ソフトバンククリエイティブ

レシピになっているので、必要なところだけ読めばいいのは助かる。もう10年も前の書籍なのか。

| | コメント (0) | トラックバック (1)
|

2009年7月26日 (日)

Twitterで自分のつぶやきを取得する

Twitterを使っていると、日々つぶやきがトラッキングされるので、これを有効利用したくなってくる。
例えば、日報を作成したり、以前つぶやいたアイデアを見直したり。

ところが、Twitterでは過去の「自分の」つぶやきを検索することは基本的にはできない。1ページに20個までのつぶやきしか表示されないため、仕方なく「もっと読む」を何度かクリックし、都度ブラウザの検索を使って目的のつぶやきを見つけるとか、Googleのsite:オプションを使って検索するとか、若干空しい作業をしてきた。

で、最近、フォロー中の中にもそのよーなつぶやき(その1その2)を見かけるようになったので、ざっくりTwitter APIを見てみたんですけど、やっぱり「ユーザを指定して語句を検索する」ようなAPIは提供されていない模様。

まぁ、大規模なユーザを抱えるTwitterでは、サーバに負荷をかけるような検索はできるだけ避けたいのかもしれないな、とも思える。

で、APIを眺めてると、最大200件のつぶやきは取得できるので、コレを使って定期的に自分のつぶやきをローカルのDBやテキストで保存しておき、ローカルで検索するしかないのかな、と。

ということで、直近の200件のつぶやきを取得するRubyスクリプトを書いてみた。
確認環境は久しぶりにMac OS X Leopard。RubyのバージョンはMacPortsでインストールした

ruby 1.8.7 (2009-06-12 patchlevel 174) [i686-darwin9]
1.8系。ライブラリが提供されていれば1.9系でもWindowsでも動くと思う。

まず、Twitter4RというTwitter API用のライブラリをインストール。

gem install twitter4r
スクリプトはコチラ。
require 'rubygems'
gem('twitter4r')
require 'twitter'

def url(id)
"http://twitter.com/#{@login}/status/#{id}"
end

@login = 'your id'
password = 'your password'
twitter = Twitter::Client.new(:login=>@login, :password=>password)
twitter.timeline_for(:me, :count=>200) { |status|
puts "#{status.id} #{status.text} #{url(status.id)}"
}
とりあえず、つぶやきのIDとその内容、Twitter上のURLが出力されるようにしておいた。

実行結果はこんな感じ。

実行結果

Twitter APIの結果はUTF-8だとか書いてあった気がするので、もしかしたらWindowsのコマンドプロンプトだと文字化けするかもしんない。
適当に変換してください。

あとは、スクリプトをdaemonにして、たとえばつぶやきIDとかで比較して差分だけを保存するような形にしておけば、とりあえず、自分のつぶやきをトラッキングする、という目的は達成できると思う。

余裕があったらGAEとかでサービス化して公開するところなんですけど。


下記サイトに感謝。

| | コメント (0) | トラックバック (0)
|

2009年5月28日 (木)

Windows + MeCab + Ruby

RubyGoogleでも使われているらしいし、Mac OS X Leopardにもインストールされているという形態素解析エンジンMeCab

このMeCabをRubyから使おうとすると、通常はスクリプト言語用のバインディングを使うことになると思うんですけど、このRubyバインディングはWindows環境においてはそのままインストールできません。
C++のコンパイラがあればmakeできるらしいけど、まぁ、メンドいですな。どーしてもmakeを通したいヒトはMicrosoft Visual C++ Express Editionでも使えばいいんジャマイカ。


で、提供されているRubyバインディングにこだわらなければ、WindowsのMeCabをRubyから使用できます。

まず、IO.popenを使う方法。

clipWindows上のrubyでMeCabをちょっこっと使ってみたい

popenは実行ファイルをプロセスを起こして実行し、そのプロセスの標準入出力との間にパイプラインを確立するIOメソッド。MeCabは標準入力からの入力を解析し、標準出力に吐いてくれるので、popenを使えば操作できます。

解析の度にMeCabプロセスを起こすことになる(と思う)ので、リソースを消費するのと、性能が出ない(と思われる)のが難点と言えば難点。
でもまぁ、あるものを組み合わせて、サラりと解決するこのやり方はhackっぽくてケッコー好き。


解析の度にイチイチプロセス起こすなんてあり得ん!!という方は、DLLを直接呼び出すやり方をどうぞ。

clipwindowsのrubyからlibmecab.dllを呼び出す

DLLのインターフェイスが分かっていればRubyから呼び出すのは比較的簡単だし、一度ロードしてしまえばRubyスクリプトがメモリに乗っかってる間は呼び出せるので、毎回プロセスを起こすpopen方式よりはコストが低いと思われます。


先人達の知恵に感謝。


個人的には、無理してDLL呼び出ししなくても、popen方式でRubyバインディングと同じインターフェイスのラッパークラスをローカルに準備するのが吉じゃないかと。
開発はWindowsで運用はLinuxで、というシーンを考えたときに、(Rubyバインディングが使用できる)Linuxに乗せる際の手間がなくなるよう腐心した方が幸せな気がします。

| | コメント (0) | トラックバック (0)
|

2009年4月 8日 (水)

Pythonの次

マジか!!

clipグーグル、「App Engine」でのJavaサポートを発表

Google App Engineの次のサポート言語はJavaだったか…。
昨今の(Ruby等の)軽量動的言語にだいぶ押されてきたとは言え、WEB系じゃまだまだ人気というか、(ベンチャー系ではない)企業では未だにそれしか選択肢が無いかのような顔をしてのさばっている(失礼)JavaのGoogleによるサポートは、結構衝撃。


久しぶりにシビれた。


しかしまぁ、なんつーか。Javaとは…Google的じゃないような気もするし、Googleの本音を垣間見た気もするし。
App Engine、大化けするかもしれんなぁ。

Googleも必死ということかもしれない。

| | コメント (0) | トラックバック (0)
|

2009年1月 7日 (水)

初めてのRuby

初めてのRuby/オライリージャパン私信になってしまうけど、最近出たRuby本なら初めてのRubyがいいんじゃないでしょうか。オライリーの動物本にしてはめちゃくちゃ薄いし、日本語だし

ワタクシも持ってますヨ。全部読んでないけど。(またかよ)

Rubyスクリプト言語がどういうものかをサラりと俯瞰するにはちょうど良いリファレンスだと思う。

賛否は知らないけど404 Blog Not Foundの書評でもわりと高評価。
小飼氏曰く、K&R本(プログラミング言語C)と同じような簡潔さ、だとさ。

あー、K&Rも…第2版を全部読み切った自信がないなぁ。

| | コメント (2) | トラックバック (0)
|

2008年7月26日 (土)

Flex on Rails

Flex on Rails: Building Rich Internet Applications With Adobe Flex 3.0 and Rails 2.0キター!!!こういう本を待ってたんですヨ!!!

Flex on Rails: Building Rich Internet Applications With Adobe Flex 3.0 and Rails 2.0

って年末発売なのか…。

しかも洋書じゃねーか…。

翻訳版も同時発売していただきたい!!
っていうか、年末までに(技術)英語がスラスラと読めるようになってりゃいいんだよな。


さておき、k-nos氏がEvernoteに衝撃を受けたと聞いて、将来購入するかもしれないiPod touchやiPhoneのために…ではなく、職場とプライベートの間、WindowsとMac OS Xの間でメモとかシンクロしたい、という理由でEvernoteを導入してみたわけです。

一番簡単な同期方法として、今まではGmailとか使ってたわけです。言い換えると、プラットフォームに依存しないWEBアプリで同期を取ってたわけで、GmailのUIの秀逸さもあり、これはこれで便利っていうか、フツーに考えられる手法かな、と。

ただ、Flashはともかく、AjaxなWEBアプリだとインターフェイスに限界も感じつつあったり。上海の回線速度的にはFlashもキツいし。で、最近のクライアントアプリってどーなのよ、という観点でEvernoteを見てみると、…当たり前に楽勝なわけです。

これからまた、クライアントアプリが盛り返して来るんじゃないか、と思ったり。もちろん、サーバとの連携は必須なので、クライアント側はマルチプラットフォームなFlex使って、サーバ側はRailsだろ、とか思うわけです。
そこに"Flex on Rails: Building Rich Internet Applications With Adobe Flex 3.0 and Rails 2.0"登場。やっぱりニーズはあるんでしょーな。

まぁ、Flexはまだまだモッサリしてるし、Adobeがおさえているので、劇的に流行ることはなさそーだけど。

| | コメント (0) | トラックバック (0)
|