Linuxを中心とした話題を投稿予定。 使用ディストリビューションであるFedoraが中心になると思われます。http://oedipa.wiki.fc2.com/にてTips Wikiを公開してます。
[日常][プログラム]寒いなぁ…
今日はかなり冷え込みましたね…。事務所は暖房がかなり効いてる(つか効きすぎじゃねぇ?)ので、外に出るとあまりの寒さにほんと困ります。今日は風が痛かったぞ…。

そしてさらにはこの不景気。ほんと寒い>< 消費も冷え込んでしまうのも無理はないわな。

で、今日もせっせこプログラム。昨日、
「なんで動いてるのか謎☆」
と書いてましたが、やっぱり動きませんでしたw 多分、きちんとリンクされてなかったんでしょう。
一応、こちらが想定している通りの動きをしてくれるようになりましたが、未だによく落ちます。

落ち方としては完全にバッファオーバーランの類なんですが、何故そんなことになっているのか全く把握できてません…Orz

とりあえず、どの関数の中で落ちているかは把握できてます。ただ、落ちる理由はさっぱりです。マネージドな環境から呼び出したネイティブなインスタンスの中で確保された領域(あー言葉で書くとややこいな)ってのは、GCの対象になるのん? もうそうとしか思えない挙動なんよなぁ…。だってネイティブな環境で使ってやればこんなこと起きないんだもん。

まぁ、追々デバッグしていきましょう。悲しいかな、マネージドとネイティブの混在するワークスペースで、プロジェクトを越えてのdebugはできないみたいですね。マネージド同士、ネイティブ同士なら可能ですが、異種間では無理でした。
う~ん、カット&トライやなぁ。ほんとはもっとがっつり調べたかったんやけど、なぜかCUIからportaudioを叩いたら、ASIOデバイスは0個ですって言われたのよねぇ。同一のPCでGUIから叩くときちんと2台見えてるのに。

あそこでASIOが見えていたらもっと深くdebugができたろうに。メモリ参照エラーを起こす関数はASIOをキックした後に呼び出すのよねぇ。

ま、明日以降も挑戦してみましょう。もうほぼ他の部分は完成したしね。明日にはRC版のリリースじゃー!
スポンサーサイト



[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