Ruby 1.9.1 の歩き方

はじめに

1 月 31 日に、ついに、 Ruby 1.9.1 がリリース されました。作業をされたみなさん、ありがとうございます。 このリリースは、1.9 系統初の安定版リリースです。 Ruby 1.9 については、 今号のるびまにもいくつかの記事 (Ruby M17N の設計と実装Ruby 1.9 で Web アプリを想定したベンチマークをとってみたRuby 仮想マシン・ガチンコバトル (2008 年 12 月版)) がありますが、 るびま以外にも多くの皆さんが記事を書いてくださっています。

Yuguiさんも、「Ruby 1.9 はそろそろ、普段のスクリプトに使う程度には耐えら れる動作安定性/仕様安定性になりました。あとはみんなが使ってくれないと改 善されません。」とおっしゃっている*1 ように、これからは皆さんにも Ruby 1.9 を使ってもらえるとうれしいです。 この記事では、 あわよくば読者の皆さんにも Ruby 1.9 系列を使ってみてもらえることを願って、 既に Ruby 1.9 系列を使ってみた皆さんの記事を紹介します。

これらの記事は、ささださんの呼び掛けに応じて、 1.9 Links に集められたものの一部です。 URL を追加してくださった皆さん、ありがとうございます。

(執筆・編集: zunda)

Ruby ユーザー向けの情報

松江 Ruby 会議 01 でのパネルディスカッションと ささださんによる Ruby 1.9 の紹介記事についてまとめたあと、 Ruby 1.9 でスクリプトを書く人や Ruby 1.8 のスクリプトを Ruby 1.9 に対応させる人向きの記事を紹介します。

松江 Ruby 会議 01 - パネルディスカッション - Ruby 1.9.1 と今後

http://www.ustream.tv/recorded/1116584

松江 Ruby 会議 01 に、Ruby 開発者の皆さんが集まり、 パネルディスカッションが開かれました。 ここから、Ruby 1.9.1 について、また Ruby 1.8 からの移行についての議論を まとめておきます。

Ruby 1.9 系列への移行

移行する時の手順。下記のようにすれば、 「誰でも比較的簡単に移行できるのではないかと思います。」

まず、Ruby 1.8.6 を使っているプログラムは、Ruby 1.8.7 に対応させる。 Ruby 1.8.7 で警告を表示するオプションをつけてプログラムを起動すると、 標準エラー出力などに、例えば、String#each や String#map など、 Ruby 1.9で動かなくなる機能について警告が出る。 それらについては、Ruby 1.9 でどうなっているかを調べて修正していく。 Ruby 1.8.7 には Ruby 1.9 の便利な機能を大胆に取り入れてある。

次に、このプログラムを Ruby 1.9.1 で実行しようとすると、 日本語を使っている場合には Syntax error が出る。 これを回避するために、マジックコメントを追加して、 文字列のエンコーディングを指定しないといけない。 指定していないと Ruby はスクリプトを US-ASCII として解釈してしまう。

次に、ブロックローカル変数に関連して、Syntax error が出る。これを直す。

プログラムが走るようになると、 文字列のエンコーディング関連のエラーやバグが出る。 このようなプログラムには、 従来から文字コード関連のバグがあった可能性があるのでよろこんで直す。

さらに、一部のライブラリが削除されたので、 それらに依存しているプログラムは動かなくなる。 削除されたライブラリはほとんど使われていないはずだし、 ほとんどには代替のものがあるはずなので、それを使ってほしい。

また、いままで依存していたライブラリが Ruby 1.9 に対応していない場合がある。 Ruby 1.8 系列と Ruby 1.9 の間でライブラリの API が変化したので、 バイナリのライブラリの場合は再コンパイルが必要な場合がある。 API の変化が大きすぎて再コンパイルできない場合は、修正して作者にパッチを送る。

Ruby の安定版と開発版

Ruby 1.8 までは、2 番目の数字が偶数なら安定版、奇数なら開発版だった。 Ruby 2.0 は、 いつか手に入る理想の Ruby としてバージョン番号を出し惜しんでいるので、 Ruby 1.9 については、1.9.0 が開発版、1.9.1 以降は安定版という位置付けになる。

