Home > programming Archive

programming Archive

.NetのSerialPort.isOpenプロパティが不思議な動作をする

C#でアプリをシリアル通信を行うソフトウェアを作っているのだけれど,良くわからない挙動に出会ったので,メモ.

通常,このようにすれば,アプリからCOM1ポートを開く事が出来る.

serialPort = new System.IO.Ports.SerialPort();
serialPort.BaudRate = 38400;
serialPort.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(serialPort1_DataReceived);
serialPort.PortName = “COM1”;
serialPort.Open();

しかし,シリアルポートって言うのは通常,一つのアプリからしか利用することができない.このため,既に他のアプリがシリアルポートを使っていないかを確認する必要があり,このために,isOpen()プロパティがある.普通はこんな感じで使うと,ポートが開いているかどうかを知ることができる.

if(serialPort.isOpen){
    serialPort.Open();
}

ところが,このプロパティの戻り値がおかしい.ちゃんと調べてはいないんだけれど,私の環境ではこんな感じ.

  • 他のアプリ(puttyやpoderosa)からシリアルポートを開いているとき→正常
  • 同じアプリ(アプリの多重起動)からシリアルポートを開いているとき→異常

少し調べても結局原因がわからなかったので,例外処理を使って回避することに.

try
{     serialPort.Open();
}
catch {
     ;
}

例外処理をこういう風に使うのってあまり好きじゃないんだけど,とりあえず回避出来たので一安心.

C#でBitmapの比較

一定時間毎にWebブラウザのウィンドウをキャプチャして,変更の有無を検出するコードを書いていたんだけど,ちょっと引っかかってしまったのでメモ.

最初,BitmapクラスにはGetHashCodeというメンバ関数があるから,ハッシュを取得してそれを比較すれば良いだろう,と簡単に考えていた.ところが,GetHashCodeというのはオブジェクトのハッシュを返す関数であり,画像データのハッシュを返すわけではない.つまり,この関数の返り値を比較しても,画像の内容が等しいか否かを判断することが出来ない.

じゃぁ,1pixelごと比較すれば良いのかと考えたのだけれども,BitmapクラスのGetPixelメソッドって,メチャクチャ遅い.そこで,Bitmapの中身をbyte配列に代入して,そのMD5をとることでハッシュ値を取得し,それを比較することで画像の変更の有無を検出することにした.

以下,具体的なコード.これだけの事なんだけど,思ったよりも時間を取ってしまった・・・.

Continue reading

“人生を書き換える者すらいた。”の迷路問題を解いてみた

今更感はあるのだけれど,気分転換に下記のブログで紹介されてた問題を解いてみた.

人生を書き換える者すらいた。 人材獲得作戦・4 試験問題ほか

かかった時間はたぶん60分ぐらい.アルゴリズム的にはA*アルゴリズムを使えば良いらしいけど,正直なところ,よく知らないので,適当に自分で考えてみた.

基本的な考え方としては,距離1で行ける場所,距離2で行ける場所,距離nで行ける場所を順にピックアップしていき,距離nでゴールまで行けるようになったら,そこから逆に最短となる経路を探す,といった感じ.

コメント欄を見てると30分とかで解いてる人も居るっぽいので,私はまだまだだなぁという感じですね.せっかくなので,ソースコードを公開してみます.あんまり綺麗なコードじゃないので,参考にはしないほうがよいと思うけど.

 

Continue reading

TwitterネイティブWebアクセス解析 LogTwitを作りました.

LogTwit.com という新しいサービスを作ったのでちょっと宣伝.

image

以下,本サービスについて説明します.

Continue reading

PHPからTwitterに投稿する

今さら出遅れた感も満載なんですが,Twitter連携のサービスを作ってみたくなったので,どうやったらTwitterAPIを使えるのか調べてみた.

TwitterからPHPに投稿するためには,色々な方法があるみたいなんだけど,とりあえず手っ取り早い方法として,PEARパッケージのServices_Twitterを利用することにしてみた.

Continue reading

仮想シリアルポートを用いた快適デバッグ環境の構築

PCと他のデバイスを連携させて動作するアプリを開発するのって,実は結構面倒なんです.なので,いかにして効率よく開発するかが至上命題なわけです.

あまりにも不便なので,こんな感じでUSB2シリアルケーブル2本と,クロスのメスーメスシリアルケーブルを使って,簡単な動作確認に使おうかなぁとか思っていました,

image

で,これができるならパソコンの中に仮想的にCOMポートを作ってやって,それ同士で通信させれば良いんじゃないの?ということで,それっぽいソフトがないか探してみたところ,Null-Modem emulator(com0com)というソフトの存在を知りました.

Continue reading

MySQLでAuto Increment利用による速度低下

Webアプリを開発する時に切っても切れない関係にあるのがMySQLなどのRBBMSです.これらをいかに上手に扱うかが,エンジニアリングの面白いところでもあり,難しいところでもあります.

私は今までデータベースでテーブルの設計をするときには,各テーブルに通し番号を記憶するためのフィールドを作成して,Auto Incrementで番号を振っていました.

こうしておくと,私が何も考えなくても(Insert文でNULLを指定しておけば),各レコードに連番が付与されるので,非常に便利です.

ただ,知ってる人からすると当たり前じゃんと思われるかもしれませんが,Auto Increment属性を指定すると,Insertの速度が遅くなってしまうんですよね.というわけで,どれぐらい速度が遅くなるのか,実際に調べてみました.

Continue reading

現在アクティブになっているウィンドウを取得する

C#で現在アクティブになってるウィンドウを取得したかったので,色々調べてみた.その結果,GetForegroundWindow関数を以下のように使うと良いらしいことがわかった.

こうすることで,プロセスの名前を取得することができるし,特定のウィンドウがアクティブになっているかどうかを確認することもできる.

Continue reading

PHPでステップ実行しながらデバッグする方法

「PHPで書かれたソフトウェアのデバッグをするときって,ステップ実行ができないから,print_r関数や,var_dump関数を使わざるを得ず効率が悪い」

こう思ってる人が結構いるようなんですが,実は勘違いです.というかこれは過去の話です.最近は,ZendDebuggerというものを使うことで,PHPでもステップ実行しながらデバッグをすることができるようになっています.

このことって,PHPエンジニアの人でも知らない人が結構いるような気がしてきたので,以下,ローカル環境でPHPをステップ実行しながらデバッグする方法について書いてみます.

Continue reading

mixiアプリ開発の落とし穴

mixiアプリが流行しているようです.

参考:mixiアプリ効果 PC版mixi、9月のPV・滞在時間が急拡大

この機会に,mixiアプリでも作ってみようかなという方も居るのではないでしょうか.

そこで,Webアプリの開発に慣れていない人がmixiアプリを開発するにあたって,見落としがちなポイントについて紹介します.

Continue reading

Home > programming Archive

メタ情報


Return to page top