2009年2月17日火曜日

[PC][Linux][Program]なかなか摩訶不思議だぜ…

今日はなかなかに濃い内容になると思うので、プログラムとかLinuxに興味がない人はスルー推奨^^;
えーまずはネタ(?)から。
今すぐUNIX TIMEみろwwwwwww:ハムスター速報 2ろぐ
ちょw UNIX板取り損ねてるやんwww ここはしっかりと取っておかないとあかんところとちゃうんかねぇ…w
え? 私ですか? グースカ寝てましたが何か?(ぁ
・SKK使ってみた
続いてはFEPの話題。先日
[ [Linux]Anthyを卒業したい] by Linux奮闘中! -某OSとも共存-
なんて日記を投稿したところ、予想外にコメントがつきまして。そこでyamaさんからSKKを勧められましたので使っています。
SKKは古くからありますし、以前から名前は知っていたのですが、一度として触ったことがありませんでした。
で、今回初めて触ったわけなんですが、これがまたなかなか面白い。
古くからあるだけあって、キーバインドというか、変換方式が特殊です。入力方式については検索してください。ここではよー説明しきれませんw とりあえず、Shiftキーをめちゃくちゃ活用するので、いやでもShiftキーの位置を覚えます。
ついでに、漢字の読みも強くなるかも知れませんw SKKでは変換の際、「ここからが漢字で、ここからは送り仮名だよー」と、入力時に指定させることで、文節の判断を人間に任せています。そのため、文節を間違う類の誤変換はまず有り得ません。
ただし、送り仮名の位置が間違っていると変換できませんので、うろ覚えの漢字は扱いにくいでしょう。だので、自然と漢字の読みに強くなれそうです。
また、珍しいことに(?)、Linuxだけでなく、Windows用のフロントエンドも用意されています。会社の事務所PCに突っ込んでおきました。誰かが私のPCを触っても、日本語が入力できずきっとイラつくでしょう(笑)
私はすぐ慣れましたが、MS-IMEやATOK、Anthyなどの一般的なFEPとはかなり思想が違うため、滅茶苦茶好みが分かれそうです。慣れると病み付きになります。私はこれのおかげで、左Shiftキーを扱えるようになりました。それまでブラインドタッチで扱うことなんて一度もなかったんですけれどねw
・C++/CLIの仕様にハマる
現在取り組んでいるプログラムですが、ようやく今日、形になりました。
ただ、なかなか分からないことも多いです。
まず、C++/CLIからネイティブC/C++のライブラリを呼び出す場合。戻り値が値型なら特に問題にならないのですが、ポインタの場合はどうしたらいいのか分かりませんでした。
関数内で領域を確保し、それをreturnする関数だったんですが、ラッパー関数が呼び出した時点でメモリ参照エラーだったんですよねぇ。
概略としてはこんな感じ。


/* DLL - c++ - hoge.h */
public class hoge
{
    ... snip ...
    float* getSignal(void)
    {
       float *ret = new float [nLength];
       ... snip ...
       return ret;
    };
    ... snip ...
}
/* caller - C++/CLI - hogeCLI.h */
public ref class hogeCLI
{
    hoge *_hoge = new hoge();
    ... snip ...
    array<Sysytem::Single>^ getSignal(void)
    {
       array<System::Single>^ ret = new array(nLength);
       float *tmp = new float[nLength];
       tmp = _hoge->getSignal();
       for(int i=0; i<nLength; i++)
       {
          ret[i] = tmp[i];
       }
       return ret;
    }
    ... snip ...


大体こんな感じです。これを実行すると、tmp = _hoge->getSignal();の部分でエラーが発生します。
ほんとはもうちょっとしっかりと検証したかったんですが、hogeCLI.hに該当するコードをDLLにしてしまっていて、しかもC#から呼び出していたので、まともにデバッグできてないんですよね…。
一応、戻り値をvoidにし、引数に変数を投げてやることで解決はしました。かなり引数に書くおまじないが酷かったですが^^; C#だと「out」キーワードでおしまいなのにね。C++だと「*」か「&」で終わりなのにね。ハイブリッドならではの弊害かしら。未だにあの指定子の意味は理解できてませんwww なんで追跡参照子にする必要があったんだか…。
今回のプログラムでは、
・DLL/LIB
・C#/C++/CLI/C++のハイブリッド
に初挑戦しました。つか一気にやりすぎたか!? DLL/LIBの部分にも1つ気に喰わないところがあるし、ハイブリッドなんて分からないことだらけだ。
できたらここいらをもうちょっと詰めていきたいなぁ。
とりあえず、今日プログラムが動くようになったけど、何故動いているかは謎☆(ぁ
あのまんまコンポーネントのDLL配布したら動かないこと間違いなしやからなぁ。そこだけは修正しておこうw