ちょっと必要に駆られて、 Wormhole というライブラリを書きました。

350px-Worm3.jpg

インストールはGitHubから行えます。

   1  sudo gem sources -a http://gems.github.com
   2  sudo gem install genki-wormhole

メソッドの内部を実行中に、呼び出し元に一旦処理を戻し、 中断した場所から処理を継続する機能を提供します。

例えば、以下のようなプログラムに対して、

   1  require 'rubygems'
   2  require 'wormhole'
   3  
   4  def foo
   5    puts "foo"
   6    Wormhole.throw :foo => 'hello' do |data|
   7      puts data[:foo]
   8    end
   9    puts "bar"
  10  end
  11  
  12  Wormhole.catch do
  13    foo
  14  end.return do |data|
  15    puts data[:foo]
  16    data[:foo] = 'world!'
  17  end

結果として、以下のような出力を得ます。

   1  foo
   2  hello
   3  world!
   4  bar

処理を中断したいところで Wormhole.throw を呼び出して、 外側から Wormhole.catch で受け止めます。 catchが完了したら、Wormholeオブジェクトが返るので、 returnで中断箇所に戻ります。 Wormhole.throw はHashを受け渡すことができます(省略可能)。 また、catchブロックとreturnは上記の例のように続けて記述します。 catchの戻り値を適当な変数に代入して、後でreturn を呼び出すことも可能ですが、その場合、catchを抜けた直後から returnを呼ぶまでの区間が二度実行されてしまいます (この辺が最初に例外を使って実装してた理由ですね)

中断箇所から処理を再開するために callcc を使っています。 callccは面白いですね。

更新履歴

  • 2008/7/4 例外処理をやめてthrow/catchを使うようにしました。それにあわせて本文を修正しました。
posted by Png genki on Thu 3 Jul 2008 at 20:06 with 5 comments

以前笹田さんに、procのソースが見たいとお願いしてみたことがあったのですが、 それをRubyコードレベルで実現するライブラリを見つけたので紹介します。

proc_source.rb

I wrote this a while ago and it works by extracting a proc's origin file name and line number from its .inspect string and using the source code (which usually does not have to be read from disc) -- it works with procs generated in IRB, eval() calls and regular files. It does not work from ruby -e and stuff like "foo".instance_eval "lambda {}".source probably doesn't work either.

オリジナルはメールの添付ファイルとしてくっついているので、ソースを見たい場合は こちらから見るといいかもしれません。

使い方はこんな感じです、

   1  code = proc{puts "Hello World"}
   2  puts code.source #=> puts "Hello World"

これは久々に面白いものを見た気がします。

posted by Png genki on Thu 3 Jul 2008 at 13:43

長い時間がかかるテストを実行してる間に。 もはやテストがない開発なんて考えられないけれど、 テストの実行時間が昔のコンパイル時間のように感じられます。

ちょっと前にデスクトップPCがPCの主流をノートPCに譲ったように、 iPhoneのようなモバイル端末がノートPCに取って代わるのは時間の問題であるように思います。 このような世代交代は、かつて人類が何度も経験してきたことであり、 ことコンピュータに関する限り、プログラマーという人種は最先端のデバイスを使いこなしてきたのですが、今回の大波を乗りこなすのはちょっと大変なんじゃないかと思っています。

モバイル端末の小さなキーボードや、iPhoneのようなソフトウェアキーボードにしても、どうにもこうにもプログラムを書くには不便すぎるのです。 プログラムを書くための環境は、デバイスの進化の本流から零れ落ちてしまうのでしょうか。

その昔、プログラマーがパンチカードを捨てて、キーボードによるプログラミングを覚えて以来、長いことお世話になってきたキーボードが、 プログラマーを椅子に縛り付ける鎖となってしまうのかもしれません(ノートPCがあれば多少は動けるでしょうが、iPhoneの機動性とは比べるべくもないですね)

そうならないようにするためには、モバイルキーボードに特化した言語を考える事も意味があるかもしれません。例えば、10個のアルファベットからなる英語のサブセットみたいなものを考えたら良いでしょうか?(Brainf*ckよりもっとフレンドリーなものを希望) それとも記号をなるべく使わないプログラミング言語を考えたら良いでしょうか。

あるいは、キーボードではない入力方法でコーディングをする事を考えるべきでしょうか。図形を並べるようなプログラミング手法をGUIで行うようになるのでしょうか。

はたまた、プログラムを作るためのデバイスと、プログラムを使うためのデバイスは、永久に袂を分かつ事になるのでしょうか。

