hirax.net::Keywords::「プログラミング」のブログ



2008-07-09[n年前へ]

光スペクトル操作用のMathematicaライブラリ 

以前、Mathematicaの演習用に作った「スペクトル操作用Mathematicaライブラリ」を少し直したので、ここ(”ColorLib_amature.nb”に置いておきます。以前作ったものと同じく、スペクトル・データをリストのような離散データではなくて、関数として(純関数=無名関数として、あるいは、明示的な関数として)取り扱うという点が特徴だと思います。「(せっかくMathematicaで解くのですから)解析的に解く」「使用者には離散化・数値計算など、面倒くさい汚い部分は見せない・見たくない」という方針で作ったものです。

以前のものからの変更点としては、"spectorPlot"や"labPlot""labColorPlot"など、関数名のMathematicaの命名規則に合わせた変更、加法混色・減法混色用関数の追加・グラフ表示関数の追加・バグ修正といったところです。

 最初のラフスケッチが、絵画の原理を自分なりにおさらいするためのものだったので、濃度変調・面積変調などを扱おうとする場合には、比較的簡単に・気持ち良く作業ができると思います。たとえば、下記のようなコードを書けば、D65光源のもとで、赤紫色の絵具を重ね塗りしていったときの色の具合を CIE Lab 空間で眺めたりすることができます。

labPlot[
 Map[lab,
  Table[transmissionSpector[D65,
magentaFilter, d],{d,0,10.0,0.1}]
]
];

 また、白色光照射時に黄色い絵具を塗り拡げる面積を増やしていった場合の反射光スペクトル変化をアニメーションとして作成・グラフ表示するコードはこんな感じです。"addtiveMixtureSpector"は加法混色用の関数で、"transmissionSpector"は減法混色用の関数です。お遊びソフトですが、色々遊ぶこともできるかもしれません。

Map[spectorPlot,
Table[
addtiveMixtureSpector[
{whiteLight,
transmissionSpector[whiteLight, yellowFilter, 1]},
{1-r, r} ],{r,0,1,0.1}]];
 コードを書く際に、Mahematicaで数式と文字列をシームレスに取り扱うことができたなら、もっと簡単に関数が書けるのにとも感じました。しかし、そういった感覚になるときは、たいていの場合「その道具の使い方・その道具を扱うプログラミングスタイルが間違っている」ことが多いものです。というわけで、Mathematicaプログラミングをまた勉強しなおしてみよう、と思ったのです。

スペクトル操作用Mathematicaライブラリスペクトル操作用Mathematicaライブラリスペクトル操作用Mathematicaライブラリ






2008-07-11[n年前へ]

「スペクトル操作Mathematicaライブラリ」で動画を作る 

 光スペクトル操作用のMathematicaライブラリで、スペクトル変化の動画を作ると、こんな感じになります。Map も spectorPlot も Table も addtiveMixtureSpector も whiteLight も cyanFilter も・・・どれも「関数」です。addtiveMixtureSpector や whiteLight や cyanFilter は「関数を返す関数」で、Map などは関数を引数にとる関数です。Mathematica でコードを書いていると、なぜか自然に関数を重ね合わせていくような書き方が気持良くなってきます。

Map[spectorPlot,
 Table[
  addtiveMixtureSpector[
   {whiteLight,
   transmissionSpector[whiteLight,
   cyanFilter, 1.0]}, {1-r,r}]
 ,{r,0,3,0.05}]]

 それで、今この瞬間の悩みはMathematicaで"spectorFitting[targetSpector_,usingSpectrum]"というような関数をどうやって書くか、ということです。targetSpector は、任意のスペクトルを表現する関数で、usingSpectrum は「スペクトルを表す関数群」で要素数は任意のリストです。usingSpectrumを使いtargetSpectorをどのように表現するかを、最小二乗近似で最適解をNMinimize で解くというのが、そんな関数を作るときの定番の手順なのだろうと思います。つまり、方程式と制約条件を動的に作成し、それをNMinimize で解いた結果を返す、という具合です。

 さて、この spectorFitting という関数はどう簡単に書くことができるものでしょうか。Mathematicaは変数名と文字列を明確に区別する割に、見た目ではまったくその違いがわからないのが面白いところ(同時に苦労するところ)かも、と思ったりしたのです。

2008-07-31[n年前へ]

「計測・解析ソフトのハック」が実験系技術者の一番のLifeHack…かもしれない。 

 「計測・解析ソフトウェア/ハードウェアのハック」が実験系技術者の一番のLifeHack…かもしれない、と思っています。それを逆に言うならば、実験系技術者が費やす多くの時間を、計測・解析ソフトが消費しているということになります。つまり、一番時間を消費している部分の高速化をすることが、全体の高速化に効果的だろう、ということです。

 そんなこんなで、何を今更…という、Perlで「シリアル通信とユーザインターフェース自動制御」のやり方を整理しておくことにしました。なぜかというと、経験的に「計測・解析ソフトウェア/ハードウェアのハック」は、シリアル通信制御とユーザインターフェース自動制御でほとんどの場合対応できることが多いから、です。しかも、計測・解析ソフトウェア/ハードウェアを外注したりすると、時間や費用が無視できないほどかかったりするわけで、そういったシステムを簡単に作ることができるということを知っていると、結構便利であるわけです。

 たとえば、RBIOシリーズのような汎用(入)出力ボードは、お小遣い程度の価格で「シリアル通信経由でのハードウェア制御をする」ことが簡単にできます。それは、「計測ハードウェアのハック」がとても簡単にできる、ということです。
 そして、Windows上(あるいはWindows上で動くソフトウェア)の作業を”勝手に”プログラミングすることができれば、「計測・解析ソフトウェアのハック」も簡単にすることができます。

 というわけで、「シリアル通信とユーザインターフェース自動制御」ができれば、「計測・解析ソフトウェア/ハードウェアのハック」を簡単に実現することができるわけです。

 とりあえず、たとえば、Perlで「シリアル通信とユーザインターフェース自動制御」を使うには、Win32::SerialPort と Win32::GuiTest という二つのライブラリが必要です。それらのインストールは、コマンドプロンプトから、

ppm install Win32-SerialPort
ppm install http://www.bribes.org/perl/ppm/Win32-GuiTest.ppd
という風に行うことができます。もっとも、インターネットに直接アクセスすることができない Proxy 内部からであれば、
set HTTP_proxy=http://proxy.hoge.com:8080
set HTTP_proxy_user=hogehoge
set HTTP_proxy_pass=hogehoge
といったような、Proxy対策の環境変数設定をコマンドプロンプトから前もって行っておくことが必要になります。

 あとは、シリアルポート通信ようのConfigファイルを作る、プログラムを書く、ということだけです。たとえば、

!c:\perl\bin\perl
use Win32::SerialPort;
use Win32::GuiTest qw( FindWindowLike GetWindowText SetForegroundWindow MouseMoveAbsPix SendMouse GetWindowRect SendKeys);
といったライブラリを読み込む宣言をした後に、ソフトウェアのユーザインターフェース周りは、
MouseMoveAbsPix(320, 160);
SendMouse("{LEFTCLICK}");
SendKeys($fileName);
SendKeys("{ENTER}");
というような感じで、マウスやボタンやキーボードを自動で動かすことができます。また、ハードウェア周りは、
my $conf_file="serialport.conf";
tie *PORT, 'Win32::SerialPort',$conf_file or die; pushSwitch(0);
close PORT or warn "Can't close serialport:COM*";

sub pushSwitch{
my ($portNo) = @_;
my $text=sprintf "PCT%d%d\n",$portNo,1;
print PORT $text;
}
という感じで*、スイッチやモータを適当にシリアル通信(とRB-IOのようなお手軽I/Fボードで)制御すれば良い、という具合です。午前中に秋葉原に行って部品を買って、午後にスクリプトを2,30行書けば、それで自動計測・制御システムのできあがり、というわけです。

 *(なお、ここで使用している"serialport_conf"は、こういったserialport_conf.plで作成します)

2008-08-01[n年前へ]

ページオブジェクト指向プログラミング 

 簡単な書籍整理アプリをRailsで作ろうとして、「ページオブジェクト指向プログラミング」をしたくなった。

 「ページオブジェクト指向プログラミング」というのはどういうものかといえば、最初に「クライアント側へページをつかさどるJavaScriptのクラスソースを送りつけ」「インスタンスを作成」したあとは、勝手にクライアント側で「初期化をしたり」「初期・逐次データを集めたり」「データ書き換えをしたり」といった作業を適当にしてくれる、というスタイルである。サーバー側はデータベース操作の仲介役と、数種のページオブジェクトをクライアントに送信するだけ、という役割だ。

 こういうスタイルだと、サーバー側は楽になるし、ユーザから見たレスポンスも速くてチープな個人サーバには都合が良いように思える。…しかし、広く全体を眺めてみればユーザ間での重複作業が多くて、何だか無駄が多いようにも思えてくる。

 …とりあえず、「ページオブジェクト指向プログラミング」をして、どういう具合になるのか試してみよう。

PageObjectCoroller






2008-08-03[n年前へ]

続 WEBベース「ビジュアル言語」を作る 

 『画像処理WEBアプリを簡単作成用「ビジュアル言語」を作る』で作成した叩き台のイメージは、「データ処理フローを並べ終わった瞬間に、基本的にはアプリケーション作成(と簡単なテスト)が終わっている」というものです。「並べること」が「 プログラミング」「画面デザイン」「初期テスト」のすべてを兼ねていること、が大切で、そういう「ビジュアル言語」を作ってみたかったのです。「アイコンを並べたあとに "RUN" ボタンを押してプログラムを走らせる」とか「アイコンを並べコーディングをした後に、今度は画面デザインを別画面で設定する」なんて面倒なことはしたくない、と思ったのです。

 そういう作りをイメージした理由の一つは、画像処理アプリケーション(おそらく多くのデータ処理アプリケーション)は、「画像アップロード(データ入力)部」「スライダーやテキスト入力による数値入力部」「データ選択」「フィルタ(演算)処理」「種々の特性の表示部」といったせいぜい数種の比較的限られた機能を並べることで作られていることが多い、ということです。その並べ方にアプリケーションの特徴があったりするわけです。

 また、それぞれの基本パーツはどれもJavaScriptで覆われていることで機能拡張を楽にしたい、という構想設計ならぬ妄想設計に基づいています。5,6種類の数少ない機能を持つ基本パーツを作ってしまえば、あとはいかようにでもできるだろう、というイメージです。

 たとえば、「フィルタ(演算)処理」なんかは、JavaScript中のSJAX先アドレスを変えるだけで(それらアドレスに応じたサーバ側コードは当然用意するとして)、色んな画像処理フィルタを自由に作ることができるわけです。そういう風に基本パーツを継承した派生パーツを作っても良いし、あるいはパーツの組み合わせでさらに新しいパーツ(関数)を作っても良いわけです。以前 Imagenerator でもやったように、いくつかの簡単な機能を組み合わせたものを、さらに一個のパーツ(関数)として保存できるようにしておけば、機能を増やすことも簡単にできるだろう、ということになります。

 ……と書くより、ひとことで言ってしまえば「何だかそれって面白いな」と自分で思えるものを作って遊んでみたかった、ということですね。
 データの送受信が、(下の動画(高解像度版)のように)グニュグニュと揺れ動く振動や画像の変化で実感・体感できたり、それがJavaScriptでラップされている設計構造とか「何だかそれって面白い・楽しいかも」と遊んでみたかっただけ、なんですよね。ひとことで書いてしまえば。

ImagePipes2








■Powered by yagm.net