Ruby 1.9.2とRubyGems 1.3.7とGem.pathの消失 2
Debianのバグレポート(Bug#588125)によると、こんな具合いになることがわかった。
$ gem1.9.1 list /usr/lib/ruby/1.9.1/rubygems/source_index.rb:68:in `installed_spec_directories': undefined method `path' for Gem:Module (NoMethodError)
Ruby 1.9.2とRubyGems 1.3.7の組み合わせで、どちらもパッケージを利用している。RubyGemsのコードは、この場合、Ruby 1.9.2に含まれているものではなく、RubyGems 1.3.7からのものが使われている。Gem.pathがないっていうのはなかなか興味深いことだなあとちょっと調べてみた。
Ruby会議2010を見てた
大変ありがたいことに今年もRuby会議の動画配信があったのでこの三日間はそれなりに時間をとって見るようにした。以下は雑他なメモなど。主に自分向け。
Ruby会議2010の注目演目
今年は行かないわけなんです。で、タイムテーブルをざっとみてみたところ興味をそそる演目がちらほら。
-
Rubyによる分散ストレージシステムの実装 (8/29 10:00〜10:30)
おっと、こんな面白そうなプロダクトが作られていたんだ! とタイムテーブルを見て初めて知った。RICOHさんということはquanpで使われていたりするのかなあと連想するわけで、もしそうならがっつり使えそうなものっぽい。面白いというか、早いとこ試してみなければという気持ちに。 -
Memory Profiler for Ruby (8/29 11:30〜12:00)
欲しいよね、メモリプロファイラ。1.8系でもいくつか実装があったけどRuby本体に手を入れなければならないものや、近似っぽいものがほとんどだったような。1.9系向けのこれはどういう実装なのしら。 -
君のクラスの最高の偽物 (8/27 18:00〜19:00)
前田さんの提案。なんとなく恒例っぽい感じもするけどそんなこともなかったっけ? いかにも欲しそうな機能なのだけど、commitはいつだろう? -
User Experience for Library Designers (8/27 14:30〜15:00)
これはいつだったかのakrさんのAPIデザインの話とどういう対比になるのかなという点で興味が。 -
Unix修正主義 (8/28 15:30〜16:30)
で、akrさんの発表。毎度恒例のこいー話なんだろうなと。 -
RWikiと怠惰な私の10年間 (8/29 10:30〜11:00)
きっと何かあるに違いない。
じっくり見返せばほかにも出てきそうだけど。
配信があるかもっぽいので、そちらに期待して。あとは参加したみなさんからのレポートと、コードが出ているものはコードで追いかける、かな。
Content-Encoding: deflateなHTTPレスポンスを作る
Content-Encoding: deflateなHTTPレスポンスを返させる簡単な方法はないかなと探してみたらRackがサポートしていた。どうやるかというと:
use Rack::Deflater
これだけ。ruファイルに書いておけばよい。発端がちょっとしたテストのためだったので、内容はなんでもよく、とにかくdeflateで返してくれれば十分というわけで、こんなのを書いて目的を達成できた:
module Rack
class Foo
def call(env)
r = Response.new
r.write "abc123"*100
r.finish
end
end
end
use Rack::Deflater
run Rack::Foo.new
実際にアクセスしてみるとこうなる:
$ ruby -r open-uri -e 'open("http://localhost:9292/"){|h| p h.read}'
"abc123abc123 ...(略)..."
$ ruby -r open-uri -e 'open("http://localhost:9292/", "Accept-Encoding"=>"deflate"){|h| p h.read}'
"\355\3011\001\000 ...(略)..."
Termtterでハッシュタグを追跡する
Termtterのタイムライン表示でハッシュタグをいっしょに表示できるといいかもと思い、ちょっとやってみた。auto_search.rbと名付けたプラグイン。
タイムラインが更新される前後のフックを使って、あらかじめ指定しておいたキーワードで検索を行う。指定方法はコマンドライン(?)から以下のようにする。
auto_search #termtter #ruby
この例では二つのハッシュタグを検索対象としている。三つでも四つでも、たぶんハッシュタグではないキーワードでもいけると思う。ただ、いろんな検索パターンをテストしたわけではない。
検索対象から外したくなったら以下のようにする。
remove_auto_search #ruby
特に指定しなければタイムラインの更新間隔の3倍の時間ごとに検索を行うようにした。間隔を指定したければ検索キーワードの後に「/n」で何倍にするかを指定する。「#termtter/1」ならタイムラインの更新があるごとに検索を行う。
「/」を含んだり空白を含んだりするキーワードを指定するには「'」か「"」でくくる。ただし、キーワード自体は単に検索APIに投げているだけなので、単語以外の指定にはもしかしたら何か注意が必要かもしれない。
~/.termtter/configでの指定は以下のようにする。
Termtter::Client.plug 'auto_search' config.plugins.auto_search.keywords << '#termtter/2' config.plugins.auto_search.keywords << '#rubykaigi' config.plugins.auto_search.keywords << '#tork02/2' # とちぎRuby会議02 config.plugins.auto_search.keywords << '#RHCBK/4' # RubyによるMac OS Xデスクトップアプリケーション開発入門
config.plugins.auto_search.keywordsが検索キーワードを設定するための配列になっている。キワードの書き方はコマンドラインでの書き方と同じ。この例では一語ずつ追加しているが「config....keywords = '#termtter/2 #rubykaigi ...'」のように指定しても構わない。
ある程度はテストをしてきているが、なんとなく動いたっぽいというところでしか見ていない。取りこぼしや検索しすぎなどあるかもしれないので注意して。
Capistranoで上位タスクと同じホストを強引に処理対象とする
Capistranoのタスクは実行対象ホストのリストをホスト名やロール名で指定できる。この指定は静的なものなので、あるタスクから別のタスクを呼び出したとしても、それらの指定は引き継がれない。
以下のレシピでタスクbarには:hostsオプションがあり、これに従って同タスクはhost3とhost4に対して実行される。barから呼び出されるタスクbazにはこのような指定がないため、barでの指定によらずロールに登録されている全ホスト(host1とhost2)に対して実行される。
role :foo, 'host1', 'host2' task :bar, :hosts => %(host3 host4) do run "..." # host3とhost4でコマンド実行 baz end task :baz do run "..." # 全ロール(host1とhost2)でコマンド実行 end
このような動作をするため、タスクを部品化して再利用しようとすると、ある程度のところからはメソッド定義をしていくことになる。
ここでふと、いいかげんなオブジェクトを渡せばそのあたりの動作をコントロールできかなと考え、その思い付きのまま試みにコードを書いてみた(gist)。テストは一部だけ(しか書いていない)。
uh, ul = UpstreamSupport.create(self) role :foo, 'host1', 'host2' task :bar, :hosts => %(host3 host4) do run "..." # host3とhost4でコマンド実行 baz end task :baz, :hosts => uh do run "..." # 呼び出し元と同じホスト群でコマンド実行 end
このレシピのタスクbarを実行するとhost3とhost4でコマンド実行される。そして、そこから呼びされたタスクbazでも同様にhost3とhost4でコマンド実行される。しかし、タスクbazを直接実行すると、全ロールのホスト群、つまりhost1とhost2でコマンド実行される。さて、うまく動くかな?
ただ、あんまりふみこみすぎてもなってところでもある。
Ruby 1.8.7-pXX v.s. Capistrano 2.5.x
最近のRubyでCapistranoを実行しようとすると、対象ホストが二つ以上のときにかなりの確率でハングアップしてしまうことに気付いた。しばらくは見て見ぬふりをしていたのだが、仕事に少し関係しそうな気配もあって、調べてみることにした。
1.8.7-p72では問題なかった記憶があり、1.8.7-p174で現象が出ることは確認済み。ということでtagのある1.8.7-p72、1.8.7-p160をかわきりに、ruby_1_8_7におけるversion.hのcommit logを手掛かりに二分探索の雰囲気を出しつつ絞り込みをかけていったところ1.8.7-p135で現象が現れることがわかった。
このパッチレベルでの修正内容はruby-core:20446である。が、これを見ても具体的にどういう影響が出ているのかはわからない。修正内容からするとむしろ状況がよくなってくれそうなものだが…… などと思いつつ、試行錯誤を繰り返した。
まず、Capistranoでの問題はNet::SSHで起こっていることがわかった。Net::SSHではIO.selectを使っいながらソケットから少しずつ読み出すということをしている。これにThreadを組み合わせると現象を起こせる。たとえばこんな感じ:
require "net/ssh"
["localhost","localhost"].map {|h|
Thread.new{ Net::SSH.start(h, "foo") }
}.each {|t| t.join }
次に、修正内容と見比べつつさらに試行錯誤し、結局はdebug printをいれてスレッドの動きを追いかけた。かなりおおざっぱな読み方しかしていないので間違っているかもしれないが、なんとなくこんな感じの動きのようだった:
- 読み出し可能になるのを待っているスレッドがある
- そのスレッドで読み出し可能になる→th_foundに値が入る
- 次にスケジューリングのためスレッドを順番に見ていくが
- 運悪く、th_foundなスレッドに到達する前に「次」に実行可能なスレッドが見付かってしまう
現象からいうと運悪くというよりは運良く処理が進むことがあるといったところで、ほとんどの場合、上の再現例の二つのスレッドがゆずり合うような形になっている。
そこで、試みにth_foundしたスレッドにできるだけ処理がまわるよう、スレッドのプライオリティが同じときにも「次」候補のチェックをするように以下のような変更を加えてみた。
--- eval.c (revision 24335)
+++ eval.c (working copy)
@@ -11228,7 +11228,7 @@
break;
}
if ((th->status == THREAD_RUNNABLE || th == th_found) && th->stk_ptr) {
- if (!next || next->priority < th->priority) {
+ if (!next || next->priority <= th->priority) {
if (th == th_found) {
th_found->status = THREAD_RUNNABLE;
th_found->wait_for = 0;
Capistranoでの動きをざっとみたところではこの変更で止まらずに動くようになった。Rubyのテスト(threadのみ)をまわしてみた限りでは影響はなさそう。はてさて。
……という話をIRCでしてみたところmputさんがredmineに登録してくれた(Bug#1848、ruby-dev:38971)。あと多分、これは同じ話だと思う。
追記(2009-08-07)
少なくとも上の変更ではまずいと思えるので変更を出しなおしたのがruby-dev:39003。ただ、それでもまずい感じはするよねと思っていたところ、やはり好しくないらしい。
それではということで再現コードを小さくして、debug printで動きを追いかけてみたのがruby-dev:39037になる。th_foundとはちょうどあべこべにスレッドが選択されている…… ような気がしている。
追記(2009-08-10)
ruby-dev:39042にある通りr24442で修正された。
Ruby会議2009三日目
三日目、最終日のざっくりメモ。
- ソケットライブラリの改善
- 起きてustreamつけたら始まっていた
- ちょっとだけ聞きながら出掛ける準備
- で、移動開始
- コーヒータイム
- 休日の神保町はすいてていいなあ
- +自転車な生活にあこがれる(まあ世の中は休日だけじゃないんだけど)
- なごりおしみつつ移動
- スポンサーブース
- 午後のセッションが始まるまでにまだ少しあったのでスポンサーブースをふらふらする
- 実は、今日、このときまでスポンサーブースが中会議場にあることを知らなかった
- RICOHさんのブースにて
- RubyとかRailsとかで始めるのって社内的にどうでしたか? とか
- クライアントの種類を増やすとかAPIとかって考えてますか? とか
- 予定通りにユーザの増えてる感じです、とか
- いろいろ質問(あとでquanp使ってみよう)
- 開発者の福田さんがいらしてまたいろいろ質問
- 鳥取開発センターなだって! とか、ボスが米子工専なんだって! とかいろいろおどろく
- 始めた経緯も興味深かった(昨年か一昨年のRuby会議で発表されたそうだが、参加してなくて追ってなかったので知らなかった)
- 鳥取でも何かできそうですよね、なんて話もしたり(勉強会とかあったら行っちゃおうかな)
- クリアコードさんのブースにて
- ていうか須藤さんとおしゃべり
- ActiveLdapってすでにdebがあるんですよ→おお最新になってる→この人にrabbitふっちゃうとか→実はAr-さんに話をしてみたんですよ→おー、それはいいですね、などなど
- あと、仕事の具合いはどうですかーとか、学校環境で求められるdistroの特徴はーとか
- SKIPさんのブースにて
- 某所でSKIP動かしてらもらってみたりしたんですよ(これ、ふり返ってみると意味わかんないこと言ってしまっているなあ……)、一人SKIPはさすがにせつないですよね
- まだ今みたいにRubyとかRailsとか話題になる前ですよね、始めるの大変じゃなかったですか? とかRICOHさんでも聞いたこと
- いろいろな事情があって始まったというようなところがあったんだけど、その事情のおかげ(?)でわりあいすんなり、というような話
- で、ゆっくりしていたら原さんのセッションをのがしてしまった
- RubyCocoa/HotCocoa(RHC) ~RubyではじめるMac OS Xデスクトップアプリケーション開発~
- タイトルが変わったんだけど、なんだったかな
- なんていうか、今手元にMacがないのでなんでなんだ? と自問する時間だった
- なんとなく軽快な印象を持ったせいか、Airでどこでもハックだよね、とかかなり軽いことを考えてしまった
- でも持ち運べるMacはやっぱり欲しいな(最近、仕事で出ることが増えたというのもある)
- RubyCocoa本が待ちどおしい
- RubyをつかったiPhoneアプリケーション開発
- iPhoneでRubyが動いたとかってニュースが流れたのは知っていたのだけど、動いているところ(プレゼンの関係上エミュレータだったけど)を見ると動かしてみたくなる
- iPhone上で動いているirbに外部からtelnetで接続して操作するというデモ
- Objective-Cで作られたiRubyKaigi2009にirbを組み込んで、動的にいじっちゃうデモ
- アプリケーションとリリースするのはいろいろグレーな感じもあるのだけど、RubyCocoa 0.5ではARMバイトコードをはけるはずなのでそれでiPhone開発とかできるようになりそう(とかって話だったかな? ちょっとあやしい)
- 何から始めればいいんだっけ? というところからだけど、これ、動かしてみよう
- Erubis徹底解説
- 速いeRubyの実装という認識だったのだけど、そうではない部分でかなり興味深いErubisの話
- テンプレートにBindingではなくてHashやObjectを渡せるようにしてある
- メソッドが細く分かれているので拡張がやりやすい
- eRubyからCとかPHPとかいろんな言語のコードを出力できる
- eRuby→Rubyの変換結果をキャッシュしちゃう
- erubis -XでeRubyに埋め込まれたコードの部分だけを変換して出力することができ、デバッグ時に便利
- 埋め込みコードが文か式かによって前後の空白文字を制御することで、余分な空白問題をシンプルに解決(<%か<%=かっていう話だったのかな)
- form_forの実装はなかなか気持ち悪いのだけど、eRuby的には限界というか未定義な感じ
- eRubyはテキスト処理系であってテンプレートではない→これからはTenjin
- 裏番組が強力すぎたのがもったいない、地味に富む面白いセッションだった
というところで、ちょっと早いけど帰ってきた。
Poken的成果は7人。これが初めてのハイフォー体験となった。ふと思ったのだけど、たとえばRubyKaigiというPokenを作っておいて、来た人は勝手にハイフォーしてねとかはPoken的にどうなんだろうか。(どうもこうもないかも。)
この手のイベントに出るのは久しぶり…… ではなくて、とちぎRuby会議に行ったんだった。ただ、こういう人数の中に入るのは久しぶりだったので、ずいぶん疲れたけども楽しかった。人々と会えるのはなんだかんだいいつつも、何かしら動く部分があるのがよいのかな。
もう少し何か貢献できることがあればなあ、なんて思う。まずはDebianやVineでの活動レベルをキープしていくことからだろう。何はともあれruby1.9をsidに。あー、1.9.1をsidに、1.9.2preをexperimentalに、とかやりたいな。早く調整をしてやっつけよう。
Ruby会議2009二日目 1
本日のざっくりしたメモ。
- コミュニティアピール
- この途中あたりで会場に入った
- 基調講演
- Lightning Talks
- Decimal - BigNumを使ったBigDecimalの小さくて速い再発明で、かつ、好ましい再発明の事例
- morumotto.com - One-Time Passwords for OpenIDというのがそもそも興味深いが、その上日本の携帯電話への対応も行われているとか
- rubyrep - 非同期・マスタ-マスタのRDBレプリケーション(そのうち動かしてみたい)
- ギャルゲーはやらないのでわからないけど、趣味.rbはちょっとおもしろそう。
- Rubyでの(力技)でのネットワーク運用 - 実際のコードや開発の様子をもう少し聞いてみたかった
- cdn.debian.net - 広く使われているRubyコードとしてはなかなかの実績・事例だと思う
- ActiveLdap - LDAPってちょっと使うにはめんどうなんだよね…… ということで自分ではあまり使わないのだけど、これならちょっとコード書けばって気になる(debもある)
- 分散並列処理フレームワークfairyと分散オブジェクトシステムDeepConnect
- map reduceの考え方をベースにした大量データ処理のフレームワーク
- 分散ファイルシステムのほうにも興味があったり
- 領域的にはdRubyと重なるところも多そうなDeepConnectの位置付けや今後の動向が気になる
- 早くコードが出てこないかなあ
- 偉大なBigTableとぼくのおもちゃ
- map reduceが続く
- 世界をコントロールブレイク
- 咳さんの話はおもしろいなあ
- dRuby本とdrb/*.rbを読み返してみたくなった(時間をとっていずれ)
- Regional RubyKaigi会議
- RubyKaigiを開くというようなつもりは少なくとも今はないのだけど、都内以外での勉強会開催という点でヒントが得られないかなと思って参加
- BoFのような感じ
- 「RubyKaigi」という名前には運用ポリシーのようなものがあったということを知った
- とはいえ強いルールではなくて、こういうイメージというようなもののようだ
- だが、それがどんなものかっていうのは正直わからなかった――開催者間ではある程度の共通認識があるようだ
- この間のDebian Ruby1.9 Kaigi(Debian Ruby 1.9会議)は抵触していないとされていたようだが、CAのきわきわだった(○○Ruby○○Kaigiのような字面には要注意)
Reginal RubyKaigiはまだ二回目をやった地域が出てきていない。その点に関連して、前回の○○RubyKaigiのスタイルが重しになってしまって二回目、三回目が(気持ちの上で)開きにくくなるようだとよろしくないという発想があるようだ。では、というので、内容的にゆるくくだけたRubyKaigiをどこかやってくれればその後から楽になるのではないかとか、地名ごとに回数をカウントするのではなく全体で通し番号にすればいいのではないか、などの案が出ていた。反対に、東京のようにいろいろな集まりがあるところは別とすると、むしろ「前回」を続けることである種の場を作りたいという意見もあった。
個人的には地域Ruby会議というくくりのなかでは名前、特に地名が入るというのは重要であると思う。ダブルネームでという声も出ていたが、参加する人がどう呼ぶか、どのような認識で参加するかがポイントだから、なんとなくズレた話のように思えてしまった。とはいうものの「RubyKaigi」の背景にある何かというのがどうにもわからないのでそこのところはなんとも。通し番号にするくらいなら名前はなんでもありにして「後援 日本Rubyの会」でいいんじゃないの? とか思ったんだが…… そういう話でもないのかも。
ふりかえって横浜。横浜Ruby会議というのはあってもいいんじゃないかという意見は出たが、私としては東京に近すぎるのでいまいちかなとも思っている。もちろんやろうって人がいたらお手伝いくらいはできるかしらと考えてみるが、やっぱり自分ではやらないだろうなと思った。横浜Rubyistってあんまりピンとこない――のは私が知らないだけかもしれないけれど、何か色が出せるのかというとこれまたピンとこないから。
だからこそまずは「集まってみない?」というのがあるわけで、そのとっかかりとしても勉強会はやってみようという気になっている。意外とDebianネタにも引き合いがあるようなので、難しくないDebian系の勉強会(難しいのはDebian JPでやってるし)とともにRubyネタも何か考えよう。とりあえずCapistrano、だが、それ以外にあまり手持ちのネタってないのだよなあ。話を聞いてみたい人を挙げてもらって、その人に来てもらって、質問しまくるなんてのは面白いかも。
ま、そんなこんなで、「Ruby,Railsによる「ケータイ」ポータルの作り方!」や「CとRubyとその間」なんかも気になったけど行けなかった。後で映像を見られるようになるのかな?
Ruby会議2009一日目
本日のざっくりしたメモ。
- 出張版toRuby
- dRubyでP2Pぎみに相互接続する演習など
- 思ったようなやり取りができなかったり
- ネットワーク接続がうまくいかなかったり
- 解決していきつつ理解が進んでいたようだ
- マシンを持っていかなかったのでネットワークへの参加はしなかったが楽しかった
- 現場で役立つRuby on Railsパターン
- 実際に書いている人の生っぽい話
- 10人以上で数か月かけて開発し二年くらいはメンテナンスする、という想定
- こうするとコード運用がうまくいくというノウハウ
- Railsフレームワーク上に用意された「コードを書ける機会」がこれこれとあって、そのうちのどこにどんなコードを配置するのかをよく考える――というのはなるほどと思った
- 『エンタープライズRails』に学ぶ企業ユーザのためのRails活用の極意
- エンタープライズという視点ではRDBMSの機能を積極的に使う必要がある
- その事例を「エンタープライズRails」からいくつか引用して説明
- Railsの進化とは異った系統での知見に触れられる「素晴らしい本」なので買おう、と思った
- toRuby会議(?) - ソファで
- 咳さん、中内さん、YuzoさんとtoRubyの話題
- 今後のtoRubyを〜とか、勉強会は〜とか
- 教える・教わる、みんなでやってみよう、質問を作ってこよう、しゃべりたい人がしゃべる、など、各種の形態を考えてみては準備とか進め方とか雰囲気がどうなるか、なんてことなまったりと
- 関西のRuby勉強会って若い人が多いのかな?
- Lightning Talks
- いくつか興味を持った
- peeled unshiu - とりあえずさわってみたい
- Arabesque, a brand new Ruby queue - BDBを使ったqueue? 見てみたいと思ったんだっけど、どこかに出てるんだっけ?
- lang-8 - SNS自体はRailsなのかな?
- 懇親会
- 色紙とペンが配られる
- 互いにサインをもらっちゃいましょう、というのはあれだけ人が多いとなかなか面白いと思った(けっこうもらえた)
- いろんな人といろんな話; がんばって思い出してみる……
- 先日書いた勉強会ネタに興味アリという声をもらえた(ちょっとほっとした)
- ふつパイラ、RubyCocoa本の話など
- 末永さん、須藤さんとごあいさつ: rabbit.debどうしましょ→スポンサー探しましょ→groonga.debもいっしょにつっこみたい、とか
- 大場さんとごあいさつ: 小槌の話とか(あ、BookScopeも気になってたんだった…… 話を聞かせてもらえばよかった)
- kdmsnrさん、yharaさんとごあいさつ: blogとかいろいろいつも読んでます、みたいな
- 食べ物がたくさんあった(ただ甘い物はなかった)
あちことでコミッタをつかまえてはfingerprintを確認してもらった。みなさんありがとうございます。


