ruby

Ruby本、三冊

 
  • Ruby逆引きハンドブック
    Rubyの価値をも高めてしまう一冊。 イディオム(慣用句)や定番の書き方が分るので重宝する。 得られる知識についても大いに満足できる。 場合によっては、逆引きせずに頭から読んでいくのも有りではないか。 索引が強化されれば更に良い。
  • Rubyによるデザイン・パターン
    GoFをRuby色に染めるのが楽しい。 柔らかい口調と簡潔なコードに引き込まれる。 覚える気のしないRubyの機能であっても、この本を通すと面白さに気付いて試したくなる。 GoF(14パターン)に +αとして、DSL、メタプログラミング、CoC(設定より規約)が追加されているのも良い。
  • まつもとゆきひろ コードの世界
    Rubyの世界観を知ることができる。 本書自体はRuby本ではないのだろうが、必然的にコードの多くはRuby(期待通り)。 「この宇宙はなんでこんな風になっているのだろう?」の計算機バージョン。 序盤の似たような話が整理されれば更に良い。

まとめ

上記以外にも Rubyでつくる検索エンジン なんてのも出版されたばかりで、Ruby本のバリエーションが広がってきている。 こういった素晴らしい本が売れて、今後の出版に弾みがつくことを願う。 もちろん、楽しみたいから。

ハッシュのキーをプロパティに変換

 

JavaScript の場合は、次のように何もする必要がありません。

$ js
js> x = { 'foo': 123, 'bar': 456 } 
js> x.foo
123
js> x.bar
456

Ruby の場合は ostruct を使うのが簡単です。 ostruct については、 LukeSilvia さんが はてブコメントで教えてくれました。 どうも、ありがとうございます。

$ irb --prompt simple
>> require 'ostruct'
>> x = OpenStruct.new({ 'foo' => 123, 'bar' => 456 })
>> x.foo
=> 123
>> x.bar
=> 456

最初に書いたメタプログラミング版は、もはや使うことは有りませんが、 興味深いので残しておきます。

Google Analytics Data Export API

 

Google Analytics Data Export API が登場する前に書いた記事 「Google Analytics → POP3 → 独自レポート生成」 はメールベースだったこともあって、動いているのが不思議な状況でした。 早いところ API ベースに移行してスッキリしたいところです。

Client Libraries & Sample Code には GarbGattica という2つの Ruby ライブラリが紹介されています。 この2つの使い方を見比べてみて、エイヤッで後者の Gattica を試すことにしました。

内容は、2009年4月における「ブラウザ」と「OS」のシェアを報告するというものです。

Amazon Product Advertising API (認証対応)

 

Amazon Product Advertising APIの認証の件(zorioの日記)に、 シグネチャを計算するコードが載っていたので、 これを参考にしつつ本物のキーを使用してリクエストを発行してみました。

内容は、1回のリクエストで10個の ISBN-13 を送信して、 それぞれの書名を取得するというものです。

関数型 - Yコンビネータ

 
Yコンビネータのシナリオ:
  • Yコンビネータ(こんな感じのやつ → Y(F) = F(Y(F)) )を無心に写経する。
  • サンプルとして fact(10) を計算する。
  • 変数名としても関数名としても、fact の名を冠するものは登場しない。

関数型 - メモ化 Memoization

 

SICP Exercise 3.27.

メモ化のシナリオ:
  • 高階関数 memoize は、引数で渡された関数に対して、計算結果のキャッシング機能を追加する。
  • memoize の戻り値はキャッシング機能付きの関数で、これを変数 fib を通して使用する。
  • キャッシング機能によって、計算量の爆発が抑えられることを確認する。
  • 具体的には fib(1000) を計算する! これは、メモ化されていない fib(30) よりも遙かに速い。
  • 計算結果の桁数が200桁を越えるので、可能であれば多倍長整数を使用する。

関数の実行時間を計測するには?

 
  • 処理系で用意されている方法があるなら、それを使用する。
  • 無ければ、関数の実行時間を計測する関数 time を作成する。
  • 計測対象のサンプル関数として、フィボナッチ数を計算する fib を作成する。
  • 計測単位は、可能な限り秒(sec)とする。
  • 計測精度はミリ秒でもマイクロ秒でも構わない。

関数型 - イテレータ

 
イテレータのシナリオ:
  • 高階関数 myEach は、配列要素を1つ取り出すごとに、これを引数としてコールバックを行う。
  • 呼び出し側は、3の倍数を見つけたらプリントする。
  • myEach は、可能であれば組み込み型の拡張として実装する。 このとき継承は使わない。

処理系のインストール

 

記事で使用している処理系のインストール方法、 及びシェルの起動と終了について記載します。

関数型 - 無限リスト

 
無限リストのシナリオ:
  • 無限に続く奇数列 (1, 3, 5, 7, 9 ...)、odd を作成する。
  • 最初の10件を配列(リスト)に取り込む。

Ruby/GSL + NArray で気分は R

 

R のベクトル演算にはすっかり魅了されてしまいました。 関連して、繰り返し処理を守銭奴のごとくケチる、という考え方も気に入りました。

次の表は、Ruby で R 気分を味わうためにインストールするパッケージの一覧です。 ここに掲載しているラッパーは、いずれも NArray に対応しています。

