Linuxを中心とした話題を投稿予定。 使用ディストリビューションであるFedoraが中心になると思われます。http://oedipa.wiki.fc2.com/にてTips Wikiを公開してます。
[PC][プログラム][.NET]これは結構大きなことだと思うんだ
特許は主張しない:Microsoft、C#とCLIに「Community Promise」を適用 - ITmedia エンタープライズ

まぁこれが
C#実装をめぐっては、FSFの設立者、リチャード・ストールマン氏が6月26日、Microsoftがソフトウェア特許を主張する危険があるのでC#に依存するべきではないという文書を公開していた。
に対する措置ではないでしょうが(こんな大事な事、1週間なんかで決まるはずがない)、Monoにとってこれは非常に心強いんじゃないでしょうか。

WPFやWCFについてはMonoで実装するつもりはないとなっていたように思いますが、.Net2.0相等でもかなり強力です。できたらLINQくらいは取り込んでくれたらうれしいなぁ。と、思ってたらある程度実装してるらしいw やりおるなMono…。

このところはM$も随分とOSS陣営に協調路線を見せてきてますね。まぁ、ODFとかではちょいちょい横槍を入れてますが、それでも標準化としているのでサードパーティの参入を阻害するものではありません。囲い込み戦略が独禁法に引っ掛かるので、下手なことするよりもある程度OSS陣営を利用する方が得と考えているのかもしれませんね。お互いにいいところを持っていけばいいんじゃないでしょうか。

私としては、M$をはじめとするプロプライエタリなソフトウェアが面白いものを出してきて、OSS陣営がそれを真似てどっちかってーとさらにオマケ機能をつけてきてーみたいな展開が理想ですね。追い掛けるのは楽しいもんですw

それに引き換え、このところのAppleはかつてのM$ばりに強硬路線を突っ走っているように思えるなぁ。そんなにサードパーティを追い出したいかね。

