まどかの 日記

[2003/02/03〜2003/02/09の日記]
[2003/02/10〜2003/02/16の日記]
[2003/02/17〜2003/02/23の日記]
[2003/02/24〜2003/03/02の日記]
[2003/03/03〜2003/03/09の日記]
[2003/03/10〜2003/03/16の日記]
[2003/03/17〜2003/03/23の日記]
[2003/03/24〜2003/03/30の日記]
[2003/03/31〜2003/04/06の日記]
[2003/04/07〜2003/04/13の日記]
[2003/04/14〜2003/04/20の日記]
[2003/04/21〜2003/04/27の日記]
[2003/04/28〜2003/05/04の日記]
[2003/05/05〜2003/05/11の日記]
[2003/05/12〜2003/05/18の日記]
↑過去3ヶ月くらいの日記はこちら↑

まどかは「P/ECE Hand Book」を応援しています


0590
2003/05/25()
 以前いた社員さんと再会飲み会(^^
 えー、今日はお休みの日なのですが、隔週って感じで、月曜日から某番組の収録に参加しにいくので(もちろん仕事でですが(^^;)、収録がある前日の日曜日は夕方から新幹線で東京に向かい、明日の朝から楽屋入りします。


 で、今日は東京で、以前うちの会社に勤めていて、やっぱりデザインの勉強がしたいと言うことで辞めていかれた先輩社員さんが、この度専門学校を卒業され、東京で雑誌の編集などをやってる会社に見事第1志望で合格されたので、そのお祝いを兼ねて、渋谷でちょっと飲み会をすることになってました。

 なので、午前中はのんびりして、午後はいつもよりちょっと早めに家を出て、東京・渋谷に向かいました。
 そして、渋谷駅でその元社員さんと再開し、色々な話をしながら呑み屋を探し、飲み会開始。

 その元社員さんは私の嫁さんとも面識があるので、嫁さんからビーズのマスコットをプレゼントしました(^^


 で、10時半くらいで飲み会も終わり、渋谷から井の頭線で、駒場東大前駅から徒歩5分くらいのところにある、「こまばエミナース」という宿泊施設に向かったのですが、ここは門限が10時くらいなので、着いた頃にはもうまっくらで、警備員さんに連絡して開けてもらって、ようやく入ることが出来ました(^^;

 ほんとに、外の照明もついてなく、まっくらでちょっと焦りました(^^;

 というわけで、今日はここままホテルでのんびり持ってきた本を読んだりしてから寝ました。

 明日は朝から某番組の収録です。
 それでは、おやすみなさーい。

0589
2003/05/24()
 楽しく過ごしました(^^
 はい、今日はお休みの日なので、昼くらいまで寝て、昼からは大須方面にお出かけしました。

 今日の目的は本屋巡りで、いろんな本屋を回り(BOOKOFF含む)、マンガやプログラムの本を色々買ってきました。
 なんか、最近は私は本を買うのがストレス発散になっているみたいで、ちゃんと買ってきた本は出張の新幹線移動中や仕事が終わってからのホテルで読むようにしてますが、結構買うだけでも満足してます(^^;

 で、今日は日経ソフトウェアと、MFCもちゃんと勉強しようと思って(SDKではバリバリ開発できますが、MFCはなんか苦手(--;)MFCの解説本などを買ってきました。

 この他に、この本も欲しかったけど、ちょっと高いし今度の出張に持っていくのにはかさばるので、また今度にしました。最近やってるC++Builderの仕事がネットワークがらみなので、この辺の分野にも結構興味が出てきてます(^^ できれば自分専用の使いやすいメーラとか作ってみたいですね。

 で、本屋の他には、嫁さんの趣味のビーズ屋に行ったり、近くの薬局が今日ポイント3倍デーなので、はりきって買い物に行ったりし、家に帰った時には夕方の6時になっていて、今日は友人が最近1週間程入院して無事退院できたので、その快気祝いとして食事をする予定だったので、家に帰って荷物を置いたあと、すぐに友人宅に向かいました。

 食事をするのは友人宅向かいの串屋で、楽しく夕食の時を過ごしました。
 食事の後は友人宅にお邪魔して、ゲームをしたりいろいろお話して、日付が変わる頃に帰りました。
 
 久しぶりに長いことお話ができて、とても楽しかったです(^^

 明日はまたお休みなのですが、夕方から出張に出かける予定です。
 いつものように、ある番組の収録に参加してくるので、来週の火曜日まで帰ってきません(^^;

 それでは、おやすみなさーい。

0588
2003/05/23()
 今日は細かい部分を
 えー、今日も引き続きC++Builderでの仕事です。

 昨日までで表示周りの山場は越えられたので、今日はTCP/IP通信での1対多のクライアント・サーバシステムの構造について色々考えていました。

 今まで、2つか3つくらいまでのクライアントは扱ったことがあるのですが、今回のものは仕様上最低でも256個のクライアントが想定されているので、どうやれば沢山のクライアントを相手に出来るかについて考えをまとめていました。

 でもまぁ、とりあえず受信のイベントでクライアントが個々に持っている受信バッファにデータを溜めていき、その内容をポーリングするタイマーを用意して、あとはぐりぐり回すって感じかなぁ。

 一応、毎回全部のクライアントを順番に回るのは効率が悪いので、受信があったクライアントだけを優先してチェックするという機構でやってみました。このポーリングタイマーの他にクライアントの生存確認やタイムアウトなどのタイマーも用意しないといけないので、まだまだ先は長そうです。

 ちなみに、ビルダーのタイマーはVBと違って30個とか置いても、多少間隔は開いてきますが、あるタイマーだけずーっとイベントが来なくなるということはないみたいなので(400個のタイマーで実験してみました)、安心してタイマーを使えます。まぁ、せいぜい10個くらいまでですが(^^;

 今回は久しぶりのC/C++言語でのツール開発なので、STLとか関数ポインタとかVBでは使えなかったテクニックを使いまくりです(^^ ああ、ビルダーは楽しいなぁ。C言語は楽だなぁ。ポインタ最高。

 というわけで、楽しみながら開発していたら、日付が変わってしまったので、今日はこれで帰ります。

 明日はお休みなので、嫁さんとお出かけする予定です。

 それでは、おやすみなさーい。

0587
2003/05/22()
 苦労しました(^^;
 はい、今日も引き続きC++Builderでのネットワークがらみの仕事です。

 で、今日は昨日見つけたCreateProcessやら"arp.exe"を利用して接続元IPのMACアドレスを取得する方法ですが、やっぱりDOS窓が開いちゃって(開く位置を画面外に設定しても、タスクバーには出ちゃう)かっこ悪いので、却下になりました(j−j

 で、また調べていくと、Internet Protocol Helper(Platform SDK)のGetIpNetTableAPIがWin98・NT4.0SP4以降対応で良さげなのを発見し、やっぱりPlatformSDKはいるんだけど、試しにこのAPIが定義されている”IpHlpAPI.h”を検索してみたら、なんとC++Builder6には標準であるではないですか!
 ちなみに、”IpHlpAPI.lib”は通常の[Lib]フォルダの中の[Psdk]フォルダにあるので、Libファイル検索用のディレクトリに[Psdk]を追加しないといけないですが、標準でこのAPIが使えることが判明しました。
 
 お客様もこの開発のためにC++Builder6を用意するはずなので、問題ありません。やったー。

 というわけで、実際のコーディングはこれを参考にしながら早速実装&テスト。
 ……バッチリです(^^ Win98もNTもちゃんと動きます。

 ただ、注意しないといけないのが、IPネットワークテーブルのサイズを取得するのに実行する、
 
  GetIpNetTable(NULL,&dwSize,TRUE);
 
 ですが、ちゃんと最初にdwSizeを0で初期化しておかないと、とんでもなく大きな値が返ってきて、そのままその大きさでメモリを確保すると、動きはしますが大変無駄です。

 ちなみに、Win2000,Win98ではエラーになりませんが、NTでは落ちます(^^; 私は、第1引数にNULLを指定すればdwSizeに必要なバッファサイズが返ってくるものと勘違いし、NTだけエラーになるというバグに30分ほどハマリました(--; 今思えば、よくぞNTでエラーになってくれた! ってとこですね(^^; 

 さて、ようやくMACアドレス取得の問題が解決したので、次は接続したクライアントのリストを表示する部分の実装に取り掛かりました。

 お客様が決めた仕様では、クライアントはエクスプローラ(詳細)風で、項目が隠れている場合はToolTip(ビルダーではHint、その他InfoTip、バルーンヘルプとかいうやつ)で全部の文字列をポップアップ表示させるというのになっていて、エクスプローラ風ならTListViewだな、と早速作り始めたのですが、まったくもって上手くいきません(j−j

 そもそもTListView(新しいやつね)が標準で表示してくれるHintは詳細表示のエクスプローラでいう「名前」のところだけで、実際にこの仕様を実現しようと思ったら、まずTListViewには頼らずに、TApplicationのOnShowHintイベントを乗っ取って、Hint表示を自分でカスタマイズしちゃう方法をとり、さらにマウスカーソルの位置にあるTListViewの項目の位置や内容を取得するルーチンなどを駆使して実現するわけです。

 だいたいのやり方はここに書いてあるんだけど、ここのやり方だと実は完璧ではなくて、Hintのフォント(Screen->HintFont)とTListViewのフォントを合わせたり、リストのスクロールを考慮して、項目の表示領域を求めたり、いろいろ工夫しないといけません。苦労しました(--;

 しかし、やっぱりここまでがんばってもどうしようもないことがありまして、実はここまでの方法でちゃんとマウスカーソルの位置にある項目に合ったHintを表示させることが出来るのですが、そのHintとは別にTListView自らが表示するHintが重なって出ちゃうんです。
 これは、プロパティをいぢるとかでどうにかなる問題ではなく、もちろんサンプルにあるApplication->CancelHint()でも消えません(これをやると自分で表示する方のHintが消えてしまう)。

 で、何か方法はないものかと、Pascalで書かれたTLilstViewのソース(Professional以降に付いてくる)を見ていると、あることに気付きました。

 そのあることとは、「重なって出てくるHintはVCLのTListViewクラスが出しているものではない」。
 はい、ちょっと前の文で”TListView自らが表示する”と書いてしまった通り、このHintはVCLの元になっているWindowsのListViewコントロールが出しているもので、TListViewは最初の項目が隠れたらHintを表示するというスタイルを設定してListViewコントロールを生成しているんです。

 もともとのコントロールのスタイルで設定されちゃっているものなので、ラッパーであるTListViewクラスがそのスタイルの変更をサポートしていない限り、これをTListViewからいぢることはできないわけで、ではどうやってそのスタイルを解除すればいいかと申しますと、ListViewのウインドウに対して直接スタイル解除を行ってしまえばいいんです。

 いくらVCLでラッピングされていても、もとは普通のウインドウコントロールに過ぎないので、普通にSetWindowLongなどのAPIを使えば自由にスタイルを変更することができます。

 が! このListViewの項目が隠れたら自動でHintを出すというスタイルはComctl32.dllのバージョンが4.71以上(IE4以上)という条件で、SetWindowLongではなく

  SendMessage(hListView,LVM_SETEXTENDEDLISTVIEWSTYLE,
           LVS_EX_INFOTIP,LVS_EX_INFOTIP);

 というので設定してやらないといけない拡張スタイルなるもので、このスタイルを解除するためには、

  SendMessage(hListView,LVM_SETEXTENDEDLISTVIEWSTYLE,
           LVS_EX_INFOTIP,0);

 とします。
 詳しくは、こことかここを見てください。

 とてもとても長くなってしまいましたが、私はこんなような苦労をして色々がんばっているわけです。
 けど、公開するソースコードを見るお客様はこんな苦労は全然知らないんですよねぇ。なんか結構がんばっただけに寂しいです。お客様はプログラマでは無いようなので、こういう処理は普通に出来るものと思っているんでしょうねぇ。特に、エクスプローラ風とか書く辺りが、エクスプローラでできてるんだから普通に出来るんでしょって感じですね(--;

 と、書いてみましたが、それなりにこちらが苦労しているということは判って頂いているようなのでいいんですけどね(^^;

 明日も引き続き、ビルダーでの開発です。

 それでは、おやすみなさーい。

0586
2003/05/21()
 色々知識を蓄えました(^^
 えー、今日はずーっとC++Builderの仕事をやってました。

 昨日TCP/IP-RS232Cコンバータの設定ができたので、今日はTCP/IP通信処理の続きをしました。
 で、今回の開発では、接続してくるクライアントをIPアドレスやMACアドレスで識別しないといけないという仕様があり、クライアントのIPはソケットのリモートアドレスとかを参照すればすぐわかるので問題ないのですが、MACアドレスはどうやって取得したら良いものか……(--;

 それで、色々調べていくと、いろいろ方法が見つかったわけで、いちばん簡単なのはPlatform SDK(Internet Protocol Helper)のSendARPっていうAPIを使えば、IPアドレスからその接続先のMACアドレスがわかるのですが、Windows2000以降専用なので今回の開発では使えません。実は、今回の開発でのターゲットOSにNT4.0も含まれているのです(j−j
 (ちなみに、SendARPでMACアドレスを取得する方法は、英語のMSDNのやり方と同じやり方だけど日本語のサイトのここ。)

 また、今回はソースコードも公開する約束なので、Platform SDKというものが別途インストール必要なコードはあまりよろしくないと思い(っていうか、お客様の方がいれるの面倒くさがって嫌がるだろうから(--;)、他の方法を一日ずーっと探していました。

 で、見つけたのが、パイプを利用してCreateProcess APIで呼び出した"arp.exe"のリダイレクト出力を取得し、その結果を解析するというやり方。
 
 えー、まずコマンドラインで

  C:\>arp -a

 ってやると、現在接続しにきているマシンのIPアドレスとMACアドレスが表示されます。

 で、Command.comの機能で入出力先を変える”リダイレクト”というのと、あるプログラムの出力結果を別のプログラムの入力につなげる”パイプ”っていうのがあって、

  C:\>arp -a >arplog.txt

 とすると、arp.exeの結果が画面ではなく"arplog.txt"(勝手に生成される)に保存されます。(リダイレクト)

 で、パイプはCreateFile APIで作ることができ…… まぁやりたいことの詳細はここを見てください。
 リダイレクト・パイプについてはこことか。

 この方法を使うと、標準の開発環境でWin98でもNTでも動くものが作れちゃいます。arp.exeはWin98にもNTにも入ってますしね。
 ちなみに、このarp.exeはARP(あーぷ:Address Resolution Protocol)を使ってMACアドレスなどの情報を取得しています。

 とういところで、今日は遅くなってしまったので、「でもCreateProcessを使うと確かDOS窓開いちゃうんだよなぁ」とか、ちょっと心配しながら明日この方法を試す予定です。

 それでは、おやすみなさーい。

0585
2003/05/20()
 残念なことに……
 えー、今日は予定通り、午前中と午後のちょっとくらいでVBの方の仕事をやり、大体修正する個所は修正し終わったので、続いてC++Builderの仕事をやってました。

 今回、C++Builderの仕事では、TCP/IP-RS232Cコンバータなるものを使用して、ネットワークを介して遠方にあるシリアル通信機器を制御するという仕様があり、いつものシリアル制御のプログラムに加えて、TCP/IPでのサーバプログラムの技術が必要になってます。

 で、C++Builderでのサーバプログラムは初めて書きますが、以前作ったサンプルプログラムで、TServerSocketコンポーネントを使うと意外に簡単にできそうなので、今日からそこら辺の実装に入るのと、TCP/IP-RS232Cコンバータの設定を色々やってました。

 で、マニュアルとにらめっこしながら数時間後ようやく接続することができました(^^;
 LANケーブルで直につなぐのではなく、普通にネットワーク上の1機器としてつなぐので、当然デフォルトゲートウェイの設定も必要なのですが、説明書にはデフォルトゲートウェイが何なのかとかいう説明が全く無いので、こういう機器を使うにあたって、こういうネットワークの知識は常識なんだなぁと思いました。

 コンバータの設定ができたところで、サンプルで作ったサーバに接続させて、接続完了のメッセージでひとりご満悦(^^

 パソコンじゃない機器とTCP/IPで接続するのは初めてなので、ちゃんと接続できるのにビックリしました。
 カニさんマークのチップを使ってLANに接続できるH8のキットをみたことがあるので、これもそんな感じで作ってあるのかなぁ。あのチップを使えばP/ECEでもLANに接続とか、クライアントとして動作させることができたりするのかなぁ。なんか面白そうですね。

 ただ、LANに接続できたとしてもP/ECEでできることはあんまりありませんが(^^;
 どこかにサーバを立てて、ネット対戦とかはもしかしたらできるかも知れませんけどね。多分I/Oピンの数が足らないんでしょうけど。

 と、仕事の話はこれくらいにして、今日実は、先日母校の工業高校でうちの会社に誘ったロボット部の後輩からメールがありまして、うちの会社への就職は、親に地元に残るよう強く要求され考えた結果、地元に残ることにしましたという報告がありました。

 非常によく出来る子なので、ぜひともうちの会社に欲しかったのですが、仕方が無いです(j−j
 
 というわけで、今日はここまで。
 
 明日も引き続き、C++Builderの仕事をやる予定です。

 それでは、おやすみなさーい。

0584
2003/05/19()
 なんか普通に過ごしました
 はい、今日は予定通りC++Builderの仕事をいそいそとこなして、15時半くらいに後輩が来たので、C言語の勉強を見てあげて、またC++Builderの仕事の続きをして帰りました。

 なんか、C++Builderの仕事もまだまだ終わらないし、先週現地で作業してきたVBの仕事もまだ続きがあるし、来週は某番組の収録があるので行かないといけないし、やることはたくさんあるのですが、なんか気分的にはちょっと仕事が落ち着いてきた感じです(^^; (なんか忘れていないかなぁ、大丈夫かなぁ?(^^;)

 で、今日は後輩にC言語の関数をちょっと教えたりしてました。
 まだ、処理の流れがちゃんと把握できていないようなので、何度も同じように説明し、反復することで覚えてもらうことにしています。
 
 まぁ、でも初心者に処理の流れを追えだとか、コンピュータの仕組みから処理を理解するのは難しいよねぇ(^^; がんばってよ、後輩。

 というわけで、今日はここまで。
 明日も引き続き、C++Builderの仕事をするか、VBの方をやる予定です。

 それでは、おやすみなさーい。