春鳥 -ハルドリ-

2011年1月~6月

2011-03-21(MON)

いつもどおりに。

Ruby楽しい、超楽しい。Rubyにもだいぶん慣れてきました。ちょっとしたコードを書くだけで、欲しい情報を手に入れられるのは、とても気分がいいです。

最近やった事例だと、「ある日付の範囲から、ある条件を満たす日数を知りたい」というのがありました。例のため、「ある日付の範囲」を「2011年01月01日から今日まで」、「ある条件」を「土日だけ」とすると、以下のようなRubyコードになります。

require 'date'
count = 0
(Date.new(2011,01,01)..Date.today).each do |d|
   count += 1 if d.saturday? || d.sunday?
end
puts count

これだけです。ためしに、サクラエディタの起動から、結果出力までの所要時間を測ってみたら、1分ちょいでした。C++やC#だと、IDEを立ち上げて、プロジェクトを新規作成して、「えぇと、まずは何を#include(using)すればいいんだっけ?」と思っている間に、書きあがってしまうくらいの時間です。

なんというか、Rubyのおかげでプログラミングの楽しさに改めて目覚めた気がします。でも、やっぱり、一番好きな言語はC++です。STLとBoostの絶妙な難解さが心地いいのです。

1冊3000円と見積もると……などと考えてはいけない。

会社と部屋に置いてある本を一覧にしてみた。学生時代に買った本も混じっているけど、ほとんど就職してから買ったものです。最近の購入物は、『レガシーコード改善ガイド』、『諸説 正規表現 第3版』、『Effective C# 4.0』、『プログラミング .NET Framework 第3版』、『C#ショートコードプログラミング』の5冊。まとめ買いしすぎた……。

購入ペース>>読書ペースだから、読了率は全体の6割くらい。家ではあまり読む気にならないので、会社の休み時間にちまちまと読んでいます。

2011-02-10(THU)

素敵な数、略して素数。

久々に、Project Euler。間をすっ飛ばして、いきなりProblem 10。せっかくなのでRubyで解いてみましょう。

まず、「Rubyなら標準添付ライブラリで、素数を何とかしてくれそう!」という発想で、「Ruby 素数」で検索。案の定、素数を見つけてくれるPrimeクラスがいることがわかりました。Primeは、require 'mathn'で使えるようになります。また、Prime.each(n)で、n以下の素数を求めつつ、n以下の素数の数だけ処理を繰り返すことができるようです。……、素数を計算して求める必要がなくなった時点で、もはや答えが出たも同然ですが……、もう少し調べてみましょう。

「合計」を求めるには、Enumerable#injectが使えそうです。書き方は色々ありますが、[1, 2, 3, 4, 5].inject(:+)のような簡潔な書き方で、「列挙可能なもの」の合計を求めることができます。

さらに掘り進めていきます。書籍『初めてのRuby』によると、Ruby1.9からイテレータをブロックなしで呼び出すと、Enumeratorオブジェクトを返してくれるようになったそうです。どういうことかというと、[1,2,3].each {|n| puts n}も、[1,2,3].each.each.each {|n| puts n}も、結果は同じで有効なRubyコードってことです。

出口が見えてきたので、最後にRubyのコマンドラインオプションをざっと眺めてみましょう。-rを渡すと、スクリプトの実行前に指定したライブラリをrequireしてくれます。requireは、C言語の#includeみたいなものです。また、-eを渡すと、コマンドラインに書かれたスクリプトを実行してくれます。なお、このときのスクリプトは、引用符でくくってやる必要があります。

前置きが長くなりましたが、以上のことを踏まえて、Problem 10を解くと以下のようになります。

ruby -r mathn -e "puts Prime.each(2000000).inject(:+)"

とても素敵なワンライナー。嗚呼、なんて簡潔でパワフルな言語なんだろうっ!

まぁ、答えの出力には10秒近くかかりますが、このコードのシンプルさと引き換えですね。

2011-02-06(SUN)

Rubyを使い始めてみた。

製品プログラムに喰わせるデバッグ用のファイルを生成したり、製品プログラムの吐いたファイルを解析したり、と自分がちょっと楽する目的でちょろちょろと。読める人が自分以外にいないから、使いどころが難しいですね……。他人が保守するものには、今のところ使えないのが残念です。