ライブラリ ラッパー require 備考
NArray gsl 大規模な多次元数値配列を簡単かつ高速に処理
GSL Ruby/GSL 科学技術計算ライブラリ
GNU plotutils グラフ描画ライブラリ
FFTW3 Ruby/FFTW3 fftw3 2つのラッパーのどちらが良いか判断がつかないので、両方とも試せるようにする
Ruby-FFTW3 numru/fftw3
PGPLOT Ruby/PGPLOT pgplot グラフ描画ライブラリ

ライブラリ FFTW3 と PGPLOT については、それらのラッパーも含めて無くても一応の形が出来上がりますが、 ご利益がありそうなのでインストールしておきます。

ライブラリのインストールには yum コマンドを使用します。 また、ラッパーのインストールは、Ruby拡張ライブラリの標準的なインストール方法に従います(Ruby/GSLのみ微妙に異なる)。 このような定形作業を繰り返すだけなので、R のように yum コマンド一発でインストールというわけには行きませんが、難しくはありません。

学習計画書 - 数学

 

基本方針

  • どんどん寄り道しても良いから、楽しみながらゴールを目指す。
  • 寄り道先で何か大きなテーマを見つけた場合は、この計画書を破棄しても良い。
  • ゴールの期限を定めない。 ただし、前進していることを見える化することにより、小さな達成感を積み重ねる。
  • 楽しい!面白い!という感覚を維持する。 この感覚が失われた場合は、何か壁にぶつかっている可能性があるので手当てを要する。

学習計画

ランドマーク(テキスト) 備考
ゴール

スタート
Rによる時系列分析入門 モヤモヤしていた当面のゴールが時系列分析であることが分かりました。まずは、この本を読みこなすのに必要な項目を洗い出します(スタート)。
高地トレーニング プログラミングのための線形代数 Ruby と Gnuplot を使用しながら、(予定では)楽しく線形代数を学ぶことができます。 この本の教えに従って、岩場(本題でない難所)で怪我しないように進みます。
確率論へようこそ ポアソン近似、ランダム・ウォーク、マルコフ連鎖 などが面白そうなので買ってみました。
基礎体力養成 基礎数学のⅠⅡⅢ 何よりも綺麗で読みやすいのが良いです。ところどころに表計算実習やコラムがあって、楽しみの1つになっています。 本書に軸を置いて、分からないところは FTEXT などで調べることにしました。
基礎数学のABC
プログラミングR―基礎からグラフィックスまで 本書は、今年(2008年)発売されたばかりなのですが、出版元の九天社が倒産してしまって入手困難になっていました。 が、この度、改訂版がオーム社から発売されました。 学習計画の中では、唯一楽勝と思われます :-)

1分で試すフーリエ変換(FFT)

 

はじめに、2つの正弦波(100Hz と 150Hz)を合成します(上グラフ)。 次に、この合成された波形をフーリエ変換して、周波数成分を可視化します(下グラフ)。

このように、100Hz と 150Hz にピークがあることが分かりました。 それでは早速、実習に取り掛かりましょう。 使用する環境は次の3つから選んでください。

インストール - Ruby 1.9

 

Ruby 1.9 をインストールしました。 RPM を探したのですが見つけられなかったため、 ソース からのインストールです。

Ruby 1.9 のインストール

インストール方法は Ruby Install Guide::UNIX全般 に書かれている通りで、特に注意すべき点もありません。 インストール先はデフォルトの /usr/local が好都合なので configure のオプションも指定していません。

$ pwd
/usr/local/src/lang/ruby/ruby-1.9.1-p0
$ wget ftp://core.ring.gr.jp/pub/lang/ruby/1.9/ruby-1.9.1-p0.tar.bz2
$ tar xjf ruby-1.9.1-p0.tar.bz2
$ cd ruby-1.9.1-p0
$ ./configure 
$ make
$ sudo make install
$ make clean

Rubyシェルの動作確認

$ ruby --version                        # バージョンチェック
ruby 1.9.1p0 (2009-01-30 revision 21907) [i686-linux]
$ irb
irb(main):001:0> RUBY_VERSION           # バージョンチェック
=> "1.9.1"
irb(main):002:0> [1,2,3].map.with_index{|n,i| n*i}  # 1.9 の文法
=> [0, 2, 6]                            # OK!
irb(main):003:0> exit

Windows へのインストール

Windows にインストールする場合は、 WindowsにRuby1.9.1をインストールする (@IT) を参照してください。

ruby, map_with_index, select_with_index

 

Ruby の配列操作は神的ですが、 ときには map_with_index や select_with_index といったメソッドが欲しいと思うことがあるでしょう。 しかし、取り敢えずは、そのような冒涜的な考えを恥じるとともに、不本意な変数を1個追加して、each_with_index でその場をしのぐわけです。 しかし、そんな冗長なコードも、いずれはボディブローのように効いてきます。

あなたはほどなく、検索バーに「ruby map_with_index」や「ruby select_with_index」といったキーワードを打ち込みます。 そして次のページに掲載されているような数行の有益なコードを見つけることでしょう。

ところで、Ruby の配列操作は神的ではなかったのでしょうか?

あまり知られていない気がするのですが、 enum_with_index に map や select を連結することで、 map_with_index や select_with_index 相等の機能を実現できます (1.8系の場合は、require 'enumerator' が必要)。

  • [...].enum_with_index.map{|n,i|...}
  • [...].enum_with_index.select{|n,i|...}

さっそく、irb を使用して確認してみましょう。