このように、Ruby 1.9.0 と比較して、Ruby 1.9.1 は言語の仕様が 当面これで安定する、という段階に逹っした。 今後は、1.9.1 では、1.8 系列と同じくバグが発見されたらつぶすことになる。 実装の面でも、テストがだいたい通るまでの品質にできた。

Ruby 1.9.1 の言語仕様

Ruby 1.8 系列と比べて、最も大きい変化は、Multilingualization (M17N)。 これまでは、コードセット非依存な実装が可能かどうか疑問がもたれていたが、 Ruby では成功した。

ブロックローカル変数については、スコープが変更になったので、 Ruby 1.9 系列では動かなくなるプログラムがあるかもしれない。

この他、Hash に順序がついた、キーワードっぽい引数が使えるようになった、 「lambda」の代わりに「->」という記号が使えるようになったなど、 300 - 400 くらいの機能が追加された。

Ruby 1.9.1 の実装

コアのエンジンの部分をバーチャルマシンにして性能を向上させた。 文字列まわりには M17N で便利になった代わりに少し遅くなる部分もある。 パフォーマンスの特性が変わった。 「JRuby と同程度に Ruby 1.9.1 は速いので、適材適所で使ってみてください」 とのことです。

Ruby 1.9.1 のライブラリ

パッケージマネージメントシステム RubyGems やビルドシステム Rake が 標準添付になった。 有理数や複素数のクラスが組み込みになった。

この他、クリーンなテストライブラリ minitest、 Ruby プログラムのパーサ Ripper、素数を含めた数学関連のライブラリ、など びっくり箱のように楽しめる。 プロセスを、シェルを介さずに起動できる spawn 関数もうれしい。 Time がナノ秒を扱えるようになったなど、細かい変化もたくさんある。 ドキュメントに書かれていない機能を見つけたら、 ドキュメントを送ってもらえるとうれしい。 なるべくドキュメントを書くようにしているが、 忘れているものもあるかもしれないので。

RubyGems に対応したライブラリはたくさんあるが、 便利なパッケージは Ruby の実装のコアの部分を扱っているので 1.9 ではまだ動かなかったりもする。

Ruby 1.9.1 に期待できること

http://www.atdot.net/~ko1/activities/#idx12 (KyushuRubyKaigi00_ko1.pdf をご覧ください)

「Ruby 1.9 を最近使い出した newbie」ささださんによる、 「最新の Ruby の今」の紹介です。

  • 体制とか期待できるよ!
  • 便利な機能が期待できるよ!
  • 性能向上が期待できるよ!

というわけで、M17N 以外にも、Hash の拡張、Enumerator、 組み込みクラスやメソッドの変更、文法の変更、ライブラリの拡張、 Fiber のサポートなどについて網羅的に紹介されています。

使う人も迷ってる人も一度眺めておくといいよ。

ruby 1.9 を日常的に使うぼくが 1.9 の新機能を寸評する

http://d.hatena.ne.jp/ku-ma-me/20090126/p1

ku-ma-meさんによる「あとで読まれる」ための記事。 もう、1 年ちょっと Ruby 1.9 を使っているとのことで、 Ruby そのもののソースコードの美しさや、 マジックコメントなどの多言語化についてまとめていただいています。

ku-ma-meさんが好きな新機能ベスト 3 は

  • 遅延配列的な Enumerator の使い方
  • Array に新しく追加されたメソッド
  • 配列や文字列の省メモリ化

だそうです。『これらのおかげで、だいぶ関数型プログラミングがしやすくなっ たと感じてます。というか、ぼくが知ってる言語の中では「Haskell の次にリス ト処理がしやすい言語」です。』ほら、そこの関数型脳のみなさん。いかが?

Ruby 1.9.1 への移行挑戦の記録

http://d.hatena.ne.jp/nagachika/20090121#ruby_1_9_1_migration_try

nagachika さんの PB memo より、「仕事のプロダクトが 1.9 でどの程度動 くかまた挑戦してみ」た記録。仕事のプロダクトですよ!

コードにいくつかの修正をすることで、「とりあえず動いたかもという 状態にはな」ったとのことです。インパクトが大きいのは、やっぱり encoding 関連だったそうです。

  • とりあえず magic comment は全部つけておくのと、
  • IO.read 等で読み込んだ String に encoding が付くようになったことへの対応

