Beautiful Code

著名なプログラマー達が,自分が今まで出会った中で”美しい”と思っているコードについて述べている本.人によって”美しい”の定義が異なるので,アルゴリズム,テスト,アーキテクチャ,並列処理など,内容が多岐にわたります.

自分が考える美しいコードとは,簡潔で,短く,容易に可読なコードです.本書でも,多くの方々が同様の意見を述べていましたので,抜粋してみました.

ロブは,さまざまな選択肢の中から,非常に小さいが,重要であり,うまく定義された,拡張可能な一群の機能を選択したという点で賞賛されるべきです.

ロブの実装それ自体も,コンパクトでエレガントで,効率的で,実用性があるという点で美しいプログラムの最上の例です.(p.3 Brian Kernighan)

コードを削ることで機能を追加しなさい.(p.40 Jon Bentley)

美しいコードは,理解が容易でなければいけません.開発者の言語知識をひけらかすために書かれたようなコードは,私は大嫌いですし,あるコードが実際に何をやっているのかを理解するために25行以上コードを読み進む必要があるべきではありません. (p.277 by Adam Kolawa)

要約すると美しいコードとは,短くて,明確で,質素で,現実を考えて書かれている物だと,私は信じています.(p.282 by Adam Kolawa)

私はコードをリファクタリングして追加した行数より削除した行数の方が多いとき,いつも得意な気分になります.(p.306 by Diomidis Spinellis)

Pythonを開発していて,最初はいろいろ最適化するのがよいと思ったけれども,結局は比較的素朴な実装の方が好ましい,と気づく場合がありました.要するに物事はシンプルに保っておくことが得な場合が多いのです.(p.310 Andrew Kuchling)

並列プログラムは非決定的に実行されるため,テストは困難であり,バグはほとんど再現できません.ですから私にとっては,美しいプログラムとは,単に明らかな間違いがないという物ではなく,明らかに間違いがないと一目でわかるような単純でエレガントなプログラムのことを言います(この表現はC.A.R.ホーアによるものです).(p.405 Simon Peyton Jones)

プログラムの美しさを構成する要素の一つは「簡潔さ」です.Paul Grahamもエッセイで「簡潔さは力なり」と語っています.ですから簡潔に記述できることはプログラミング言語にとって絶対の善なのです. (p.504 by まつもとゆきひろ)

それぞれ実際に言及している分野はばらばらなのですが,それでもほとんど同じことを言っていると思います.

取り上げられていたアルゴリズムで美しいと思うのはニ分探索 (binary search) です.しかし,これだけ単純で古いアルゴリズムでも,最近まで実装にバグがあったというのには驚きます.”Extra, Extra – Read All About It: Nearly All Binary Searches and Mergesorts are Broken – Google Research Blog”にその詳細が載っています.


1:     public static int binarySearch(int[] a, int key) {
2:         int low = 0;
3:         int high = a.length - 1;
4:
5:         while (low <= high) {
6:             int mid = (low + high) / 2;
7:             int midVal = a[mid];
8:
9:             if (midVal < key)
10:                 low = mid + 1
11:             else if (midVal > key)
12:                 high = mid - 1;
13:             else
14:                 return mid; // key found
15:         }
16:         return -(low + 1);  // key not found.
17:     }

上記のコード(元ブログから引用)の6行目 int mid = (low + high) / 2;でlow+highが231-1より大きくなるとき,符号が反転してmidがマイナスになります.そのため7行目の配列アクセスで失敗します.これを回避するためにはint mid = (low + high) >>> 1とすれば良いです.>>>は右シフト演算で符号を落とします.または明示的にunsignedで実装する必要があります.

その他にも,MapReduceなど,色々載っています.通して読むよりは,興味がある章を拾い読みするのが良いかなと思います.

Beautiful Code ビューティフルコード

ビューティフルコード (Theory in practice)

著者/訳者:Brian Kernighan Jon Bentley まつもとゆきひろ

出版社:オライリージャパン( 2008-04-23 )

定価:¥ 3,990

Amazon価格:¥ 3,990

大型本 ( 672 ページ )

ISBN-10 : 4873113636

ISBN-13 : 9784873113630


Beautiful Code ビューティフルコード
 
Tags: , ,

プログラミング言語Ruby

この本がPerlのラクダ本扱いになるのかはわからないですが,Rubyでプログラムを書いている人は一度目を通す価値ありだと思います.Rubyは使い始めてから結構年数が経ちますが,細部で知らないことが結構ありました.例えばcloneとdupの違い.対象がfreezeの場合,cloneはそのままコピーしますが,dupはfreezeを外します.また,cloneはオブジェクトの特異メソッドもコピーします.splat演算子というのも使ったことがないです.

Procとlambdaの扱いの違いも知りませんでした.returnやbreakなどの制御構文で違う動作をします.また,lambda はメソッド扱いなので引数の数が厳密にチェックされるそうです.Ruby1.9 にはlambdaかProcかを判別できるようにlambda?メソッドが追加されています.

Ruby1.9についてはまったく知らなかったので,かなり参考になりました.仕様としては,エンコーディングのサポートと,文字の単位がエンコーディング依存になるのが一番大きい変更のようです..lengthはバイト数ではなく文字数になります.逆にバイト単位用の仕様やメソッドも色々追加されています.その他,便利なメソッドが増えているようなので,一度標準ライブラリを確認し直した方が良さそうです.

