2009-06-12[n年前へ]
■Mathematicaで「オブジェクト指向風」記述
春過ぎの頃、「分光スペクトル・色処理用のMathematica 7.0用ライブラリ」を作りました。そのライブラリを使うと、たとえば、D65光源下で、赤紫色の絵具を重ね塗りしていく際の色変化を CIE Lab 空間のグラフで表示させると、
labPlot[ Map[lab,Table[ transmissionSpector[D65, magentaFilter, d], {d,0,10.0,0.1}] ] ];というようなコードになります。labPlotという名前の関数が一番外側にいて、その内側にMap関数がいて、さらにその引数のひとつにTable関数がいて、その内側にtransmissionSpectorがいて・・・、という風に関数・括弧で外側から包まれているような具合の書き方になります。
こういう書き方をしていると、括弧の対応がわからなくなったり、処理の流れがわからなくなったりしてしまうように感じることがあります。そんな時、気分転換がてら、Mathematicaのコードを「オブジェクト指向風」記述で書き直したりします。どういうことかというと、たとえば、こんな関数を定義してやります。
Light[new]:=Module[ {Spector=D65, self}, self[setSpector,spector_]:=(Spector=spector;self); self[spector]:=Spector; self]すると、
a=Light[new][setSpector, D65][spector][600]というように記述をすることができます。これは、スペクトル属性を持つ「光オブジェクト」をつくり、そのスペクトルをD65光源と同じにし、そのスペクトルの600nm波長の強度をaに代入する、という内容です。最初の例のような、括弧で多重に囲われているのではなく、括弧が連続しているので、括弧の対応や処理手順がわかりやすくなっています。
コードのミソは、「Module内で宣言した(一意に識別できる名前が付けられる)変数self」により、オブジェクトを表現している、というところです。また、selfを返す関数を作ることにより、Light[new][setSpector, D65][spector][600]という風に処理を連ねていくことができるわけです。
もちろん、こういう「オブジェクト指向風」記述をわかりやすく感じる時もあれば、そうでない場合もあるわけで、状況によって、あるいは、その時の気分で好きな風に書く、のが趣味プログラミングとしては一番楽しいような気がします。
2009-06-21[n年前へ]
■Mathematicaライブラリをさらに「オブジェクト指向風」にしてみました
以前、分光スペクトル・色処理用のMathematicaライブラリ(関数群)を作りました。そして、この前Mathematicaで「オブジェクト指向風」記述をすることで、括弧の対応や処理手順を見やすく・わかりやすくしてみました。もちろん、「わかりやすい」というのはあくまで主観的な話です。
今日は、もう少し本格的な例を作ってみようと考えて、そのMathematicaライブラリに、Spectorクラス・Layerクラス・Lightクラスを作成・追加してみたのです。物体を光で照らした時に見える分光スペクトルを、モンテカルロ的に解く機能を適当に付けてみました。
そんなわけで、スペクトルを扱うSpectorクラス、立体形状を扱うLayerクラス、そして、適当に光追跡を行う機能を盛り込んだLightクラスを仕立ててみたのです。
たとえば、デフォルト設定をそのまま使うなら、
layers=Layer[new] aLight=Light[new] aLight[in,layer][showTrace]といったコードを書くと、三次元物体中を照らす光の色が、どのように変わっていったかを立体的に表示させることができます。
あるいは、
Spector[new][set,blueSpector][spectorPlot]と書けば、青い色のスペクトル分布を描いてくれます。Layersは・・・形状を定義する関数を少しオブラートに包んだクラスです。
そんなわけで、数日後には、バグ確認・使い方の例などを加えた上で、サイトからダウンロードできるようにします。また、適当に仕立てたこのツールを使い、何か解析でもしてみようと思います。
2009-08-22[n年前へ]
■読めばワクワク楽しくなる「詳解 OpenCV」
オライリージャパンから「詳解 OpenCV 」を献本して頂いたので、リュックに入れて、持ち歩きつつ読んでいます。画像処理プログラミングをする際にOpenCVを使うことも多い私ですが、この本はとても面白く感じます。私よりOpenCVを使ったことがない人でも、端的に言えば、OpenCVを知らない人でも、この本を読めば「あぁ、こんな面白そうなことが実は簡単にできるのか」と思えてくるだろうと思います。
たとえば、「ナンシー"小"関 風 パッチもん版画」作成ソフトはOpenCVを使っているおかげで、全部でも実質2~30行程度のプログラムだったと思います。そのくらい、OpenCVは簡単に色々なことをすることができます。それは、とてもエキサイティングです。
つまり、この本は読んでいると思わずワクワクする本です。そして、何かを作りたくなり・実際にそれを作り上げることができる本です。全部で611頁の中に、さまざまな画像処理技術の紹介・そして、そのOpenCVを使った実装方法の具体例が詰まっていて、もちろんサンプル・コードをダウンロードすることもできます。
本文だけでは、「プログラム全体」をどう書くかという点について、(最初は)少しとまどってしまうかもしれませんが、それはサンプル・コードを見れば解決するだろうと思います。少なくとも、OpenCVを使ったことがない人から、OpenCVを使っている人(けれど使ったことがない機能があるという、つまりすべての人)を、この本は対象にしているように思えます。ひとことで書けば、間口が広く、そして奥行きの深い本に思えます。
この本の欠点は、リュックに入れていつも持ち歩くには少々重いということくらいです。もちろん、そんな読者はそうそういないはずなので、結局のところ、とても良い本だな、とリュックの重みとともに感じています。
2009-09-27[n年前へ]
■「CからRubyを実行してみるテスト」
その前段階として、CからどうやってRubyを実行するんだ、というのがありまして。ちょこちょこネット上を彷徨って調べたのですが、ふと見てみた「Rubyアプリケーションプログラミング(オーム社)」に書いてあった……うん……ただちょっと情報が古いが。
2009-10-14[n年前へ]
■AutoHotkeyで任意の場所・タイミングでRubyやPerl等を使おう
キー入力する際に、さまさまな機能を使いたくなります。たとえば、以前作ったAmetMulti,AmetPerlなどは、ATOKのAMET機能(変換機能を拡張することができる仕様)を使って、Atokでプログラミング言語の一行プログラムを実行させたり、そういったワンライナー(一行プログラム)を辞書登録してしまうことで、文字処理・作成だけでなく、アスキーアート作成機能・画像取得機能などさまざまなことをしてみました。下の動画は、AmetMutiを使って、画像取得を行い、画像処理をかけたり、アスキーアート化を行った時のデモ動画です。
最近のATOKには、そういった機能拡張がより簡易にできる機能が追加されているようです。とはいえ、市販ソフトのお仕着せ機能を使うのも(趣味としては)少しつまらないですし、何より、ATOKで似たようなことをするならAMET拡張機能を使えば良いので、わざわざ車輪の再発明のようなことはしたくありません。(趣味なんですから)何か新しいものに挑戦したいものです。
そこで、今回はWindows用の(これまた無料の)AutoHotKeyを使って、キー入力を自由自在にフックして、さまざまな機能拡張を追加してみたい、と思います。AutoHotKeyはさまざまな機能を持ったソフトウェアなので、AutoHotkeyは、キー・スワッピングや語句置換や、キー入力などをトリガーにした各種処理ができるソフトで、非常に高機能なものです。その概略については、「AutoHotkeyを流行らせるページ」を一読してみれば、知ることができると思います。とはいえ、あまりも機能が多岐にわたっているので、まずは、既存のスクリプトを使ったり・改造したりすることから始めるのが良いと思います。
さて、今日は、AutoHotKeyを使い、"rby"と打つと、クリップボードに入っているRuby(ワンライナー)スクリプトを実行させ、その結果をキー送出させるプログラムを書いてみることにします。
準備作業は、まずAutoHotKeyをインストールします(再起動などは必要ありません)。そして、プロセスを起動して標準出力を読み書きするスクリプトをAutoHotKeyのAutoHotkey.ahkに追加します。もちろん、Rubyも必要です(どのようなバージョンでも構いません)。また、Rubyでなく、Perlでも何でもスクリプトを変えれば同機能を実現できます。
それでは、スクリプトをAutoHotkey.ahkに追加しましょう。
::rby:: a=ruby -e ' c=' d=%a%%clipboard%%c% pi:=PRun(d) PWaitExit(pi) r:=PRead(pi) Send,%r% PClosehandle(pi) returnはい、これだけです。rbyという単語入力がされたら、rubyを-eオプションを付け起動させ、クリップボードの中身をワンライナーとして処理した上で、その結果をキー送出させる、というわけです。
あとはAutoHotKeyで.ahkファイルを再読み込みし、メモ帳を開いて、
puts Time.now.monthと書き、その一行をコピーして、rbyと入力しエンターキーを押すと、そこには10という文字が出現します。もしも、 puts Math.sin(5) という一文をコピーして、rbyと打てば、メモ帳上に-0.958924274663138という文字が出現します。
もちろん、メモ帳でなくても構いませんし、
a=ruby -e 'の一行を
a=perl -e 'とでも適当に替えるだけで、Perlを好きなソフト上で好きなタイミングで自由に使うことができるようになります。awkでも何でも同じ話、です。
というわけで、今日はautoHotKeyを使って、自分の指先が叩くキーボードのすぐ向こうに、RubyやPerlの機能をいつでも呼び出せるようにしてみました。もちろん、この話はさらに(無料の)Mathematica Player機能の実装などにも繋がっていくことになります。