が大切でしょうか?

「正直 1.9 系を本気でプロダクトで使ってリリースするのはまだ早いん じゃないかとも思いますが、…かねてから要望があったものの 1.8 では 実現の難しかった項目が解決 or 対応の可能性ができる」そうです。 というわけで、お仕事にお使いのみなさん、今なら「1.9.1 の正式リリー ス前に踏めるバグは踏んでお」けますよん…あ、正式リリースは過ぎち ゃいましたけど。

Ruby 1.9 をこれから使う人のための M17N まとめ

http://d.hatena.ne.jp/xibbar/20090126#1232946944

「東北の福島へ Ruby on Rails で U ターンしちゃいなヨ!」の xibbar さんが、 ご自身の仙台 Ruby 会議 01での 発表から M17N に関する部分をまとめてくださいました。

重要なこと

  • String のインスタンスが Encoding 情報を持つ
    • String を外部に保存する時には Encoding 情報を保存するかどうか決める
  • 既存のアプリを 1.9 に移行するときは外部エンコーディングを何にするか決める

この他、Encoding クラスについての解説や、 外部エンコーディングの設定の仕方もまとめてくださっています。 はい、みなさんご一緒に、「マジコメっといてくださいね。」

Ruby 1.9 に移行する際に注意すべき 10 のポイント

http://d.hatena.ne.jp/conceal-rs/20090119#1232348671

Rust Stnard さんが、 David A. Black さんによる 2009 年 1 月の記事 「10 things to be aware of in moving to Ruby 1.9」 を翻訳してくださいました。

「これは Ruby 1.8 のコードを Ruby 1.9 で動くようにするために必要な変更点であり, 知らなければひどい目にあいそうな事項のリストである」

  • String はもはや Enumerable ではない
  • ブロックパラメータの取り扱い
  • メソッド引数の「*」演算子の取り扱い
  • Hash が順序を持つようになった
  • メソッド名は Symbol で返るようになった
  • Symbol が String のようになった
  • Gem のパスがデフォルトでロードパスに入るようになった
  • 多くの列挙メソッドが Enumerator を返すようになった

「これらの変更に注意を払っていれば,…バージョン 1.9 やその先でも Ruby のファンでありつづけられるでしょう」とのこと。 がんばろー!

Ruby 1.9 の Symbol が String っぽい理由

http://d.hatena.ne.jp/rubikitch/20090126#1232964347

Ruby 1.9 に移行する際に注意すべき 10 のポイント」 のなぜ「Symbol が String のようになった」のかという疑問への、 rubikitch さんによる、回答。

『Ruby 1.9 ではメソッド名に限らず、ありとあらゆる「名前」が Symbol で返されるようになる』し、「動的にメソッド名を得たりとか」したい ので、致し方ない、とのことです。

Ruby に限らず、一瞬キモいと思ってしまう仕様変更って、 けっこうありますよね。

Racc と Ruby 1.9(.1)

http://d.hatena.ne.jp/hs9587/20090127#1233044886

ふだんは「Rubyで win32ole 経由で (Adobe) Illuistrator を自動操作」している hs9587 さんによる、Racc の Ruby 1.9.1 対応の記事です。

Racc 1.4.6 は Ruby 1.9.1 RC2 でちゃんと動いたとのことです。 すばらしい。

Ruby 1.9 移行のための簡易 lint を作ってみた

http://d.hatena.ne.jp/takehikom/20090129#1233169748

村川猛彦さんが、Ruby 1.8 と 1.9 の非互換生についての情報をもとに、 コードが Ruby 1.9 に対応しているか検証する 簡単なプログラムを作ってくださいました。

下記のいずれかに該当する Ruby スクリプト を指摘してくれるそうです。

  • マジックコメントがない
  • $KCODE を使用している
  • ASCII 以外の文字が含まれている
  • メソッド size, length を使用している.

これは便利そうです。

第 32 回 Ruby/Rails 勉強会@関西行って来ました

http://d.hatena.ne.jp/cyross/20090201#1233490888