プログラミング言語Ruby

プログラミング言語 Ruby

著者/訳者:まつもと ゆきひろ David Flanagan

出版社:オライリージャパン( 2009-01-26 )

定価:¥ 3,990

Amazon価格:¥ 3,990

大型本 ( 472 ページ )

ISBN-10 : 4873113946

ISBN-13 : 9784873113944


プログラミング言語Ruby
 
Tags: , , ,

Evernote APIのライブラリとサンプルはAPIのページからダウンロード可能です.サンプルはJava,Perl,PHP,Python,Rubyが用意されています.Rubyのサンプルはsample/ruby/EDAMTest.rbです.まず,EDAMTest.rbの13-16行目を,取得したAPI key,secret,開発サーバのユーザ名,パスワードで置き換えます.


consumerKey = "your-api-key-here!"
consumerSecret = "your-api-secret-here!"
username = "your-username"
password = "your-password"

次に,EDAMTest.rbの先頭にEvernote APIのライブラリのパスを追加します.


$:.unshift("../../lib/ruby/")

ライブラリにはバグがあるので以下のパッチを当てます.thriftのほうを直すべきだと思いますが,とりあえず動かすために.


--- lib/ruby/thrift/struct.rb.orig      2009-02-07 17:07:30.000000000 +0900
+++ lib/ruby/thrift/struct.rb   2009-02-08 09:40:56.000000000 +0900
@@ -97,11 +97,11 @@
         end
         iprot.read_struct_end
       end
-      validate
+#      validate
     end

     def write(oprot)
-      validate
+#      validate
       if oprot.respond_to?(:encode_binary)
         # TODO(kevinclark): Clean this so I don't have to access the transport.
         oprot.trans.write oprot.encode_binary(self)

--- lib/ruby/thrift/transport/httpclient.rb.orig        2009-02-08 09:46:12.000000000 +0900
+++ lib/ruby/thrift/transport/httpclient.rb     2009-02-08 09:46:53.000000000 +0900
@@ -19,6 +19,7 @@
     def flush
       http = Net::HTTP.new @url.host, @url.port
       http.use_ssl = @url.scheme == "https"
+      http.verify_mode = OpenSSL::SSL::VERIFY_NONE
       headers = { 'Content-Type' => 'application/x-thrift' }
       resp, data = http.post(@url.path, @outbuf, headers)
       @inbuf = StringIO.new data

後は,残りの必要なライブラリをインストールします.Ubuntu8.10だと以下のように入力します.


$ sudo aptitude install libreadline-ruby libhttp-access2-ruby

ここまで設定すれば,ruby EDAMTest.rbと入力することでサンプルプログラムが起動すると思います.
入力した文章を新しいノートとして取り込むという単純なプログラムです.

Evernote API   Ruby sample
 
Tags: , , , ,

Firefox 3 Hacks

Firefox 3 Hacksは前回のFirefox Hacksと異なり,全部日本人による書き下ろしだそうです.内容は,Firefox 3 の新機能や,新しいAdd-onについての解説となっています.Hack#26-27のJavascriptコードモジュールについての記事と,Hack#31-32のGoogle GearsとHTML5 DOM Storageについては,どうプログラムを書くかを知らなかったので勉強になりました.

本の前半はユーザ向けで,後半は開発者向けです.後半部分は,一度XULなどを使った経験があるほうが理解できるでしょう.

Firefox 3 Hacks

Firefox 3 Hacks ―Mozillaテクノロジ徹底活用テクニック

著者/訳者:江村 秀之 池田 譲治 下田 洋志 松澤 太郎 dynamis

出版社:オライリージャパン( 2008-08-27 )

定価:¥ 2,940

Amazon価格:¥ 2,940

単行本(ソフトカバー) ( 392 ページ )

ISBN-10 : 487311375X

ISBN-13 : 9784873113753


Firefox 3 Hacks
 
Tags: , ,

集合知プログラミング – Programming COllective Intelligence

この二日間、集合知プログラミングを輪講していました。この本、こんな名前ですが、要するにWeb上のデータを対象とした機械学習の入門書です。普通の入門書と違うのは、数式がほとんどなく、代わりにPythonのサンプルコードが大量にあることです。数式読むよりもプログラム読む方が理解しやすい自分には最適。実際、式はあってもそれを実運用のプログラムに落とし込むのは段階を踏む必要があるので、サンプルコードがたくさんあるのはありがたいです。

Pythonはほとんど触ったことがないのですが、結構わかりやすいですね。ライブラリの量はPerl未満Ruby以上のようなので、Python真面目に使ってみようかしら。インデントが意味を持つのはなかなか気持ち悪いですが。

集合知プログラミング   Programming Collective Intelligence

集合知プログラミング

著者/訳者:Toby Segaran

出版社:オライリージャパン( 2008-07-25 )

定価:¥ 3,570

Amazon価格:¥ 3,570

大型本 ( 392 ページ )

ISBN-10 : 4873113644

ISBN-13 : 9784873113647


集合知プログラミング   Programming Collective Intelligence
 
Tags: , , , ,