Linuxを中心とした話題を投稿予定。 使用ディストリビューションであるFedoraが中心になると思われます。http://oedipa.wiki.fc2.com/にてTips Wikiを公開してます。
2012年8月26日日曜日
[Android][プログラミング]な、なぜだ・・・
こちらはアルバムリスト一覧。MediaProviderに登録されているアルバムが表示されてます。で、これをタップしたらそのアルバムに入っているトラック一覧をリスト表示したいと。
ひとまず、Fragmentの入れ替えのお勉強のためという事で全トラック一覧のFragmentを呼び出すようにして見ました。で、上の画像の状態から、トラック一覧のFragmentに差し替えたのがこちら・・・。
な、なんじゃこりゃー!!!
ご覧の通り、下のFragmentが透けてしまっています・・・。
ちなみに、Fragmentを差し替えた際、バックスタックには積んでいません。ほんとは積もうと思っていたんですが、まぁそれは後でも出来るってことで。
だから下のFragmentは廃棄されてもいいと思うんだけどなぁ・・・。 replaceだと廃棄されないの?
これだとさすがに具合が悪い・・・。
うーん、Fragmentの差し替えってよく見かけるんだけど、こんな状況になることってよくあるの・・・? あんまり情報ないんだけどどうなっているのか分からないOrz
うーん、ルートコンテンツを差し替えたのがまずかったんだろうか・・・。
あーーーーわっかんねええええええええOrz
2012年7月22日日曜日
[Android]Android向けDMRアプリに挑戦 その1
思いの外情報が転がってないんだよねぇ。探し方が悪いというのはあるんだろうけど。
ということで、現在の開発状況。
- Intel Opensource Developer ToolsのDevice Builderより作成したAndroid用Stackを使用
- デバイスやサービスはONKYO TX-NA579をコピー
- DMCからSetAVTransportURIを叩かれると、MediaPlayerインスタンスで再生
- GetPositionInfoにてシーク位置を返しているつもり
- Seek、Pause、Playコマンドを実装済み
- 一部のアプリからはうまく再生できない
- MediaPlayerの状態遷移の理解が甘くて次の曲へ遷移するときに落ちることが多々
MediaPlayerが落ちるバグについては大体どこが悪いのかは雰囲気つかめているのでそこはなんとかなりそう。
再生状態がPAUSED_PLAYBACKになってるときはGetPosition呼ばれるんだね。再生が終了した段階で再生状態をSTOPPEDに変えていなかったかもしれないからそこは要チェックだわ。
イベントを受け取らずにポーリングにしてるとかいう場合はそもそも再生してない時にMediaPlayer.GetDurationを呼ばないように処理を変えないといけないかな・・・。 けどMediaPlayer.isPlayingだと一時停止なのか再生停止状態なのか分からんのだよな。 確かMediaPlayerの状態遷移は自分で管理しておかないといけないとかいうのをどこかでちらっと見た気がするからなんぞ状態管理の変数を用意しておくか。Enumにでもすっかなー。それくらい用意しておいてくれてもいいような気もしなくはない。
で。このIntelのライブラリ、非常に良くできているんだけど悲しいほどにドキュメントがない。C#なんかは割とドキュメントコメントが入ってるから使いやすいんだけど、Android向けのJavaコードにはほっとんどコメントすら無い。
とりあえずC#のサンプルコードでもって挙動を確かめつつ、Javaの方にも同じ挙動をするようにコードを追記していくような感じで進めています。
ほんと、そこで感じることはC#の素晴らしさとJava嫌いっていうことばかりなんですがね・・・!w まぁ愚痴はさておき。
ちょいと実装の話を進めて行きましょう。
Device BuilderにてTX-NA579をコピーしたのがこちら。
Device Builderを起動し、File→Open from Networkを選ぶと自身のネットワーク内にあるUPnPデバイスが表示されるので、選べばそれの設定がさくっとコピーできます。
適当なデバイスがないって場合は、Device Builderをインストールした先にサンプルデバイスやサンプルサービスのファイルが置いてあるのでそこから作りたいデバイスを選びます。 DMSやDMRは標準で用意されているのでそちらを選べばよろしいかと。
そしてDescriptionにある各項目を好きに修正。このまんま使ってもいいですが、私の場合本物のTX-NA579と見分けつかなくなりますからね・・・。
ちなみに、Configurationにてデバイスタイプを「Device」から「ControlPoint」に変更すると、その名の通りDMCを作ることができます。ただ、このツールではDMCとして制御できるデバイスタイプは1種類のみだと思われます(多分)。DMRとDMS両方を制御するようなDMCの雛形を作るにはどうしたらいいかよく分かってません。
まぁ、それ自体はちょちょっとコードを追記したら済むので、さほど気にしなくても良いとは思います。
今回はDMCの話はさておきますが。
で、適当にデバイスの設定を記述し終えたら、一旦ファイルを保存しておきます。このツールに限らず、Intel(以下略)のツールはやたらめったらクラッシュするので注意。これ以外は特に保存すべきデータがないのでクラッシュしても困りはしませんが、こいつはクラッシュされると再度記述しないといけないので面倒です。
ファイルを保存したら、Generate Stackにてひな形プログラムを生成します。
Windows用に作りたいのであればC#かC用のWinSock2を選んでおくのが無難でしょう。ただ、先述しましたがドキュメントが一切無いのでCは正直つらいとは思います。一応C++のコードも吐き出せますが基本はCでそれをちょろっとラップしてあるだけなのでよほどUPnPに詳しい人でないと使えない気がします。。。
で、私はAndroid用が作りたかったのでJavaを選択。Cで作ってAndroidにポーティングするという意識もあるのか、CのスタックのところにもAndroidと書いてありますが上記の理由でお勧めしません。
ちなみにGenerate Stackにて生成されるファイル群は指定したフォルダ以下にそのまま展開されるので、C:\とかに配置すると悲しいことになります。プロジェクト用に1個フォルダを作っておくのが吉です。
例:C:\UPnPDevice
※ このIntel(略)のツール群はOSSであり、サイトからソースをダウンロードしてビルドすることができます。C#で書かれているのでLinuxでもビルドできます(レンダラーについてはWMPコンポーネントを使っているためにビルドに失敗します)。Device Builderももちろんビルドできますが、当然Windows向けに開発されているので、Generate Stackしようとするとファイルパスが不正ですと言って怒られます。パス区切り文字を「\」前提で作ってあるわけですね。 そこを環境に依存しないように(変数忘れちゃいましたが)適切に書き換えてやればLinuxでも使えるようになるはずです。そこまではやってませんが・・・w
で、Android用のプロジェクトが作成されたらEclipseからプロジェクトのインポートで取り込みます。
UPnP.jarがプロジェクトの直下におかれているので、libsに配置するなりBuildオプションにてライブラリを追加するなりしておきます。
そんでもってビルドして実機に転送して、「Start Device」ボタンをぽちっとなすればDMRとしてDMCから認識されます。
中身空っぽなのでデバイスとして認識されるだけで再生も何も出来ませんが、認識されるまでの通信部分はすべてよきに計らってくれます。素晴らしい!
ということで、あとはAPIをそそくさと埋めて逝きましょう。
それがわかれば苦労しないんだけどね・・・! でもひな形コード自体は非常に良く出来ていて、あとは仕様に従い粛々と埋めていけばOKです。
ということで続きはその2へ・・・。
2010年5月31日月曜日
[PC][Program]CouchDBで検索ってどうすりゃいい?
ようやくデータの登録フォームを作ってデータ登録までは出来たんですが、検索に悩んでいる次第。
CouchDBで検索をしようと思ったらViewを作ってkeyで絞るしかないようなんですが、その絞った結果に対してさらに別のキーで絞るとかができそうにない。当然検索システムとしてはANDで絞って検索とかしたいんだからそこをどうにかしないとなぁ。
Viewのkeyに配列でも指定したらいいのかな? けどそれだとその配列にみごと合致するものしかヒットしないだろうし、startkeyとendkeyはそういう与え方できなさそう・・・。
となるとやっぱりMySQLに逆戻り・・・? なかなか難しいな。どうすりゃいいんだ? 登録はCouchDBが圧倒的に楽だけど、検索はMySQLが非常に柔軟。検索が複数キーでできたらCouchDBで決まりなんだけどなぁ。
とりあえず、明日には方針を考えよう。うーん、Viewで全部取ってきてPHP内で検索してもいいけど、なんだかなぁ。すごく微妙な気分だ・・・Orz
2010年3月28日日曜日
[Program]ちょっと楽しいZendFramework
「こで君て、データベースとか検索システムって作れたりするん? 外注じゃなくて内製の方が融通利くから、作れるなら作って欲しいんやけど」
って言われたところから。
現状、ベンチマークでばらしたり、試作品作ったりして性能を見たりしてるわけですが、そいつらのまとまった情報が無い。だので、それを整理しつつ引っ張ってこれるシステムを構築したいとのこと。
まぁ言われた当初はめっちゃ要求がアバウトで、できるできないを回答し辛かったので、まずは要求をより具体化するところからスタート。来年度から私が飛び込むチームの方々は私以外全員非ソフト屋さんということで、ソフト屋の常識は一切通用しないんですね。そも、データベースといわれたもののどんな情報を貯めていきたいかも決まってないし、フロントエンドのイメージもない。
逆に言えば多分に私の意見が通るというわけでもあったんですが、作ったはいいけれどお蔵入りするのも嬉しくないのでイメージはしっかりすり合わせたつもり。
どうも話し合いを続けていくと、検索システムは通販サイトをお手本にしたらよさそうだって感じまして。
で、通販サイトを構築するOSSってのはいつくかあったよなーって早速ググる。
有名どころではEC-CUBE(EC-CUBE‐日本発の「ECオープンソース」)なんてのがあるのは知ってたので、早速ローカルにインストール。こいつインストールに意外と手間取ったんですよね。なぜかパーミッションが正しく無いとか言われて。Windowsでしかも全員に書き込み権限があるようなファイルを権限がないとか言われてしまったからどうしたものかと思っていたらTipsが本家フォーラムで提示されてました。Linux環境だと多分起きなかったんでしょう。
インストールして、商品登録をやってみたんですが、これが実に面倒くさい。まぁ通販サイトなんで商品画像がないってことは有り得ないだろってことで必須なんでしょうけれど、私が使いたい機能としては画像がない場合も多々ありまして。これはちと流用するのは難しいなーってことで却下。
続いて、かなり新しそうなLiveCommerce!(Live Commerce ! オープンソースECサイト構築プラットフォーム - 買うのは簡単売るのはもっと簡単に)ってのを発見。サイトはすごくおしゃれで、これは使える!って思ったんですが、非常に惜しかった。後一歩、痒いところに手が届きませんでした。
ただ、すごく惜しかったので、こいつを拡張できたらかなりいいんじゃなかろうか、私が1から作るよりはるかに完成度が高いしないよりおしゃれだ!(そう、私は見た目重視w)ってことでソースを眺めてみることに。
が、ソースが全くわからないOrz
どうもZendFrameworkというものを使っているらしく、こいつはMVCをかなり厳密に提供しているそうで。そのためLiveCommerceでは見た目とロジックは綺麗に分離されてました。
ただ、ZendFrmeworkについてまったく知らなかったので、まずはZendFrameworkについてお勉強。
するとまぁ、PHPってこんなに進んでたのねと目から鱗。私がPHPに触れたのはもう6、7年前なので、その頃からするとびっくりするほど進化していたようで。今必死でZendFrameworkをお勉強してますが、これかなり楽しいですね。実によくできてるなーと思います。
あと、CSSでそげなことできたのね!ってのも大きな収穫。そもそもHTMLを直で打ってサイト構築とかこれまた6、7年前に作ってたHP以来だし、もうそんなのやる元気ないなぁと思っていたので今更HTMLをゴリゴリ書く羽目になろうとは夢にも思ってませんでしたが。
まぁでもCSSでサイトデザインを行うのはすごく理に適ってるんですね。今頃そんなことに気がついたわけで。FireBug最高! これまでただぼんやりと眺めていたWebサイトも、今はFireBugでもって「へぇ、こうなってるのね」とか興味津々。いやはや、Webデザイナーは変態ぞろいだな・・・!
残念ながらLiveCommerceを拡張するのは骨だったので、結局1からサイトを構築してます。と言ってもZendFrameworkを使ってるのでかなり楽。Zend_Layoutでサイトレイアウトは自動的に共通化できるし、Zend_Navigationでカテゴリメニューも作れる。Zend_Formでフォームも作れるし、DBとの連携も抽象化されてるしACLやらAuthまで用意されていてもう何から何まで至れり尽くせり!
こんだけライブラリが提供されているので、あとはサイト構成とDB構成を考えるだけ。まぁ問題はDB構成かな。Webサイト構築もやったことなければ認証システムもやったことなければDB設計もやったことがないというこの状況。実に無茶ぶりだよね! 楽しいからいいんだけど!w
もちろん、そんな無茶を楽しんでいるのはこのシステムを外に公開する気が一切ないから。外に公開するようなシステムだったら絶対にやりませんが。うちうちなのでなんとかなるでしょう。
お面はそろそろ完成しそう。あとは中身ってことで、DBの設計やなぁ。その先はDBの編集というか、レコードの登録やら削除もWeb経由でできるようにしたいところ。
DBは盛り込む内容もまだFixできてないからなぁ。こっちの方が大変そうだ。どうすんのが理想的かしらなぁ。
既にDBがあったのなら引っ張ってくるだけだからいいんだけど、作るのは初めて。さてさてどうしたもんでしょかね。
2010年1月11日月曜日
[PC]TwitterのBot作ってた
そもそもGoogleAppEngine(以下GAE)なんてものを全く知らず、まずはそこから。
どうやらPythonやJavaで作ったプログラムをGoogleのサーバ上にアップし、そこにアクセスしたらPythonやJavaのプログラムが実行されるという仕組みらしい。ようするにCGIみたいなもんかな?
Googleさんがやってるサービスってことでこれもまた無料。ただし登録できるアプリは10個で、しかも削除はできないということらしいのでテストで1個潰すのには躊躇しちゃうかも。
って場合にも大丈夫なように、サンドボックス環境は提供されております。SDKに同梱されているのでそこでがっつり試しておいていざ本番用にアップロードって形ですね。
で、いざBotをつくろうってたってまずはTwitterのAPIを扱わなきゃ仕方ない。ってことでAPIを調べようかと思ったんですが、どうやらtwiter-pythonってなPython用のライブラリがあるらしく、そちらを使うととても簡単にTwitterとやりとりができるとか。
しかもGAEはPythonに対応してるのでまさにうってつけ。つーことでPythonで作ってみることに。
ただ、私はPythonは全くの初心者。かろうじてインデントが重要な意味を持つってことを把握してるくらいで、構文も予約語も知らない状態ですw
まー習作って事で、cronでアクセスする度にてけとーなことをつぶやくBotを作成しました。
一応アカウントを晒しておくとします。
胡散臭い髭の男 (usankusai_hige) on Twitter
ただ、私の作り方が悪いのかなかなか呟いてくれません・・・。ランダムで適当に喋らせてはいるのですが、それがうまく反映されないようです。API制限に引っかかるほど呟いちゃいないんだけどなぁ。15分に1回だし。エラーは発生してないけど、つぶやきの内容が一切更新されないという謎。よー分からんので放置。忘れた頃に呟きます(笑)
後は追々台詞を増やしていくとか、フォロワーの発言からキーワードを拾ってリプライするとかいろいろやりたいんですが、実装ができないとかじゃなくてやって楽しそうな内容が思いつかないので(台詞を増やす以外)やってません。
ただ、思いのほか簡単にGAEは扱えたので、なんぞWebサービスを開発したいなら使い勝手がよさそう。いろいろと制約もきついですが、PythonやJavaがほぼネイティブで動かせるというのは大きいんじゃないかな?
twitter-pythonのライブラリもかなりGAEと相性いいし、ものすごく自分の趣味に特化したBot(情報収集系)を作るには向いていそうだ。
うーん、久々にプログラムした気がするなぁ。いやまぁ会社でもやってるんですけどね?Orz
2009年10月8日木曜日
[PC][プログラミング]たいふーん!
その結果、
「なんとも言えんから代理店に聞いてくれ!箱に代理店のシール貼ってるだろ? そこに連絡してちょ」
という旨のメールがすぐ帰って来ました。定型文かもしれません^^;まぁ、すぐに回答が来たことはありがたい話です。
ということで、GIGABYTEに引き続き(というかたらい回された)、代理店のマスタードシード株式会社さんのサポートに質問を投げてみました。
その結果、これまた1日で回答が。
「まず、Linuxって対応OSじゃないからそこんとこ自己責任でよろしくな。 あと、USBブートできねぇってことだけど、うちでUSBメモリにVista SP2のセットアップイメージ作って、パーティションをアクティブにしてブートしたらHDDにインスコできたぜ? ちなみにUSBメモリはADATA製C801だったぜ!」(※注:超フランクに書き直してます)
ということで、できるらしいです。USBメモリのイメージを見直してみるかな・・・。あとはアクティブになっているかどうか。いずれにせよ、ボードとしては可能らしいので頑張ってみよう。サポートさんありがとう!
閑話休題。
教授より依頼されたプログラム変更ですが、本日無事に終了しました。ちょいと細かい部分を忘れていて過去と同じ結果をなかなか出せなくて試行錯誤しましたが、なんとかリカバリー。昨日はnewでstd::bad_allocなんて例外吐かれたからなぁ。原因がコンパイラのバージョン違いによるリンカミスとは思いも寄らなかった。
学生の時はVC++2005EE+PlatformSDK、今はVC++2008EEで、クリーンせずにリビルドしたからダメだったという罠。横着はいけませんね。そのバグ解消に半日潰しましたOrz
で、今日ちょこちょこ修正を施して過去の結果を再現成功。ついでにプログラムの見通しがよくなるように#ifdefとかで場合分けしまくっておきました。今後このプログラムを使うことがあるか知りませんがw
一応教授が欲しがっているデータは揃った(はず)なので、明日メールで提出しておきましょう。
とはいえ、やっぱ気にくわない部分も多いなぁ・・・。もう少しスマートに書けたら最高だったのだけれど。まぁ数学的にアヤシイ部分が数ヶ所あるので、そこを直したいけれどもう細かい計算をしたくないというのが本音ではありますが^^;
けどFFTWをC++のcomplexとコンパチで使っているのは使い勝手良さそうだから、もうちょっとしっかりとラッパークラスを整理して、チーム内に展開してもよいかもしれない。C/C++でシミュレーションプログラムを書いている人がどれくらいいるか分かりませんが・・・^^;
ま、信号処理のシミュレーションはMATLABが主流ですよねそうですよね・・・。だがうちの部署にそんなお金はないので、Octaveで動くスクリプトを書くと喜ばれます。MATLABは数台のPCにしか入っていないのですよ!
社内でまとめてライセンス買ってくれたらいいんだけどな。他にも使ってる部署あるんだし。提案したら通るかしら・・・?
2009年9月16日水曜日
[3行日記][プログラム]VC++6.0はほんと大嫌いだ・・・
・VC++6.0では「complex<float> I(0,1);」は正しく動かない。値は不定となる(欲しいのは虚数単位)。
・VC++6.0では「#define _USE_MATH_DEFINES」を定義してもM_PIが定義されていない。(M_PIがANSIで定義されていないのである意味仕方ない)
・VC++9.0(VC++2008)では上記は両方とも正しく動く。
VB6用のDLLを作ろうとしてただけなんだけどね・・・。VB6だからVC++6.0の方がいいかなーと思ってVC++6.0を使ったのに無駄なところで時間を取られた。
VC++6.0、ほんとは使いたくないんだよなぁ。ANSIに準拠してない部分が多すぎて使いたくない。テンプレートに滅茶苦茶弱いし、特に信号処理で多用する複素数型のクラスがあんまりにも貧弱・・・。
個人的に作っているプログラムはVC++2008とかVC#2008、VB2008で作ってるけれど、チーム員に展開する必要がある可能性があるプログラムはプロジェクトが開けなくなると困るのでVC6.0で作っている。フリーなんだし、みんな移ってくれないかな・・・。VC++6.0って不安定なのに、みんななぜ気にならないの・・・?
2009年7月10日金曜日
[PC][プログラム][.NET]これは結構大きなことだと思うんだ
まぁこれが
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でまともに使えないデバイスなんて興味が沸かないんですがね!(ぁ
2009年6月23日火曜日
[PC][Program]VB6に泣かされる今日この頃
業務で使用しているチューニングツールなんですが、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版が使い物になるところまで持っていこう。これ以上こんなカオスなコードは増長させちゃいかんわ…。
2009年6月20日土曜日
[PC][Program][.Net]ようやくか…!
これでサードパーティのライブラリも更に充実してくれそうだ!
また、グラフやチャートの作成にはダウンロードの詳細 : 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をやってきた人にとっちゃとっつきにくいものなんでしょうが^^;
とりあえず、来年までにじわじわと広げてみようかな。まずは隣のチームの同期をターゲットにしてみよう(ぉ
2009年3月8日日曜日
[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*)でいいじゃねーかと思わなくもない。きっとなにか理由はあるんでしょうけどね^^;
さて、次は何を作りましょうかね?
2009年3月5日木曜日
[PC][プログラム][.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万歳!
2009年2月18日水曜日
[日常][プログラム]寒いなぁ…
そしてさらにはこの不景気。ほんと寒い>< 消費も冷え込んでしまうのも無理はないわな。
で、今日もせっせこプログラム。昨日、
「なんで動いてるのか謎☆」
と書いてましたが、やっぱり動きませんでしたw 多分、きちんとリンクされてなかったんでしょう。
一応、こちらが想定している通りの動きをしてくれるようになりましたが、未だによく落ちます。
落ち方としては完全にバッファオーバーランの類なんですが、何故そんなことになっているのか全く把握できてません…Orz
とりあえず、どの関数の中で落ちているかは把握できてます。ただ、落ちる理由はさっぱりです。マネージドな環境から呼び出したネイティブなインスタンスの中で確保された領域(あー言葉で書くとややこいな)ってのは、GCの対象になるのん? もうそうとしか思えない挙動なんよなぁ…。だってネイティブな環境で使ってやればこんなこと起きないんだもん。
まぁ、追々デバッグしていきましょう。悲しいかな、マネージドとネイティブの混在するワークスペースで、プロジェクトを越えてのdebugはできないみたいですね。マネージド同士、ネイティブ同士なら可能ですが、異種間では無理でした。
う〜ん、カット&トライやなぁ。ほんとはもっとがっつり調べたかったんやけど、なぜかCUIからportaudioを叩いたら、ASIOデバイスは0個ですって言われたのよねぇ。同一のPCでGUIから叩くときちんと2台見えてるのに。
あそこでASIOが見えていたらもっと深くdebugができたろうに。メモリ参照エラーを起こす関数はASIOをキックした後に呼び出すのよねぇ。
ま、明日以降も挑戦してみましょう。もうほぼ他の部分は完成したしね。明日にはRC版のリリースじゃー!
2009年2月17日火曜日
[PC][Linux][Program]なかなか摩訶不思議だぜ…
えーまずはネタ(?)から。
今すぐ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
2009年2月11日水曜日
[プログラム]スタティックリンクライブラリも把握
スタティックリンクライブラリの方がよっぽど簡単でした。DLLみたく、特別な事をする必要がありません。単にVC++のプロジェクトを「スタティックリンクライブラリ」で作成するのみ。
ただ、そうするとデバッグが面倒なので、最初はプロジェクトを「アプリケーション」で作成しておき、必要なクラスor関数が実装できたら、プロジェクトのプロパティから構成を「スタティックリンクライブラリ」に変更すると吉。ひょっとして常識だったりするのかな・・・^^;
日頃より、
「main関数はInit();、Do();、Fin();だけ!」
というポリシーの元(実際にはもうちょっと増えるけど)組んでいたおかげで、構成の変更は容易でした。main.cppをプロジェクトから除外するだけですしね。
今作っているプログラムのモジュールは5つ。うち3つはC++、1つはC++をラップするC++/CLI、そして最後にGUIとしてC#を使う予定。
まぁ、C++/CLIでラップしなくてもいけるかも知れない。C++とC#で配列をやりとりするならMarshalクラスを利用したらいい話。そこは明日考えよう。
しっかし、asiosdk2はなっかなか理解できん・・・。PortAudioはおおよそ理解できたんだけどなぁ。大差ないだろうに、と思うのだけれどビルドできない。
挙句にはAsioDriverListクラスでデバイス数を取得しようとしたら0個だと。ASIO4ALLを入れてるから最低でも1個、接続はしてないけどEDIROL UA-101もインストールしているから2個見つかってもいいはずなのに。
実際、PortAudioではASIO4ALLが引っかかりました。あの現象は理解できん・・・。AsioDriverListが使えないと面倒じゃん・・・。
とりあえず、今回はPortAudioを使って開発する予定。けどASIOをそのまま叩きたいんだよなぁ。近々チャレンジするとしようかね。
・・・、あのサンプル、あんまり見たくないんだよなぁ・・・Orz
2009年2月7日土曜日
[プログラム]初DLL作成
とりあえず、DLLエクスポート側とインポート側、ヘッダファイルに書くキーワードが違うということを理解するのに時間を要しました。MSDNって一度として役に立ったことがないのよね・・・。あれを理解できないというのはプログラマとしては失格なのかね・・・?
しかし、決まりきった手段(プリプロセッサでもってdefine定義を制御し、1つのヘッダファイルでDLLエクスポート&インポートを実現)があるんだったら、もうシステムに取り込んじゃったらいいのに。あれはVC++オンリーじゃないのかね? それともWindows専用? 地味にめんどいわ。
まーでもこれでDLLの作り方は分かりました。DLLを作るときは、(VC++なら)DLL用のプロジェクトとは別に、そのDLLを呼び出すプロジェクトを用意しておくと開発が楽になりますね。つーかそうするのが普通・・・?^^;
これまであまり同一ワークスペース上に複数のプロジェクトを置いたことがなかったので、割と新鮮。
ただ、今回はちょっとコンポーネントを細かく分けすぎたかも。それぞれをDLLにするほどの意味があるかっちゅーところやなぁ・・・。スタティックリンクにしてしまってもいいんだろうけど、別プロジェクトに分けているときはどないしたらいいかよく分からん・・・。複数DLLにしてしまうと配布が面倒なんだよなぁ。
まぁ、DLLを作ったこと自体が今回初めてなんだし、あまりいろいろな事に手を出すと発散するか。
何はともあれ、ネイティブC++でDLLを作ることができたのは大きな成果。あとはネイティブC++のクラスをC++/CLIでラップして、C#から叩けるようになったらかなり幅が広がるなぁ。複素数演算は(FFTWとかのライブラリを含め)C++は充実してるので、コア演算をC++で書き、GUIをC#で書くという分業が可能になりそう。
あと、C++ならギリギリ、チーム内に展開ができる(笑) C#だと誰も見向きもしてくれないからなぁ。C++でもかなりきわどいラインだけれど^^;
けど最近はピュアCは書いてないんだよなぁ。C++で綺麗にカプセル化を実現できていないときもままあるけど、コンストラクタ&デストラクタの存在はでかい。初期化し忘れとか開放し忘れがかなり減るからなぁ。
ま、DLL作るならピュアCの方がよほど楽なんですけどね^^; おまけにMATLABからも叩けるらしいし・・・。
MATLABから叩くときの注意とかは調べてみようかな。Cの配列を戻り値にするような関数をMATLABから叩いた場合、扱いとしてはどうなるのかってのは気になるところ。そこいらを意識しないと無駄なもの作っちゃうからなぁ。
あぁ、最近Linuxアプリ作ってねぇなぁ(苦笑)
2009年1月28日水曜日
[プログラム][C++]RS-232Cを叩いてみる
過去に業務で作成したツールをC#でコーディングしたため、メンテが私しかできないという問題と利便性の問題をクリアするため、同ツールのシリアル通信部分だけをC++でコーディングしてみることにしました。
まぁ、社内標準がC言語である中、思いっきりC#で組んでいる私が一方的に悪いので、せめてもの誠意は見せないとね(笑) まぁ、MATLABくらいチーム内での認知度が高ければもう少し違っていたのでしょうが・・・^^;
ま、MATLABも社内標準じゃないんだけどね(苦笑)
で、C++(Windows)でどないしたらRS-232Cを叩けるんかいなーと調べたんですが、多くの場合がMFCやらATLを使ってるんですね。で、個人的にアレがだいっ嫌いなんです。
というかあのフレームワークをさっぱり理解できなかったが故にWindowsでのGUIプログラミングを諦め、LinuxでQtに触れその洗練されたスタイルに惚れ込み、そして.NETで「MFCなんぞ2度と触りたくねぇ」と思い知った私。できることなら今回も触りたくはありません。つか、シリアル通信するだけで、GUIを構築しようとしてる訳じゃないんだからMFCなんてまっぴらごめんという訳です。
で、もうちょい調べていくとWin32APIで実現できるらしいことが分かりました。一応、VB6と.NET2.0(3.5)で通信プログラムは作成していたので、ある程度は分かるつもりでいたのですが、結構勝手が違って戸惑いました。
まず通信プロトコル(であってんのかな?)の設定。VB6や.NET2.0以上にはシリアル通信用のモジュールが用意されているため、そいつをインスタンス化して必要なプロパティを編集すればOKです。
Win32APIを叩く場合でもそれ自体は変わりませんが、そもシリアル通信を詳しくは理解できてないので、設定項目が多すぎて困りました・・・。いえ、確かにきちんと把握しておくべきなんでしょうけれど。
なんとかかんとか通信設定を終え、簡単な命令を送信。で、それが無事に動いたので、後は必要なコマンドをつらつらと実装していざテスト。
・・・、動かねぇ・・・Orz
どうも命令の送信か、あるいは受信に失敗している模様。通信方式は調歩同期式で、フロー制御はRTS/CTSと書いてあったので、ハンドシェイクだと思ったんですが、違ったんですかねぇ・・・? C#のプロパティでは確かにハンドシェイクのところにRTS制御を入れたはず。そしてそれで動いているので解釈としては間違ってないと思うのですが・・・。
また、命令がきちんと実行される場合とされない場合があるというのも厄介。再現性はあるけれどもまだ規則が見えてないんだよなぁ。そも、クエリーを投げても一切応答がないってのはどういうことよ?
可能性としては送信コマンドの内容が間違っている、かな。デリミタ文字が"\r\n"になってるので、コマンド文字列に対してstrcatでひっつけてるけど、この場合ちゃんとstrlenは"\r\n"を文字数としてカウントしてくれるんだろうか・・・? 確かしてくれるって言う風に記憶してるけど、これをきちんとカウントしてなかったら大問題だ。命令が解釈されないことになる。
クエリコマンドを投げても応答がないってことは、送信がうまく行ってない可能性と、受信がうまく行ってない可能性がある。送信後Sleepで1000ms待ってやると応答が返ってくることがあるので、受信側も怪しい。
非同期通信とはいえ、こちらからクエリを投げないと向こうからは応答は一切ないので、受信の際はバッファの中身を空っぽになるまでかっさらうという実装の仕方をしているつもりなんだけど・・・、なんか勘違いしてるのかな。
C#ではうまくいってるんだし、そっちの実装を確認してみるかなぁ。C#はかなり抽象化されてるからあんまりあてにはならんかも知れないが^^;
ん〜、うまく行けば今日中に片付きそうだったんだけどなぁ。長引かせてもしょうがないから明日には片付けよう。
2008年10月30日木曜日
[.NET]VB.NETはかなり生産性高いんだな
会社ではイントラネット内に定形フォーマットのWebページがいくつもありますので、そいつらをパースして必要な情報だけ整理するプログラムとか、日付を抜き出して1週間前になったらメールを投げるようにするとか、色々と考えられますね。
今は毎日のように更新される通知・お知らせのWebページをパースしてRSSを出力するプログラムを作ってます。今日ほぼ完成しました。ただ、直接業務には関係ないため、始業前とか昼休みと言った業務時間外に作成しているので進みが遅いんですが^^;
開発環境はVC#2008EEです。やっぱ.NETは開発がしやすい。HTMLをパースするのも、XMLを吐き出すのも全部フレームワークでまかないきれます。リソースを取ってきて、ちょいちょい組み合わせるだけで作成できるのでほんとお気楽。
ただ、ほんとにこういった細々としたツールを作成するなら、C#よりVBの方がはるかに楽なんだなということはちょくちょく思います。
というのも、同じ.NETのフレームワークを利用するんですが、VBにしかない便利機能ってのも少なく無いんですね。二重起動防止の手段とか、MyComputer名前空間とか。
もちろん、C#はVBではやりにくい複雑な処理を可能にしますが、手軽にさくっと作りたいっていうときはVBの方がやや生産性が高い気がします。
とはいえ、個人的にはC#の方が扱い慣れているのでそちらで組み続けると思いますが^^;
.NETになり、設定ファイルがXMLベースのモノに切り替わりました。それの扱いもかなり簡単になってます。というか、勝手にプロパティとして読み込んでくれるんだから助かる。設定の変更もささっとできるし、Form_ClosingイベントハンドラでSaveメソッド叩いたら変更の保存もお気楽しゃんしゃん。これを使わない手はないよなぁほんと。
さらにさらにClickOnceを使えばインストーラもお手軽に!と来たもんだ。至れり尽くせりだよなぁ。
が、あんまりClickOnceを活用したアプリって見たこと無いんだけれど(苦笑) バージョンアップも自動でやらせることとかできるんだからもっと流行ってもいいと思うんだけどなぁ。
願わくば、VC#とかVBのIDEが完全に.NETで動いてほしい。
そしたらLinux向けのプログラムも生産性が大幅に高くなるのに・・・!!!w
あぁ、ついでにQtもC#からバインディングできるようになってくれないかなぁ。Qtはかなり強力だけど、ちょいとビルド方法が特殊だから慣れるまで大変なんだよぅ>< シグナル&スロットの仕組みは非常に素晴らしいし、フレームワークの質は高いので、積極的に作りたいんだけれどな。
惜しむらくは、それを活かせる能力が自分に無いことか・・・!Orz
2008年8月21日木曜日
[プログラミング]さすがにこれはMicrosoftの力を認めざるを得ない
と言っても今はまだGUI部分しか作っていないので、VBでひたすらにコントロールを貼っつけていっただけなんですが(苦笑)
にしても、さすがはVisualStudio。インテリセンスの補完が素晴らしい。ことRADツールとなればVisualStudioよりも使い勝手のいいものはそうそうないんじゃないでしょうか。
今業務で使っているのはVisualStudio6.0と古いのでVBも.NETではありませんが、それでも十分扱いやすいです。個人的には.NETだともっと助かるんですが^^;
事実、今日始めてVBなんて触りましたが、GUI部分は完成させることができました。タブページを3つもち、入出力サウンドデバイスをコンボボックスにリストしたり、選択したデバイスの出力チャンネルにWAVEファイルを割り当てられるようテキストボックスとコマンドボタン、コモンダイアログを使ってファイルダイアログを開いたり。
.NETならC#でやったことがあるのでもっと楽だったでしょうが、VBでもなんとかぐぐって探し出しました。スピンボックスだけは見つけられなかったのが心残りですが><
もうちょっとVBを扱えるようになるまで時間掛かるかなーと踏んでたんですが、ことGUIをこしらえるだけならほんとすぐできました。まだボタンクリックイベントの実装とかはしてませんが、やることはたかが知れてる(サウンドデバイスを叩いて録音とか再生するくらい)ので、特に問題はないでしょう。納期より結構早めに片付きそうだ。
LinuxにはVisualStudioの快適さに匹敵するほどのRADツールはないんじゃないかな・・・?
MonoDevelopはかなりいい線来てるとは思うけど、あれはまだフォームデザイナは貧弱だったんじゃないかな? KDevelopは完成度は高いんだけど、Qt自体のビルドがかなり特殊であるためにちょっととっつきにくい。ただし、Qtの扱いになれてしまえば.NETに負けず劣らずの有能ツールキットなので、今後使っていきたいRADではあるんだよなぁ。.NETだとOpenGLは扱いにくいけど、QtだとQWidgetクラスと同じような感じでOpenGLをウィジェットとして扱えるから優秀。
また、フォームデザイナとしてはGlade2も結構優秀だとは思うんだけど、GTKアプリは全然作らないので使い勝手については全く把握してません^^; GTKは基本的にCで書かれてる(だったよね?)ってのがどうもしっくり来なくて、あまり使う気にならないんだよなぁ。
で、今日はVBに首ったけだったわけですが、チームでしか使わないツールとは言えそこそこの規模になるので仕様書を書かなくてはいけません。というか、仕様書を書く練習用の課題として出されたような案件なんですな。
ということで明日は仕様書と戦うことになりそうです(苦笑) 仕様書めんどくせー!w
2008年8月14日木曜日
[プログラミング][C#]そいつは仕様が悪いと叫びたい
で、同席したwillがC#の仕事をやらにゃーならんとかで嘆いて居ったので今日ちょっくら調べてみた。
昨日酒の席でちらりと聞いた話によると、大雑把な仕様としては
・saveFileDialogを呼び出す
・が、セキュリティの都合上(?)、○分でそのダイアログを閉じたい
ということのよう。で、C#なんてやったことないし、しかもチーム内にも使える人はいないんだとか。で、仕方ないから受注先に尋ねてみてもあまりよく分かっていないらしい。
しゃーないから色々と調べてみているけれど、どうもまっとうな方法ではできないようで頭を抱えているといった感じ。
つーわけで暇だったこともあり調べてみました。
その結果、「そりゃ仕様が酷すぎると思うんだ・・・」な結果になりましたOrz
まず、saveFileDialogオブジェクトですが、通常こいつを呼出側から強制的に閉じるなんて使い方はしませんからそんな仕様になってません。saveFileDialogを開いた時点でウィンドウの制御は呼出元からダイアログの方に移ります。よーは呼出側は何もできないってことですな。
ということで、そんな無茶を通すにはひねくれたコーディングをせざるを得ません。パッと思いついた方法は
・saveFileDialogのShowDialogを実行するメソッドを別スレッドで走らせ、呼出元のメソッドにてそのスレッドを○分後に落とす
・saveFileDialogに相当するクラスを自作して、ShowDialogをoverrideする
の2つ。
まず前者は、別スレッドを強制的に殺すわけですからAbortくらいしか方法がないらしいということでちょっと気持ち悪い。まぁ要求仕様が気持ち悪いんだからこれくらいどうってことはないかも知れませんが^^;
ということで後者の可能性を探ってみました。
が、こちらも茨の道でした・・・。
というのも、saveFileDialogクラスを継承したら済むと思っていたのにこいつはsealedクラスで継承不可だったんですね。
しゃーねーからと思って1つ上のFileDialogクラスを継承しようと思ったんですがこちらも実質継承不可。従って更に上のcommonDialogクラスしか継承できません。
しかも邪魔くさいことに、commonDialogクラスは抽象クラスであり、こいつ自身はインスタンスを生成できないため、Formクラスの子クラスになっているにも関わらずShowDialogメソッドを実行できない! 正確には実行したところでDialogが出ないと来た。
つまるところ、ShowDialogメソッドを実行した時に表示されるFormは自前で用意しろと。結局のところFormを継承してsaveFileDialogっぽいUIを自前で作れってことじゃねーかOrz
そうなるとぶっちゃけcommonDialogクラスを継承するメリットなんて(今回の案件に限れば)ほっとんどないわけで。
なんぞそれーと嘆いていたらwillから助け船。PostMessageを使えばキーイベントとかを別ウィンドウに投げられるらしいと。
結局、スレッドを作ってsaveFileDialogを走らせ、呼出元でTimerイベントを使って時間になったらPostMessageでキャンセルボタンを押したことにする、という方向で作るみたいです。
ひとまず思いつく上では一番マシな方法でしょうか・・・? まぁ気になる点は一杯あるんですけれどね^^; 例えば、別スレッドで走らせると言うことは呼出元のウィンドウにも制御を渡すことができてしまうわけで、そうなると「呼出元のウィンドウの閉じるボタンが押されたらどうすんだ?」という疑問が〜とか。
やっぱダイアログ自作が一番無難かなーとは思うけど、C#まったく触ったことがないって人にやらせる内容じゃない気はするしなぁ・・・。
個人的にはC#は扱いやすい言語だと思うけど、さすがに全く触ったことがない状態でいきなり継承してoverrideしろってのは酷だと思う^^;
とりあえずはデスマに陥らないで済むことを祈っておくとしましょうw


