たのしいRuby 第18章 Ruby落ち穂ひろい

いよいよ第4部「Rubyを使いこなそう」に入ります。今までは定義されたクラスを使う側。ここからはクラスを作る側。同じようで全然違う。今まで@が全然出てきません出したが、ここからバリバリ@を使っていくことになると思います。一気にレベルがが上がるので、ここからは章を分割してお届けするかもしれません(未定

では、18章に入っていきます。

コマンドラインオプション

エディタ側と上手く連系出来るようになる必要がありそうです。僕はmake好きなので、キーに保存してmakeを割り当ててます。Makefileが無い場合は、ruby -w -Ku [スクリプトファイル]が実行出来るようになってます。

コマンドラインオプションは深いっす。言語編を熟読しないと・・・。

ワンライナ

ruby一行野郎も深そうです。一行野郎好きなのでこのあたり楽しいっす。

% ruby -e '1000.times {printf "%04d\n",rand(10000)}' 
8881
5951
0978
9698
7307

ソートのテストで使うと便利かも。イテレーターの威力は絶大ですねぇ。

外部実行

irbでちょっとした作業をするときは便利に使えそうです。

irb(main):001:0> print `ls`
args.rb
balanced.rb
...(略

cdは使えませんでした・・・。シェル組込みなので当然といえば当然か・・・。

組込み変数,環境変数

かなり重要度なところ。ひとつづつ確かめておくと後で使えそうです。

irb(main):023:0> pp ENV
{"SSH_AGENT_PID"=>"3185",
 "HOSTNAME"=>"localhost.localdomain",
 "GPG_AGENT_INFO"=>"/tmp/gpg-cR77D7/S.gpg-agent:3237:1",
 "SHELL"=>"/bin/zsh",
 "TERM"=>"xterm",

環境変数ENVはCGIで使いそうですね。モジュールがあるので直接参照することは殆んど無いと思うけど・・・。

DATA

テストプログラムを書いているときは絶大な威力を発揮しそうです。

__END__以降の文字列がDATAに入って処理されます。

DATA.each do |line|
  print line
end

__END__
テスト中の文字列
ホントに動いているのか!?

いちいちコマンドラインオプションを書かなくて済みますねぇ〜。活用しよう。

...(続く

だけでドンドン補完できてしまう。macのTextMateのエミュレーター - snippetsEmu.vim

RoRの15分ムービーで使われているTextMateのsnippetsもどきなvimプラグインsnippetsEmuより。

Vimだけでドンドン補完できてしまう。macTextMateエミュレータープラグインが登場した。

snippetsEmu - An attempt to emulate TextMate's snippet expansion : vim onlineからダウンロードして、以下を実行〜

% vim -c 'so %' snippetsemu1_1.vba
:q

インストールはこれだけでいい。何故か/.vim/after/以下にインストールされる。

使い方は至ってシンプル。

cの場合は、

Inc<tab>stdio.h<tab>main<tab>printf<tab>Hello, Snippet!!<tab><tab>

すると・・・。

#include <stdio.h>
int main (int argc, char const* argv[])
{
printf("Hello, Sinippet!!\n");

return 0;
}

ここまで書き上がって上がってしまう。文字を書いてを押せば、どんどん書き上がっていく。後は=で整形すれば完了〜。

snippetの中身は、単なるマクロファイルなので、

:Snippet trigger_name The cursor will be placed here: <{}> Trailing text

こんな感じでガリガリ登録していけば、trigger_nametrigger_nameだけで何でも出来てしまうというシンプルさ。

ちと、snippetsEmu.vimを追いかけます。詳しいのはまた今度ということで〜。

インデント部分にバグがあるっぽい・・・。=必修。

たのしいRuby 第17章 時間関連クラス

Ruby漬けのGWも残り僅かで〜す。「この本の半分くらい終わればいいかなぁ」と、思っていたのですが、学習効率の高いirbのおかげで、案外順調に進んでます。

第三部最後の章。時間関連クラスに入ります。ワンライナ的な所なのでirbでいきたいと思います。

謎。

ふふ。早速謎の構文。

p Time.mktime(2006,5,15,05,13,11)
#=> Mon May 15 05:13:11 +0900 2006

よく見ると"05"となってます。確認します。

p 012345
#=> 5349

サンプルは8進数で書いてありますね・・・危険です。罠です。

では、"09"にするとどうなるか。

p Time.mktime(2006,5,15,09,13,11)
#=> SyntaxError: compile error

SyntaxErrorです。案外やってしまいそうなので、注意が必要かと思います。

8進数ついでに、もう一個確認しておきましょう。

p "012345".to_i
#=> 12345

文字からの変換は10進数になりますね。Linuxな世界では8進数を多用するので、罠に注意です。パーミッションの755も8進数です。

Time,DateTime,Date

Rubyでは3つの時間の表し方があるようです。

Time.now
#=> Sat May 05 17:21:28 +0900 2007
DateTime.now
#=> #<DateTime: 212045113299867697/86400000000,3/8,2299161>
Date.today
#=> #<Date: 4908451/2,0,2299161>
  • Time.now + 1は1秒足す
  • DateTime.now + 1は1日足す
  • Date.today + 1は1日足す

内部実装が違うので注意が必要です。

2038年問題

Timeは2038年までしか扱うことが出来ない。時間を32ビットで表しているため桁が溢れてしまう。詳しくはwikipediaを。

深刻です。コンピューター史上最悪の年となるでしょう・・・。

Rubyの場合、RangeErrorが発生しますね。

Time.now + 1_000_000_000
#=> RangeError: time + 1000000000.000000 out of Time range

時間の扱いも罠がいっぱいです。恐いっす。深刻っす。

練習問題

最後の練習問題はムズいっす。

  1. 逆で解いてしまった・・・反省。String#scanの使い方が非常に参考になります。
  2. ls_tを作れという問題。全然わかんなかった。Hashを使って上手く解いてます。
  3. 最後は超難問。カレンダーを作る。何処かで作った記憶があるけど、こんなにスマートには解いてなかった。

練習問題をきっちりやると力が付くはずですが、サボっちゃいました(汗