「やっぱり Ruby は面白いですね」という cyross さんによる、 1 月 31 日に開催された 第 32 回 Ruby/Rails 勉強会@関西 の紹介と、cyross さんによる Fiber の紹介です。

Fiber の 3 つの特徴

  • 生成と評価開始が別
  • シンプル
  • 分かりやすい

をふまえて、Fiber のメソッドの説明とサンプルの動作の説明があります。

 require 'fiber'

で、更に細かい操作ができるんですね。

そういうわけで、「みんな Fiber 使おう!」

拡張ライブラリ開発者向けの情報

C のレベルまで潜って Ruby を楽しんでいる方向けの情報を紹介します。

Ruby の拡張ライブラリを 1.8 から 1.9 に移行しよう

http://d.hatena.ne.jp/hajimehoshi/20081116#1226822973

hajimehoshi さんによる、ライブラリ開発者のための情報です。

ライブラリを Ruby 1.8 と 1.9 の両方に対応させるには、 まず、Ruby 本体の 1.8 と 1.9 を共存させて、 Ruby 1.8 は 1.8 の最新版 (1.8.7) に移行する。 exconf.rb を編集して、 それから ruby.h 以外のヘッダーをインクルードしている時には、 パスを変更することになるそうです。

せっかく作ったライブラリです。これからも末永く使われるようにしよう!

以前の Ruby 1.9 に関する情報

Ruby 1.9.1 RC1 より前の Ruby 1.9 に関する情報を紹介します。 残念ながら、るびま編集には、ご紹介する記事に書かれた Ruby 1.9 の挙動を Ruby 1.9.1 で検証する余裕がありません。 ごめんなさい。

Ruby 1.8.7 で使えるようになった Ruby 1.9 のメソッドたち

http://d.hatena.ne.jp/rubikitch/20080508/ruby187

rubikitch さんによる記事。「Ruby 1.8.7 では Ruby 1.9 からの backport が とても多い。つまり、Ruby 1.9 のあのメソッドが Ruby 1.8 でも使えるよ うになったということだ!!」

2008 年 5 月の記事ですが、「数年以内に訪れるであろう Ruby 1.9 時代に備えて」 移行を始めるには Ruby 1.8.7 を使うのが良さそうです (Ruby 1.8.6-p287 以前と 1.8.7-p72 以前のバージョンには REXML の DoS 脆弱性があるので注意してくださいね)。 正直 Ruby 1.9 に移行するのはまだ早いかもしれないけれど、 将来「ぎゃっ」と言いたくないみなさんにお薦め。

Ruby 1.9.0 の m17n についてメモ

http://d.hatena.ne.jp/Gimite/20080101/1199199332

Gimite さんが、 文字列オブジェクトの振る舞いについてまとめてくださってます。 open の第 2 引数も大事だよね。

Ruby 1.9 の新機能を調べてみた

http://d.hatena.ne.jp/macks/20071216#p1

MATSUYAMA Kengo さんが、Ruby 1.9 trunk (r14828) で遊んでみてくださ いました。『「おっ」と思った点』として、いくつか挙げていただいています。

「単項演算子 ! がメソッド扱いになり、再定義できるようになった。」 のは…

 p !true  #=> true

とか楽しすぎますね。

Ruby 1.9 m17n リファレンス (不完全版)

http://d.hatena.ne.jp/macks/20080102#p1

Ruby 1.9 の新機能を調べてみた」 に引続き、MATSUYAMA Kengo さんによる M17N のまとめです。 Ruby 1.9 trunk (r14835) での、

  • コマンドラインオプション
  • マジックコメント
  • Encoding クラス
  • String クラス
  • Regexp クラス
  • IO クラス

についてまとめてくださいました。

Changes in Ruby 1.9

http://eigenclass.org/hiki/Changes+in+Ruby+1.9

eigenclass.org より、2007 年 10 月現在の ChangaeLog の、 英語での網羅的なまとめです。 さて、Ruby 1.9.1 との差はいかほどか!?

Rails 勉強会@東京第 25 回

http://wota.jp/ac/?date=20071216#p02

