0

KeyPlayer ver.1.10

2ヶ月ぶりに「テープ起こし専用メディアプレイヤー」更新しました。

Vectorの方もそのうち更新されるはず。

■変更点

・ウィンドウをアクティブにしなくても(別ウィンドウからでも)キーボード操作できる

 → Ctrl+Shift同時押し+今までどおりのキーボード操作

・再生速度が設定できるようになった

 → 0.01倍~3倍 ただし0.5倍ぐらい以下にすると音が出なくなる?

・ファイルの長さを表示

・「常に最前面に表示」オプション

KeyPlayer1.10

■ダウンロード

KeyPlayer ver.1.10

SourceCode(VisualStudio2005pro+C#2.0)

archive

別ウィンドウからのキー操作に必要なグローバルフック、昨日の時点でかなりわけわからなくてあきらめてたんだけどぬるり。: グローバルフック・ザ・キーボードでHongliangさんがコンポーネントの使用を快諾してくれました。本当にありがとうございます。

しかも俺がコメントで訊ねてからコンポーネントに修正入れてくれた。マジ仕事速い。

KeyboardHook

コンポーネントになっていて、ドラッグアンドドロップで追加してイベント一つ登録すれば動く

Read more

2

C#のDelegateのカプセル化

昨日(前のエントリで)、メインスレッドで動作しているUIのコンポーネントを別スレッドから呼び出す為にDelegateとSystem.Windows.Forms.Control.Invokeを使ったわけだが、今日また色々疑問が出てきたりもう少し調べたりしてだめだ書かないとわけわからなくなってきたから書く。

連載:C#入門 第17回 処理を委譲するdelegateにDelegateについてのコードがたくさん書いてあるが、4ページ目の2番目のコードで、デリゲートを返すgetDelegate()というpublicな関数を作っている所でなんか違和感があった。

関数への参照を既に入れてあるデリゲート自体を返すって、それカプセル化とかどうなんだ?言語仕様的にできるけど、実際使う処理なんだろうか?

少なくとも、俺が昨日作ったPhidgetRFIDの起こすイベントからFormの動いてるメインスレッドに委譲するためのDelegateでは、デリゲート自体を返す必要は無かった。

もうちょっと調べてみると、特集「私がJavaからC#に乗り換えた10の理由」について – Insider.NETというフォーラムで色々書かれていて、

・デリゲートは、関数へのポインタみたいな物だが、正確にはあるクラスorインスタンスのもつ関数へのポインタ(参照)である

・メソッドの持ち主のインスタンスへのポインタも持っている。また、実行時には持ち主のインスタンスのコンテキストで実行される

・デリゲートの関数ポインタはリストになっていて、参照先を複数持たせて呼び出し時に同時実行させられる(マルチキャストデリゲート)だが引数の型は揃えなければならない。

・staticな関数への参照としてデリゲートを作った場合、メソッド持ち主のインスタンスへのポインタはnullになる。また、実行コンテキストはメソッド持ち主のクラスオブジェクトのコンテキストになる

・返り値を持つ関数を複数登録した時、1個目の値は取れる。他は全部破棄される。

あと

「あるインスタンスのあるメソッド」に対するデリゲートの場合は、デリゲート自身が”委譲先インスタンスへの参照”と”委譲先メソッドへの参照(=リフレクションのメソッドオブジェクト=メンバ関数ポインタ)”を保持しておりますので、委譲先インスタンスのコンテキストで委譲先メソッドを呼び出します。

「あるクラスのあるメソッド(staticメソッド)」に対するデリゲートの場合は、”委譲先インスタンスへの参照”はnull参照になっており、委譲先メソッドへの参照のみで、委譲先メソッドの所属するクラスオブジェクトのコンテキストで、委譲先メソッドが呼び出されます。(メソッド参照があれば、該当するクラスオブジェクトはリフレクションにより取得可能ですし)

だそうだ。

とても概念的で難しいが、なんとなくデリゲートの実体と機能がわかってきた。

とにかく、

・関数をリストできて、しかもオブジェクトになる

・関数の持ち主のインスタンスもわかる

・実行コンテキストが、関数の所属しているインスタンスroクラスオブジェクトになる

(コンテキスト=スレッドみたいなもの、ととりあえず思っていたが、どうも違う気がする。以前ちょっと調べた組み込みRTOSのコンテキストスイッチとかもTimer回してスレッド切り替える感じだったし)

System.Windows.Forms.Control.Invokeに引数としてデリゲートを渡すと、任意のスレッドで実行できる

だから何が言いたいかというと、デリゲートを返すgetDelegate();ってメソッドは、デリゲートそのもを渡してしまったら既に追加されてる奴が消されてしまったりとか、Invokeとかで実行コンテキストも自由にされてしまったり、余計な権限を渡してるんじゃないかと思った。

addDelegate(関数名);とかdelDelegate(関数名);というメソッドだけpublicに公開する方がいいんじゃないか?

Read more

2

C#2.0 – PhidgetRFIDkitを使ってみる (あとDelegateとかInvokeとか)

あーこれでようやくPerlとJavaScriptとDSLiteの世界にいけるな。

PhidgetsのRFIDキットをGroupLab.Phidgets.NET Libraryで動かしてみた。本家のPhidgets.comの方にも、PhidgetWebServiceが必要な.NET用ライブラリがあるが、GroupLabのは単独で動く。

あとDelegateとかInvokeとか、VisualStudio2005にしてから制限が厳しくなったThread関連についても下の方に書いた。

単純なRFIDリーダのステータス&読み込んだタグのIDを表示するソフトをVisualStudio2005+C#2.0の環境で作った。→ SourceCode & exe(実行には.NET Framework2.0が必要)

使ったクラスはGroupLab.Phidgets.RFIDのみ。

PhidgetRFIDTest

これがPhidgetRFIDキット

PhidgetRFIDキット

特徴は

・125KHz帯(長波帯)

・USBバスパワーのみで動作

・5Vの出力とLED出力のプログラマブルなポートが付いている

・タグを同時に1枚しか検知できない(2枚以上重ねても落ちることはない)

・常に連続読み取りしかできない

・タグが来た事はイベントで通知してくれるが、無くなった事はイベント通知してくれない

・プラグアンドプレイに対応していて、抜き差しをイベントで通知してくれる

・アンテナと基盤が一体化している

 (基盤のアンテナ中央にスルホールがあるので、自分でアンテナ作って接続出来るかも知れない)

複数同時読み取りできないのに気を付ければ、かなり色んな事に使える。

Read more

2

グラタン(GLANTANK)をファイルサーバとして設定

さて、前のエントリでグラタンをセットアップしたので、今度はファイルサーバとしてNFS,fstab,sambaの設定をする。

3月15日の時点のshokai.orgネットワーク構成も参照。

普段はWindowsのノートPCを持ち歩き、家にはVineLinuxのサーバが動いている。また、たまにWindowsデスクトップを使って発表資料を作ったりもする。

という事でデータのバックアップ・同期がかなり複雑になってきていて、ソースコードや資料が飛んだら本当にヤバイので、グラタンのRAIDミラーリング機能(HDD2台に同じデータを書き込んで、片方が死んでも復旧出来る)を使ってファイルサーバを作ることにした。

グラタンでsambaを使うことで、Windows機なら家の中ならファイルが取り出せる。

VineLinuxのサーバは/home/shoディレクトリそのものをグラタンに置いて、マウントする。家の外からはこいつにSSHでログインしてファイルを読み書きしたりもする。

グラタンは設定を済ませたらデータを守る事+内向きのサービスに専念してもらって、SSHでログインする事はない。外向きはVineの方に任せる。

これで、Windowsのエクスプローラでローカルにあるのと同じように画像編集して、xyzzyでPerl書いて保存したら即実行できたり…とかなり便利な環境になった。

Windows-グラタン間のファイル同期は俺が1年の春に奥出先生の授業で同じグループになった吉本社長のRealSyncが便利。LAN内でフォルダ間の同期が取れるシンプルなソフト。

というわけで、

・NFSでのmountの設定

・sambaの設定

をメモる。

Read more

4

グラタン(GLANTANK)をDebianモードでセットアップ

GigaEther版新白箱(SOTO-HDLGW)にMaxtorの7200rpm MaxLine III (16MB/Cache) 7L300R0 300GBというHDDを2台接続して、Debianモードでセットアップした。

うちのサーバールーム(机の下 けっこう冷えてます)

グラタン設置

Debianまっさらインストールなのでwebブラウザ経由での設定ができないが、普通のLinuxマシンと同じようにaptでSSHをインストールして、sambaやNFSを動かしている。

shokai.orgネットワーク構成

うちではグラタンをファイルサーバとして運用し、外向けのサービスは別のマシンでやる事にした。

グラタンにはRAID機能が付いているので、データは多分なかなか飛ばない。

全マシンのデータをグラタンに置いて、sambaかNFSでマウントして使う事で安全に運用できる。

また、インターネットさえあればどこからでもSSHでログインして、データを取り出せる。

グラタンのDebianモードでのセットアップは、オープンソースマガジン3月号の特集で、こないだ俺がHDD間違えて買おうとした時止めてくれたkinnekoさんが詳しく書いている。というか、買ってびっくりした。そりゃ詳しいわけだ

セットアップもだけど、コラムの「フタの開け方」が一番俺を救ってくれた。

ちなみに「インストール」というのは、デスクトップPCにHDDを接続して、グラタン付属のCDからブートしてメニューにしたがってインストールするという事。詳しくはPCパーツブランド『挑戦者』GLAN Tank(SOTO-HDLGW)製品紹介に書いてある。

■Debianモードセットアップ手順

1.HDD1にDebianモードでインストール

2.HDD1をグラタンに接続し(ブザーが鳴り続ける)、初期化を待つ(鳴りやむ)

3.HDD2にリカバリモードでインストール

4.telnetでログインできるように、「インストール」の時と同じ手順でCDからブートしてインストーラをCtrl+Cで抜けてmountして設定ファイルを書き換える

5.HDD2をマスタに、HDD1をスレーブにしてグラタンに接続。もう使える。(自動でRAID化されてる)

このtelnetでログインしてみてから、haltして電源を切る。その後ケースを組み立てる。

手順の中で4と5が難しいのと、家の環境に合わせてちょっといじったので詳しくメモする。

あとHDD間違えないようにラベリングしとくのも重要だ

ラベリングは大事

Read more