まぁiPodを越えるケータイプレーヤーのヒット商品ってのは出てないですし、この先しばらく出そうにないですからねぇ。にしたって、Linuxでまともに使えないデバイスなんて興味が沸かないんですがね!(ぁ
[PC][Program]VB6に泣かされる今日この頃
今日もせっせこツールの開発。本来は2ヶ月後くらいにやる予定だった内容を訳あって前出ししてます。

業務で使用しているチューニングツールなんですが、VB6で書かれてるんですな。そのツールの改造及び新機能追加のノウハウを習得ってことでカリカリ書いてます。

改造と新機能追加のノウハウについてはおおよそ把握できたんですが、今日2つほど罠にはまっちゃいまして。

まず1つめは、VB6(というかVisualStudio6.0?)の仕様による罠。
IDEからデバッグモードで実行し、その実行中のプロセスが何らかの原因で暴走した場合(大抵の場合、WinAPIに絡んでの暴走)、IDEを巻き込んで落ちてしまいます。というか、暴走したプロセスを落とすのにIDEから落とす必要があります。

で、更に性質の悪いことに、ビルドしてexeを生成するか、明示的に保存しない限り、プロジェクトに対する変更は保存されていません。デバッグ実行毎に保存されているのかと思いきやそんなことはありません。

そのため、結構ノリノリでソースを書いてデバッグ実行で暴走したら、とても悲しいことになります。

…ってかなりましたOrz 2時間分くらいが吹っ飛んだかな…。
まぁ、その2時間の内訳は、8割方が実装方法の思案に費やされてましたので、復旧作業自体は20分程度で終わりました。気分としては悲しかったがな!

2つめは、設計上の罠。
とあるUIでは、設定したパラメータを保存はしているけれど読み出しがまだ実装できてなかったので、その読み出し機能を追加することとなりました。

パラメータを読み出して、各パラメータのテキストボックスに放り込むところまでできました。
で、それは割合あっさりとできたんですが(途中上の罠に引っ掛かって時間を浪費しましたがw)、それをさらにファイルへ保存しようとしたら、あらまびっくりパラメータの部分が空白。

っかしいなぁと思ってパラメータ保存のルーチンを確認すると、どうもテキストボックスの値を保存しているわけではない模様。テキストボックスの値を別の変数に入れてるんですが、そちらの値を参照しているらしい。

つーことで、いつその変数にテキストボックスの値を代入しているのか調べたら、なんとテキストボックスのLostFocusイベントでやってやがる。

VB6のテキストボックスにはバリデーションチェック機能は基本的についておらず、「数字だけしか入力しちゃダメ!」みたいなのは自前で実装しなきゃいけないんですよね。

まぁそれ以外にも、入力範囲が決まっている場合なんかも、入力された値がその中に収まっているかをチェックする必要があります。

で、それをどのタイミングで実行するかってのが実装者に委ねられるわけですが、ここを設計した人はどうもLostFocusイベントで実装していたようで。

ここは好みが分かれるところかも知れませんね。私はLostFocusのタイミングでは判断しないでほしい。なにか他の処理を実行するボタンを押したときのように、その値が確定した段階でチェックをする派です。

まぁ、「入力した時点で間違いは分かるだろ? だったらその場で教えてくれよ」って人もいるでしょうし、それは要求仕様次第、それが特になければ実装者次第なのは納得できます。

んが、どうもこれを設計した人はパラメータロードについては一切考慮してくれなかったようで(パラメータセーブは作ってるのになぁ…)、バリデーションチェックのコードはイベントハンドラの中にベタ書き。サブルーチンにはしてくれてませんでした…。

まぁその部分だけサブルーチンにしてもよかったんですが、面倒だったのでパラメータを呼び出してテキストボックスに放り込んだ後、テキストボックスのLostFocusイベントハンドラを直接叩くという暴挙に(絶対にマネしないでね!)。

するとどうでしょう! 片っ端からバリデーションエラーにwww
ただ、それもおかしな話なんですよ。そのテキストボックスには数字で「0~1.0」が入るようになっており、それ以外の数値なり文字が入ったら「異常な入力値です!」というダイアログとともに、テキストボックスが赤に変化するというイベントハンドラの内容でした。

が、保存したパラメータファイルから読み出した値は「0.6」とか「0.3」など、バリデーションチェックが通るものばかり。

どないなっとるねんとか思いながら、手動でパラメータを打ち込んでみても結果は同じ。

なんじゃそらってことで、追加した暴挙の部分、イベントハンドラを直接読んでいる部分をコメントアウトして再挑戦。

…してもやっぱりバリデーションエラーが…Orz

おかしい。そもそもLostFocusのイベントに絡む部分を書き換えた覚えは一切ない。勝手に呼び出すコードは追加したけれど、別に呼び出しに問題はないだろう(是非はともかく)。大体、その追加した部分をコメントアウトしても発生してるんだからそもそもそこじゃない。

で、一体いつからこの現象が発生しているのかを調べるため、機能改造前のexeで確認したところ、件の現象は発生しませんでした。

ということは、私がコードを追加したことで何らかのバグが混入したか、あるいはもともとバグが潜んでいたけれど運良く(悪く?)発現してなかったものが発現したかどちらかでしょう。

とりあえず、もう定時だったのでこれ以上の追求は明日に回すことにしましたが、非常に気持ち悪い。そもこのプロジェクトがやたらめったらグローバル変数を使っていてなおかつパスタなコーディングをしているがために、どのタイミングでどの変数にどんな値が入っているかがイミフなんですよねぇ…。

明日詳しく解析はしていきますが、ほんっと早いとこ.Net版が使い物になるところまで持っていこう。これ以上こんなカオスなコードは増長させちゃいかんわ…。
[PC][Program][.Net]ようやくか…!
時期.Net Frameworkにて、ようやく複素数型が搭載されるそうです。
これでサードパーティのライブラリも更に充実してくれそうだ!

また、グラフやチャートの作成にはダウンロードの詳細 : Microsoft Chart Controls for Microsoft .NET Framework 3.5なんて便利そうなものを提供してくれてますし(関連ダウンロードも参照のこと。VS2008SP1向けアドインも提供されてます。ExpressEditionでも可)、ますます.Netが使い易くなりそうです。

また、VS2010はIDEがWPFで作られているとかなんとか。ExpressEditionが提供されるかどうか知りませんが、これは興味惹くなぁ。

けど、どう考えてもwindows2000は対象外なんだよなぁ。まだ社内標準OSとして2000は現役なので、ちょっと.Net4.0をチームに展開するのは憚られる。残念だ。非常に残念だ…。

まぁ、それ以前に.Net自体が認知されてないからなぁ。なんとか広めていきたいところ。別にExpressEditionで作成したプログラムであっても商用利用可能だし、コスト削減にもなると思うんだよなー。

ま、VB6からするとVB2008なんて似て非なる言語なんで、これまでVB6をやってきた人にとっちゃとっつきにくいものなんでしょうが^^;

とりあえず、来年までにじわじわと広げてみようかな。まずは隣のチームの同期をターゲットにしてみよう(ぉ
[PC][プログラム][C++]WAVEファイルを扱うクラスを作ってみた
割とよく使う割に、自前でちゃんとしたクラスを用意していなかったということで、ちょっくら自前で書いてみた。

リニアPCM限定、かつ先頭から44byteがヘッダであること前提というかなり手抜きなものですが、まぁさして実用にて困ることもないでしょう。

意外とWAVEファイルを扱うクラスの実装って少ないなーって思ってたんですが、単にWAVEファイルと言えども、その実、中身が結構異っているため、実装は簡単ではないみたいですね^^;

Windowsだったらwinmm.dllでしたっけか、あれのWAVEHEADEREXか忘れましたが、定義済みの構造体を使って、ついでにAPIも使う方が楽だとかなんとか。

とは言え、私はWinAPIが大嫌いなもので、それを使いたくなかったんですよねぇ。それに、扱うのはリニアPCMにほぼ限定されますし(せいぜい、32bit floatのWAVEファイルくらい)。

ってな訳で、これまで都度てけとーに関数やらクラスを書いてたのですが、いい加減まじめに作ってみようということでやってみました。

昨晩と今日の昼で書き上げたのですが、まだ動作チェックしてません…。したらボロが出そうだ。

ちなみに、今回使ってみたIDEはMonoDevelopです。本来はC#のオープンソース実装であるMonoの開発用なんですが、一応C/C++も開発できます。

見た目はVC++っぽく、最初は
「お、いい感じじゃん!」
と思ったのですが、悲しいかなインテリセンスが発生しませんでしたOrz

確かC#の開発のときには出てたと思うので、C/C++では出ないということだと思います。ちょっと残念。まぁC/C++開発はオマケってことでしょう。見た目はかなりいい感じなんだけどなぁ。

C/C++の開発はKDevelopとかEclipse + CDT、最近だったらQtDevelopとかになるんかな? WindowsだったらVC++EE一択なんだけどw

ところで、ofstreamをios::binaryで開いたときって、>>演算子で値の取得ってできないんですかね? コンパイルエラーは出ないんですが、値は取得できてませんでした。
まぁ、readメソッドでいいっちゃいいんですが、アレは第1引数に(char*)を要求するんですよね。binaryで開いてるんだし、(void*)でいいじゃねーかと思わなくもない。きっとなにか理由はあるんでしょうけどね^^;

さて、次は何を作りましょうかね?
[続きを読む...]
[PC][プログラム][.NET]あとはこれをどう活かすかなんだけど…
数値計算はC/C++でやった方が早いけど、GUIはC#/VB.NETの方が楽。
ってーことで、.NETで使えるOpenGLの実装を調べてました。

最近活発なのはOpenTK | Home of the Open Toolkit libraryみたいですね。OpenGLだけじゃなく、OpenALも扱かえるみたい。OpenALは使い道が浮かばないんだけれど^^;

で、これを見つけるまでの間、たまたまこんなのも見つけました。
ILNumerics.Net - numeric computing for .NET
どうもかなり強力そうなライブラリですよ…? グラフ作成機能までついてますしね。おまけにC#のコントロールクラスとなっているみたいなので、VC#からも扱いやすそう。

FFTはMKL、AMD ACML、FFTWのライブラリを使用可能ということで、ネイティブと速度の面では変わりません。
また、Matlabを強く意識しているようで、文法も似ていますし、挙動も似せて作ってあるようです。
Matlabで書いていたコードのイメージを、ほぼそのまま使えそうですね。

ただ、これをどこに活かすかが問題。まーC#は当然の如く社内標準ではないので、扱かえる人が少ない。つかうちのチームにはいない^^;

だので、とてもいいライブラリだとは思うんだけど使い道が見出せないんだよなぁ…。この鬼のような柔軟性はさすがC#って思うのに。

まぁ、グラフのプロット以外ならliboctaveを使うってのも手。ただ、最近はあんまり行列演算やってないから、liboctaveの出番はなさそうだけど。

せっかくC++とC#の橋渡しは理解できたけど、ちょっち今のところはそれを発揮できそうにないや。
インストーラ作成の方法とかも覚えたのになぁ(笑)NSIS万歳!