posted by Png genki on Mon 30 Jun 2008 at 18:39

このブログシステムは、今までmongrel_clusterで動かしていましたが、 passenger-2.0.1に移行しました。

特に不具合もなく動いているようです。 また、今までmemcache-clientの挙動が安定していなかったのですが、 なぜかpassengerにしたら解決。

posted by Png genki on Sun 29 Jun 2008 at 03:59

RubyProfを使って、Railsアプリのプロファイリングをする方法を紹介します。

まずは、ruby-profをGemでインストールします。

   1  % sudo gem install ruby-prof

インストールが完了したら、ruby-profプラグインをRailsアプリにインストールします。 ruby-profプラグインは、Gemがインストールされたディレクトリの下にあります。 環境によって場所は変わりますが、例えば/usr/local/lib/ruby/gems/1.8/gems/ruby-prof-0.6.0/rails_plugin/ruby-profなどの場所にあります。

これをvendor/plugins/ruby-profにコピーすれば設定は完了です。

あとはproduction環境でRailsアプリにアクセスすると、以下のようなログが出力されます。

   1  Thread ID: 3076980460
   2  Total: 2.030000
   3  
   4   %self   total   self   wait  child  calls  name
   5   20.20    0.80   0.41   0.00   0.39   1649  Array#each_index
   6    8.87    0.25   0.18   0.00   0.07 106376  Kernel#===
   7    3.94    0.11   0.08   0.00   0.03   3044  <Module::Marshal>#load
   8    3.94    0.08   0.08   0.00   0.00  26468  PGresult#type
   9    3.45    0.21   0.07   0.00   0.14   3044  <Class::Thread>#exclusive
  10    3.45    0.07   0.07   0.00   0.00 106761  Fixnum#==
  11  (** snip **)

See Also

posted by Png genki on Sat 28 Jun 2008 at 18:11

GitHubで公開されているRailsプラグインをインストールする方法のメモです。

ここでは例としてexception_notificationプラグインをインストールしてみます。 とはいっても特に変わった事をする必要があるわけではなく、 SVNリポジトリからインストールするのと同様に、GitHub からプラグインのURIを調べてきて、以下のようにインストールします。

   1  % ./script/plugin install git://github.com/rails/exception_notification.git

これでOK。 きちんとGitHubからcloneしてきたプラグインディレクトリの.git ディレクトリを削除してくれます。

posted by Png genki on Wed 25 Jun 2008 at 00:14

さて、今回はyuguiさんの「初めてのRuby」の紹介です。

初めてのRuby
初めてのRuby
posted with amazlet at 08.06.24
Yugui
オライリージャパン
売り上げランキング: 897

本書は、プログラミング経験者向けに書かれたRubyの入門書(嬉しい1.9対応)です。 僕のようにRailsからRubyに入った人にもお勧めです。 200ページ前後と手ごろなボリュームで、浅いところから深いところまで、Rubyに関する一通りの事がわかりやすくまとまっているので、頭から最後まで通して読むのがいいと思います。

時空を超えて、3年前の自分に一冊だけRubyの本を送れるとしたら、 本書を選びたいですね。

posted by Png genki on Tue 24 Jun 2008 at 00:58

RubyKaigi会場にて、もろはしさんから、はてなスターを連打できないのはけしからんという訓示をいただきましたので、cuzicさん主催のHackathon会場からささっと対応してみました。

とはいっても、CSSで以下のようにRtoLのDirectionを指定しているだけです。

   1  .star{unicode-bidi: bidi-override}
   2  .star{direction: rtl}

追記

沢山ついたStarが数字で省略された場合に、 数字部分が左右反転されてしまうと都合が悪いので、 さらに以下のようなCSSを記述しました。

   1  .hatena-star-inner-count {unicode-bidi: bidi-override}
   2  .hatena-star-inner-count {direction: ltr}

posted by Png genki on Sun 22 Jun 2008 at 00:08

Ruby会議2008の会場で利用するためにマイナーチェンジしたvimouse Ruby会議2008 Editionをリリースいたします。

vimouse 1.1 setup.exe

以前のバージョンからの変更点

  • vimouseモードへの切り替えHotKeyが、Ctrl+;から変換キーに変わりました

よろしくお願いします。

See Also

posted by Png genki on Fri 20 Jun 2008 at 17:54 with 1 comment

Ruby会議2008会場より

P1000166.JPG

Rails勉強会ブースの片隅より撮影

posted by Png genki on Fri 20 Jun 2008 at 13:35