「The Kumagmatic Kumagrammers」っていうか 「ノk|*‘−‘)<ノリマツ!愛だよ、愛!」より、 2007 年 12 月の Rails 勉強会@東京第 25 回での、 ささださんの発表についてのまとめです。

  • Hash が内部的には全て OrderedHash になる
  • ブロック引数とメソッド定義の引数が同じになる

「こういうときに apt で 10 秒後には速攻で試せるのが Debian の魅力だ。」 そう、みんな試すんだ!

Ruby I18N

http://www.tbray.org/ongoing/When/200x/2008/09/18/Ruby-I18n

「ongoing」の、String@each_codepoint があるよ!っていう記事です。 コメントも興味深い。

Fun with Procs in Ruby 1.9

http://pragdave.blogs.pragprog.com/pragdave/2008/09/fun-with-procs.html

Dave Thomas さんによる、Ruby 1.9 の Proc オブジェクトについての記事。 curry メソッドを使うことで Proc オブジェクトをカリー化できます。

カリー化だけでも楽しいけれど、Proc#=== と組合せるとあら不思議! こんなマジックが Ruby 1.9 ではすぐに使えますよ。

Ruby 1.9 Standard Library Changes

http://pragdave.blogs.pragprog.com/pragdave/2008/04/ruby-19-standar.html

Dave Thomas さんによる、 2008 年 4 月現在の標準添付ライブラリの変更点についてのまとめです。 まだまだいろいろ変化していた時ですが、 「新しいイディオムによって、コードを書くことが、 ちょっとだけいままでよりも楽しいものになっていくのを見るのは愉快なことだ」 とのことです。うふふ。

Ruby 1.9 の Symbol#to_proc と (入ったばかりの) Proc のカリー化

http://www.infoq.com/jp/news/2008/03/to_proc-currying-ruby19

Werner Schuster さんの文章の、角谷 信太郎さんによる翻訳です。

Symbol#to_proc や、Proc#curry の追加による、 Ruby の表現の幅の広がりについての解説です。 「& 演算子は Proc オブジェクトをブロックへ変換し、 ブロックを Proc オブジェクトへ変換します。 この場合、& はシンボル :+ をブロックへ変換しようとします。」 こんがらがってきましたか?そんなことはない? そんなあなたには Ruby 1.9 の甘美な世界をどうぞ。

Ruby1.9.0-0 で増減したメソッド一覧

http://mono.kmc.gr.jp/~yhara/w/?Ruby1900MethodsBuiltin

yhara さんの Wiki サイト「Greenbear Laboratory」にある、 Ruby1.8.6-p111 と Ruby1.9.0-0 のメソッドとクラスの増減のまとめです。

Ruby 1.8 と 1.9 の両方で動くコードを書く時に不安があれば 確認してみるのもいいかもしれません。

「Ruby 1.9 を語る」 by まつもとゆきひろ - Ruby/Rails 勉強会@関西-21

http://mono.kmc.gr.jp/~yhara/d/?date=20071215#p03

yharaさんによる、2007 年 12 月 15 日の Ruby/Rails 勉強会でのまつもとさんの発表のまとめです。 「昨年の RubyKaigi2006 で、 2007 年のクリスマスリリースを発表」 …いろいろありましたよね。

 {1.8 => 安定, 1.9 => 革新, 2.0 => 人参}

というわけで、開発の基本方針についてまとめられています。

Ruby 1.9 を語る

http://www.rubyist.net/~matz/slides/kobe07/

まつもとさんによる、 2007 年 12 月 15 日の Ruby/Rails 発表のまとめです。

yhara さんによる記事 の元ネタでもあります。

「2007 年クリスマスリリース…ってもうすぐじゃんっ」

On The Horizon : Ten Things I like about Ruby 1.9 - O'Reilly Ruby

http://www.rubyist.net/~matz/20070627.html#p01

2007 年 6 月の、 On The Horizon : Ten Things I like about Ruby 1.9 より、まつもとさんによる、 Gregory Brown が Ruby 1.9 の新機能で好きなこと 10 選のまとめ。

まとめ

いかがでしたか?Ruby 1.9.1 を使ってみたくなりましたか?

この記事が、Ruby ユーザーの皆さんのプログラミングの助けになるとともに、 Ruby の発展にも寄与できるとうれしいです。