春鳥 -ハルドリ-

2011年7月~12月

2011-11-30(WED)

楽しいよぅ、楽しいよぅ。

超久しぶりに仕事でプログラミング中。やっぱり、自分でモノを作るのが一番楽しいですね。ベースになるのがVS2008 + C++/CLIで書かれたフォームアプリケーションである点が残念ではありますが。

<グチ>C++/CLIは、ネイティブなプログラムとマネージドなプログラムの橋渡しをするためだけに使用するべきであって、.NETアプリを書くならC#を使えと。LINQも、型推論も、(.NET対応の)ラムダ式も、(.NET対応かつTR1を含んだ)STLも無く、開発環境のリファクタリング機能も使えないっていうのは、あまりにもメンドクサイ。何?縛りプレイなのコレ?</グチ>

で、超久々にコードを書いているのですが、ここ最近C++0x(C++11)とRubyで遊んでいたおかげで、ActionFuncを引数に取る高階関数っぽいものを頭をひねらずに書けるようになっていたことにうれしくなりました。当然、読む人のことを考えて、使用は最小限に抑えて、コードの意図をコメントで補足するようにはしていますが……。また、テンプレートがマネージドなクラスにも適用できることに感動して、その辺でもゴニョゴニョと愉快なコードを書いています。.NETのジェネリクスは、C++のテンプレートに比べて制限が多くて使いづらいんですよねぇ。

2011-08-28(SUN)

あたまのたいそう。

RubyでDSLっぽいものを書いていたとき、思いついたのでメモ。

以下のような形式で「存在しないメソッド」を呼び出したとき、そのメソッド名と引数を文字列で取ってくる、ということをしたいと思いました。

class C; end

c = C.new
c.xaaa 123, 456 #=> "xaaa 123,456"
c.+aaa 123, 456 #=> "+aaa 123,456"

4行目は、method_missingだけで実現可能ですが、5行目のようにメソッド名の頭に「+」が付いているのは少々厄介です。Rubyでは、「+」もただのメソッドに過ぎないので、オーバーロードは簡単にかけます。しかし、「+」から始まる名前をメソッド名にすることはできません。

class C
  def +(rhs)
  end
  def +aaa(rhs) # syntax error
  end
end

よって、最初の例の5行目は、Rubyからすると以下のようなメソッド呼び出しに見えます。

c.+(aaa(123, 456))

つまり、aaaというメソッドは、class Cの中ではなく、トップレベルで定義されていなければなりません。

こんなとき、sendを使うとあたかも、class Cの中に「+」から始まるメソッド名があるように振舞わせることができます。さらに、const_missingを使えばメソッド名に大文字を使った場合も、括弧を省略することができます。

def method_missing(name, *args)
  result = name.to_s
  if args != []
    result += " " + args.map{ |a| a.to_s }.join(",")
  end
  result
end

class Object
  def self.const_missing(name)
    name.to_s
  end
end

class C
  def +(name)
    send("+" + name.to_s)
  end
end

#以下、使用例
c = C.new

c.+aaa          #=> "+aaa"
c.+aaa?         #=> "+aaa?"
c.+aaa 123, 456 #=> "+aaa 123,456"
c.xaaa 123, 456 #=> "xaaa 123,456"
c.+AAA          #=> "+AAA"
c.+AAA?         #=> "+AAA?"
c.+AAA 123, 456 #=> "+AAA 123,456"
c.XAAA 123, 456 #=> "XAAA 123,456"

+から始まり、かつ、引数付きの場合は、method_missingが2段階に呼ばれることに注目。なかなか、気持ち悪くて面白い。

2011-08-07(SUN)

Rubyの柔軟性と.NETのパワーが両方そなわり最強に見える。

Visual StudioでIronRubyを使った開発ができるようになっていました。やり方は、Microsoft Visual Studio 2010 Shell (Integrated) 再頒布可能パッケージをインストールしておいて、IronRubyをインストールするだけ。

以下は、IronRubyで.NETのメッセージボックスを呼び出すサンプルコードです。

# -*- coding: sjis -*-

require 'System.Windows.Forms'
include System::Windows::Forms

MessageBox.show("はろぅ")

requireで使いたいアセンブリ(dll)を指定しています。これは、C#の場合だとVisualStudioのソリューションエクスプローラで「参照の追加」をしたのと同じことです。下のincludeがC#でいうところのusingに相当するものになります。これをしないと、最後のメッセージボックスの呼び出しは、System::Windows::Forms::MessageBox.show("はろぅ")という長ったらしいものになります。requireincludeで「.」と「::」を使い分けないといけないのがなんとも気持ち悪いですが、気にしないようにしましょう。

あと、文字コードはsjisじゃないと文字化けします。.NETの中身はUnicodeだからsjisだと文字化けしそうなのに……。文字コードのあたりはよくわからんですね。

また、メソッドはPascalCase、snake_caseどちらで書いても呼び出し可能です。.NETでは標準の命名規則としてメソッド名をPascalCaseにすることになっていますが、Rubyではsnake_caseにするのが一般的なので、snake_caseで書いたほうがRubyっぽくなっていい感じだと思います。

ぶあつい。

気になる本が近日発売。C++の設計者、ビャーネ・ストラウストラップの書いた『ストラウストラップのプログラミング入門』。ページ数と価格から入門者を近づかせないオーラが感じられますが、きっと気のせい。

内容によっては買おうかなぁ。

ぶあつかった。

プログラミング .NET Framework』読了。ガーベジコレクションの仕組みのあたりは面白かったです。

読み終わったところで、今度は、『独習 電気/電子工学』を読み始めました。ソフト屋ですが、ソフトをつくるだけが仕事ではないので……。内容はそれほど濃くもなく、網羅的に書かれているので、「あぁ、昔そういうの習った気がする。」というレベルの人間にはとても読みやすいです。もうちょっと深い内容を知りたい場合は物足りないですが。

2011-07-02(SAT)

暑い季節がやってきた。

コードに触れないのに仕事が忙しいと、ストレスのたまり方がすさまじい……ということを学びました。特に、どんなにひどいコードを目の当たりにしても、手出しできないのがもどかしい。「直してくださいね。」とは言いますが……。

書籍一覧を整理してみた。

分類をつけてみました。もっと、ちゃんとするのはまた今度。

最近は、会社の休み時間用とは別に薄めの本をカバンの中に入れて、ちょっとした待ち時間に読むようにしています。ちょうど昨日、カバンの中の『メタプログラミングRuby』を読み終わったので、次は何を読もうかと思案中。ちなみに会社ではGW明けから『プログラミング .NET Framework 第3版』を読み込み中。さすがに900ページは多すぎましたが、淡々と読み続けて、今月中には読み終わる予定です。