0

C#2.0 – 無名関数をControl.Invoke()する

参考:ControlクラスのInvokeメソッドで匿名メソッドを使うには?[2.0のみ、C#] − @IT

GUI描画とは別スレッドから、GUI要素を書き換える時

this.Invoke((MethodInvoker) delegate() { /* GUIの操作*/});



MethodInvoker func = delegate() { /*GUIの操作*/ };
this.Invoke(func);

でいい。

例えば

try{
this.Invoke((MethodInvoker)delegate(){textBoxMsg.Text+="hogehoge";});
}
catch(Exceptionex){
Console.Error.WriteLine(ex.Message);
}

とか。

GUIと別スレッドからGUI要素を書き換える時は(例えばSocket通信を受信するためにThreadを立てて回している時など)

Form.Invoke(Delegate)を使わないとデッドロックが起こってしまうのでC#2.0からは直接スレッド越えのメソッド呼び出しができなくなった。

これは1年ぐらい前に勉強して理解できた。

s.h.log: C#のDelegateのカプセル化

s.h.log: C#2.0 – PhidgetRFIDkitを使ってみる (あとDelegateとかInvokeとか)

でも毎度Delegateを使っていると、ちょっとGUI要素を変えたいだけなのにゴミのような関数が大量に必要になってしまう。そこでLLでよくやるように無名関数でInvoke()を実行したかった。

しかし、C#の無名関数(匿名メソッド)の宣言と実行の方法は

delegate d = delegate(){ /* 処理 */ }; // 宣言
Thread th = new Thread(d); // 登録
th.Start(); // 無名関数呼び出し

で、Threadから呼び出す。

参考:MSDN: 匿名メソッド (C#)

これだと、GUIスレッド外からGUI要素を書き換えられない。Thread.Start()ではなくControl.Invoke()を使わなければならない。

Control.Invoke()の引数であるDelegateは無名関数宣言のdelegateとは別の型で、直接キャストができない。

が、なぜかMethodInvoker型にするとできる。

よくわからないけどとにかく

this.Inovoke( (MethodInvoker) delegate(){ /* 処理 */ });

でいける事がわかってコードがすっきりした。

1

C#講座01 SerialPortクラスを使ってArduinoと連動させる(1/2)

VS2005 C#のSerialPortコンポーネントを使って、Arduinoとシリアル通信して連携する方法をビデオ撮ってみた。

今回はマイコン→PCの一方方向だけしかやらなかったので、逆はあとでやる。

VisualStudio C#.NETで

・新規ソリューションを作る

・その中に新規プロジェクトを作る

・ボタンやシリアルポートコンポーネントなどを配置してみる

・コンポーネントにイベント登録する

という事を解説してみた。

ソースコード一式

今回書いたのはこれだけ。でも、これもほとんどVisualStudioに自動生成される。

publicForm1()

{

InitializeComponent();

Console.WriteLine(“start”);

}

privatevoidserialPort1_DataReceived(objectsender,System.IO.Ports.SerialDataReceivedEventArgse)

{

Console.WriteLine(serialPort1.ReadLine());

}

privatevoidbutton1_Click(objectsender,EventArgse)

{

serialPort1.NewLine=”¥r¥n”;

serialPort1.Open();

}

0

VGAケーブルを作る

いろいろあって、短めのVGAケーブル(PCから出てるモニタ出力のアレ)を自作した。

参考:The Lektropacks AV Guide – 15-pin D-Sub (VGA) Connector Pinout

ちゃんと出た。

VGA Cable

Read more

1

実装はデザインのため

これはすごく同意。

最近のプロジェクトを見ていると、奥出研で言うコンセプトができ上がって、粘土こねてなんとなーく、作るモノが見えてくると、途端にみんな手を動かすのをやめて(Craftingをやめて)、電子回路とソフトウエアを洗練することに集中します。まるで暗黙の了解があるかのように、モノの形や人々がふれる部分・場所のデザインがスライドの中だけで語られていること、よくあります。なんか、まずいなあ、といつも思います。

出展はちょっと前のうちの研究室のメーリングリスト。

さて、同意なんだが、コレ読んでからちょっとモヤモヤしていたんだけど、最近まとまってきたので書く。

結論からいうと、みんなの言う「実装」は実は「設計」の事だ。ソフトウェアやハードウェアの実装を、工場の製造のメタファーで見ているから間違える。

手を動かしながら、時には寸劇をしてみたりして、こんなものが欲しいなあというのを考えて、いきなり「実装」しますとか言い出すんだ。これがおかしい。

もちろん俺自身も動くモノを作る=「実装」は割と得意で、好きだ。でも作って終わりじゃない。

Teleshadowは、動くプロトタイプができるまで、「これは一方がこっちを見ていて、でもこっちが他の人を見ていたら、覗かれているみたいでちょっと気持ち悪いんじゃないか?」とか気づかなかった。

あるいはPileusの地図も、動くプロトタイプができて自分で使ってみて初めて、これがあるとどういう風に都市とのインタラクションが変わるのかわかった。

まず、世の中に今存在しないものを頭の中で作るのではなく、それに近いプロトタイプを作って、それの存在する世界を感じ取らないといけない。そうすると、いかに自分が最初に考えていた「理想のモノ」が想像力不足だったかに驚く。動いているモノが目の前にあると、考慮しきれなかった部分が見えてくる。

で、「実装」の話。「ソフトウェア工学」とかでぐぐるといっぱい出てくるけど、コンピュータのソフトウェアをプログラミングするのは「製造工程」ではなく「設計」です。

コンピュータは、設計図がそのまま動いてしまう、という不思議なものだ。これを工場の製造のメタファーで見るから間違える。

プログラムを書くのは、きちんとした設計図を書いているのと完全に同じだ。もし動かなかったら設計が悪い。

コンセプトとかUMLとか口と頭で言って設計して、あとは実装、と考えるのはおかしい。

工場生産で言う設計図を書く = コンセプトとか形を作るまでの部分

工場で言う生産行程 = プログラムを書く

というのが間違い。

ここで音が鳴って、とかこの順番にデータ取ってきて、というインタラクションのディテールはむしろプログラム書いている時に思いつく。

プログラムを書くのは試行錯誤の繰り返しで、とても創造的な作業だと思う。

俺たちの普段使っている日常言語では、インタラクションのディテールやコンピュータの動きの詳細までを記述する為には粒度が荒すぎる。「こっちを押したらこっちが動いて」程度なら問題なく人間語からコンピュータ言語に翻訳できるが、例えば同時に複数の時間軸が動いている場合や、もっと緻密な論理的条件は記述できない。言語モードをもっと、日常語からプログラム言語まで下げないと記述しきれない。

モノの形を考える時に、言葉ではなくスケッチで、スケッチよりディテールに踏み込みたかったら粘土や彫刻や色々やったりするのと同じように。音の事を考えるときに音符や波形や実際に楽器鳴らしてみたりするのと同じように。インタラクションのディテールを語る時にはプログラム言語までちゃんと踏み込み、モノをデザインする時にはもちろん、そのモノを使った寸劇とプログラムとの間を行ったり来たりしなければならない。

そして、なによりプログラムで設計すれば、その論理や時間の流れが正しいかどうかすぐ確かめる事ができる。

みんなの言う「実装」は既にある設計図=「デザイン」をそのまま動くように実現、生産する事の様だけど、そうではなく、最初に頭の中で考えていたモノを超えるような作り込みをする創造的な作業であるべきだ。

なので、コンセプトを作って機能設計をするまでを「設計」とか「デザイン」とか呼んで、プログラムを書く部分を「実装」と呼ぶのはおかしい。いや実装なんだけど、なんか「製造」とかいうルビが振ってるように聞こえる。

まとめ:プログラムを書いて動かす所までちゃんとやって、意図したとおりにモノが働いたら、はじめてデザインがちゃんとできたと言える。そうでなければ、実現できないモノを描いたデザインが間違っている。

(いやいや、正しいデザインというのは現代の技術で工場で生産できるようにパーツ分割まできっちり考えられたものですよ、というのもある?)

だから、今よりもっとちゃんとプログラムを書かないといけないですよ俺は。

0

PHP/KamiWikiインストール

いろいろ試した結果KamiWikiがしっくりくるのでインストールログを公開。

KamiWikiにはwikiの整形ルールは無い。

URLを貼ったら自動リンクされるのと、ページ名と同じテキストの部分がリンクになる。

(画像のURLはimgになる)

紙copiと同じノリでガシガシ書いて行ける。

■MacBook OS10.4 にインストール

php、apachectlなどのコマンドがある状態で

$ sudo cp /private/etc/php.ini.default /private/etc/php.ini

$ sudo emacs /private/etc/httpd/httpd.conf

ctrl-s phpで検索して、

LoadModule php4_module libexec/httpd/libphp4.so

AddModule mod_php.c

の2つの行の頭の # を取る

$ sudo apachectl restart

/Users/sho/Sites/kamiwiki の下に KamiWikiのサイトからダウンロードしてきたphpなど一式を全部置く。

http://localhost/~sho/kamiwiki/index.php から見れるようになっていた。

パーミッションの設定はいらなかった。

■Windowsにインストール

s.h.log: Flash使いのためのXAMPPのインストールと設定

で書いたXAMPPのhtdocディレクトリにkamiwikiをまるごと入れたら、設定なしにそのまま動いた。

↑の設定済みのXAMPPがほしい人は連絡してくれたらあげます。

■Linux系にインストール

$ apt-cache search php

とかで検索して、

$ apt-get install インストールするもの

でphp4とapacheなどをインストールしておく。

あとはhttpd.confとphp.iniをMacのと同じように設定して、

$ /etc/init.d/httpd restart

とか

$ /etc/init.d/apache restart

とかすれば起動できる。