Java2Ruby本

読んだ。なかなか熱い本だった。Rubyより、というよりはJavaをほとんど知らない自分にとっては自分のRubyに対して感じているRubyの良さが率直に書いてあって読んでいて気持ちよかった。

例えば、Javaの現在の開発ではオープンソースの様々なツールやフレームワークを駆使するのが一般的であるのに、大学の授業ではJavaを教える割にはそこら辺に対して教えることもなければ、ポインタすら示さなかったりする。確かにSwingを使えば楽にGUIアプリが作れて手っ取り早いかもしれないが、Webベースのアプリを作る方がさらに手っとり早いし、実用的だと思う。おまけにJavaを教えられた生徒のほとんどは、最初にクラスを作らなければいけないことに戸惑って、プログラミングに苦手意識を持ってこの分野から遠のいていった。ということで大学にいたときはRuby教えれば良いのにと本当に思っていたりした。*1

JavaとLLという構図だとLLの良さが分かるようになっていたが、LLの中でもなぜRubyというところがもうちょっとしっかり読めればなお良かった。例えば、PerlにはCPANがあって移行してすぐにでも豊富なライraブラリを使うことができるし、PythonRubyよりも先発だけにRubyよりも有名なプロダクトは多いし、パフォーマンスも若干良かったりすることが多い。さらにはGoogleが使っている言語だけに、今後更なる期待ができそうと言った特徴がある中で、なぜRubyじゃなければいけないのかというところは少し弱かった気がする。個人的にはif文でdef文を分岐できたり、すべての式が値を持っていたり、値はすべてオブジェクトだったり、for文とかwhile文を使い分けなくてもeachだけでループを回せることなどが、ごく自然にできることがRubyの良さだと思う。標準のAPIも多すぎるというわけでもなくメソッド名も考えられているのですぐに使い方を覚えることができる。標準のAPIが使いづらいと感じたら使いやすくするためのメソッドを追加したりすることもできる。といったあたりのバランスの絶妙さ加減が自分にとってはRubyを使う理由なのかなと思う。(会社ではPerlだけど)

こういった読み物的なものは「人月の神話」以外には読んだことなかったので色々と刺激になりました。

JavaからRubyへ ―マネージャのための実践移行ガイド

JavaからRubyへ ―マネージャのための実践移行ガイド

*1:Rubyをやったからといってついて来れたとは限らないけど、irbを交えながらやれば少しはついて来れる人が多いのではないかと思う

Rubyクックブック

タイトル的にはレシピ本と同じようにもっとライトな感じの本かと思ったら案外そうではなくて非常に内容の濃い本だった。特に内容が今までに出版されている本とはほとんど被ってなくてこれは買いの本だと思った。内容的にはRHGを除いては現在出ている日本語のRuby本の中では最もマニアックでHack的だと思う(AWDwR本と同じぐらい)。それでもすべての例にコードも載っているし解説も詳しいので十分に読める。

個人的に一番の収穫だったのは、Highlineライブラリ。これを使うとパスワードの入力だとか、端末の出力に色をつけたりすることが簡単にできるらしい。

あとRakeの使いこなし方、Gemの作り方、RubyForgeの使い方などは今出ている他の本ではあまり説明されていないトピックなので非常に良かった。

他にも普段あまり自分が触らないようなことも色々書いてあって何度も読んで楽しめそうだなぁと思った。

邦訳版は内容が結構削られているのは少し残念だけど、それでも十分に読む価値のある本だと思う。

Rubyクックブック ―エキスパートのための応用レシピ集

Rubyクックブック ―エキスパートのための応用レシピ集

Kernel#dp

Rubyレシピブックのレシピ8.1をみて--debugオプションをRubyインタプリタの起動時につけると$DEBUGがtrueになるというのを知って、Kernel#dpとかKernle#dppとかKernel#dyとかが標準であれば良いのにと思った。こんな感じ。

module Kernel
  def dp *args
    p(*args) if $DEBUG
  end 

  def dpp *args
    require 'pp'
    pp(*args) if $DEBUG
  end 

  def dy *args
    require 'yaml'

    y(*args) if $DEBUG
  end 
end


hoge = %w(foo bar baz)

dp hoge
dpp hoge
dy hoge

ruby --debug ~として実行してやれば,

"foo", "bar", "baz"]
["foo", "bar", "baz"]
--- 
- foo
- bar
- baz

と出力される。

これなら誤って消し忘れたときにリスクがなくて良いなぁと思う。*1

追記

一応この方が尚よいかも。

module Kernel
  def dp *args
    if $DEBUG
      args.each do |arg|
        warn arg.inspect
      end
    end
  end

  def dpp *args
    if $DEBUG
      require 'pp'
      args.each do |arg|
        warn arg.pretty_print_inspect
      end
    end
  end

  def dy *args
    if $DEBUG
      require 'yaml'
      args.each do |arg|
        warn arg.to_yaml
      end
    end
  end
end

*1:確かにpやppでも消せば問題ないのだけど人間消し忘れてしまうものなので…