スクリプトを書くときには、とにかく気楽に使うことを最優先にしているので、IDEは使わず、使い慣れたサクラエディタを使っています。「外部コマンドの実行」機能で、結果を出力できるのが非常に便利。あと、サクラエディタには、Ruby用の設定があるので、それを使えるようにして、いつの間にやら覚えた正規表現を使って色づけを自分好みにカスタマイズしています。

はじめは恐る恐る触っていましたが、慣れてくるととても気持ちよく使えますね。最近は、irbを高機能な電卓代わりに使っています。変数が使えるから、計算結果をとっておけるのがいいところ。

また、C#で便利だと思っていた、yieldも使えるので、反復処理の結果を配列に入れることなく返すこともできます。yieldは、CやC++では簡単にマネのできない仕組みなので、使っているとワクワクしますね。以下、サンプルコードです。

def value_hex(num)
  num.times do |val|
    yield [val.to_s, "0x" + val.to_s(16)]
  end
end

value_hex(16) do |val, hex|
  puts val + " : " + hex
end

実行結果は、以下のとおり。

0 : 0x0
1 : 0x1
2 : 0x2
3 : 0x3
4 : 0x4
5 : 0x5
6 : 0x6
7 : 0x7
8 : 0x8
9 : 0x9
10 : 0xa
11 : 0xb
12 : 0xc
13 : 0xd
14 : 0xe
15 : 0xf

value_hexは、num回処理を繰り返しながら、文字列に変換した繰り返し回数とその16進数表記を配列に入れて返すブロック付きメソッドです。

value_hexを使っているところでは、value_hexの返してきた回数と16進数表記の文字列配列をvalとhexに展開して、それを「 : 」で区切って出力しています。

ちなみに、上のような使い方の場合であれば、value_hexの戻り値の配列を展開する必要もなく、配列のまま受け取って、joinメソッドでつなげて表示することもできます。

value_hex(16) do |val_hex|
  puts val_hex.join(" : ")
end

2011-01-05(WED)

まちどおしい

『ゼノギアス』フル・オーケストラアレンジ(注意:音が出ます)

これは買うしかない!人気投票で選ばれただけあって、選曲も良いし。中でも、「風が呼ぶ、蒼穹のシェバト」は、僕が初めてゲーム音楽を音楽として認識した思い入れのある曲。発売が楽しみだ。

ほんとにない。どこにもない。

モンハン3rdの影響で、関東一帯でPSPが品薄状態らしい。モンハン3rdを買うついでにPSP-3000に買い換えようと思っていたのに……。こんなことなら、香川で買っておけばよかった。

今日も会社の帰りに、電器屋、ゲームショップをいくつか巡ってみたけど、中古すら置いてありませんでした。すごいな、これは。

2011-01-03(MON)

あけましておめでなう

冬休みだし、気になってたLispについてちょっと知っておこうと思って、ポール・グレアムさんの書いた『ANSI Common Lisp』を読み始めました。序盤から出てきた、car(リストの最初の要素を取得)とcdr(リストの最初以外の部分を取得)というのが、「すべてがリスト」のLispならではの考え方で面白いです。Lispのコードを見たときの恐怖感がやわらいで、読めるようになってきたのがちょっと嬉しかったりします。

このLispもRubyと同じく、仕事で使うことはなさそうですが、色んな言語の文化を知ることはコードを書く者としてのたしなみだと思うので、今後も続けていきたいですね。今のところ、「使える」と公言できる言語は、C、C++、C#、C++/CLIとCの付く言語ばかり。VBは使わな過ぎて忘れました。Rubyはまだまだ学習中。

職業は自称……

地元に帰ると人から「仕事は何やってるの?」と聞かれることが度々あります。業務内容的には「SE」と名乗るのが適切なのかもしれませんが、「SEって何?」と聞かれるのが面倒なのと、「SE」という言葉が何故か好きじゃないので、パソコンを知っていそうな人の場合は、「プログラマ」と名乗ることにしています。あと、「ソフト屋」という言葉が一番しっくりくるので、仲間内ではこれを自称することが多いです。

で、ここからが問題なのですが、祖父(元大工)に、自分の仕事をなんと説明すればいいのやら。「機械の中身をつくる仕事」ということにしていますが、機械組み立ての仕事と勘違いされています……。

「コンピュータを知らない人間に、プログラマの仕事内容を30文字以内で説明する。」という仕様で、誰か答えを実装してくれませんか。