延ばしても、いつまでも際限がないので移転することにしました。

 移転先は、やはり同じ名前 荒野の喫茶店 です。

  2004年1月に書き込みを開始して以来、コメントを書き込んでいただいた方は、総数で、 6人と、とても少ないですが、殆ど毎日付き合ってくれた「スーさん」には特に感謝いたします。 では、新しいブログでもよろしくお願いします。(礼)

04/15/2008 6:19 PM

今日でおわ~かれね♪
もも合えない、て新しい方で、ヘンテコリンなコメントでした。

スー

 ASP.NET には、Repeater という便利な Web Control がある。 あるものは使わなくちゃ、というので使ってみた。 このコントロールをネストしようとして、ちょっとやっかいなことになった。(笑) で、無事ネストして使えるようになって喜んでいたけれど、別の部分のデバッグ中に「ドジ」を発見してしまった。
<asp:Repeater ID="RepeaterMain" runat="server">
<ItemTemplate>
<asp:Repeater ID="RepeaterImage" DataSource='<%# GetImageArray() %>'
          runat="server">
<ItemTemplate>
<%# Container.DataItem %>
</ItemTemplate>
</asp:Repeater>
</ItemTemplate>
</asp:Repeater>
</pre>
 ここで DataSource= の部分に、System.Collections.IEnumerable または IListSource インターフェイスを実装するオブジェクトを指定するわけだが、データアクセスをして、結果を入れた配列を戻す関数を指定していた。 当然動作はするが、上の階層の Repeater の ItemTemplate ループが回る回数分データアクセスが発生する。

 まったくドジだね。 RepeaterMain.DataBind(); する前に 配列を取得しておき、DataSource= には、その配列を渡してあげるだけにして、たぶん、問題は解決? いや、問題はなかった???(汗) 動いているので、デバッグしないと気がつかない...

04/13/2008 5:2 PM

こんにちは、Blogに画像をUPする部分ですか、
結果OKと無駄なループの発見ですね、大規模になれば成る程発見しずらい現象ですね

スー

04/13/2008 5:41 PM

スーさん、こんにちは。 Blogのシステムは何日か前に、基本的な部分は作り終えています。 いまやっているのは、自分で書き込んだ部分の編集をする機能の実装。 画像を一個一個削除、追加したり、そのたびにプレビューをさせたり...本質的ではないところなんです。 やりだしたら切りがないないですねぇ。

本人

 空が白み始めた。 眠れない夜も、やっぱりプログラミング?

 ロジックがかなり複雑になった。 メモしながらでないと全体を明白に認識できない。 ここをちょっといじったら、どこに影響する? ロジックのスワップというのも厳しい。(汗) メモリー環境が劣悪なノーミソも考えものだなぁ...

04/13/2008 5:6 PM

こんにちは、64BITの時代ですよ~
ノーミソはナンビットなのでしょう?1億ビット?

スー

 大して待っていないものは順調に着くものだ。 さすが安物の感は免れないが、広い。

 10分も使っていたら広さに慣れた。 きっとまた狭い環境に戻ろうとすると、相当しばらくいらいらするんだろーなぁ。(笑)

04/12/2008 4:56 PM

こんにちは、今日は朝早くから大海原へ出かけました、ものすごく広いですが中身が伴わずかっかりしてます。

スー

04/12/2008 5:46 PM

スーさん、こんばんは。 お船で出かけたのですか? 聞いただけで船酔いしそうです。(笑) 今回購入したディスプレィは迷っているうちに、三千円ほど値段が下がりました。 ちょっとラッキーなのかも?

本人

 何せお手本にするのが、20歳以上年上の兄が作るものなので、車とか...角ばったものが多い。(笑)

 3歳の娘の手と比べると、あの小さいLEGOのパーツがDUPLOのようだ。 楽しいらしい。

 Skype のアイコンに赤い着信フラグが付いていた。 開けてみると画像の状態。

 着信ではなくて、スーさんの誕生日のお知らせのようだ。 mixi は無言で何も語らない...スーさん、本当に誕生日? だったら、おめでとうございます。(笑)

04/10/2008 9:14 AM

こんにちは、Mixiには非公開にしてたはずです。
Blog はcommuty Server では無いのですね

スー

04/10/2008 9:26 AM

スーさん、こんにちは。 ほんとにおめでとう!だったんですね。(笑)
Blogは四月一日から、ゼロから書き始めました。 付け加えなければならない機能が多く、難航しています。 .NET Framework 3.5 (C#) + SQL Server 2005 です。 もう少しで公開予定です。(?)

本人

 考えられる組み合わせを全部試した後、初期不良と断定せざるをえない由メールを出した。 交換してくれると言うので送り返したマザーボードの代替品が届いた。

 部品を取り付け、電源を入れると問題なく動作した。 テストを繰り返した時間は無駄だったのか? いや、学んだことも多いはず。 でも、マザーボードの初期不良って初めての体験だなぁ。

03/24/2008 12:8 PM

こんにちは、MBの初期不良と判るまでは大変ですね、
取り付け部品を最小にしてバイオス リセットしてとか、
CMOS確認とか、まだ遭遇してなくてよかった~。

スー

03/24/2008 3:42 PM

スーさん、こんにちは。
今回の問題は、最初に壊れたPCを預かって、問題はマザーボードにあるという決断をし、新しいマザーボードを買いました。 ですから、新しいマザーボードが初期不良と断定するには、他のもてすとしなければならないことがたくさんあって大変でした。 手間を考えると、某社の一万五千円を切るサーバー機を買った方がずっと安上がりでした。 送料無料、五年保障だし...安すぎ!(笑)

本人

 昨夜は満月。 羊蹄山の左肩から昇った月は、きょうは山頂付近を掠めて昇っていった。

 この建築ラッシュではいつまでこの景色を見れるのだろう? 建物で風景を壊すことは出来ても、ボクの心の中に焼きついた風景は、もう消えることはないだろう。 なーんちゃって!

03/22/2008 9:21 PM

今晩は、詩人の誕生ですか!!、コードのなかの詩人のコメント拝見したいです。

スー

03/22/2008 9:54 PM

スーさん、こんばんは。 詩人ってぇ感じじゃなく...あまりの建築ラッシュでやけくそですよ。(笑) どうかしてますねぇ。

本人

 Windows CE 機のメモリー環境は厳しい。 今回使用しているデバイスは、かろうじて、32M のプログラム実行領域を確保しているだけ。

 3秒に一回の接続、切断動作をセットして、しばらくぶりのポールトレーニングに出かけた。 戻って来た時には、5000回のループを過ぎ、プログラム領域のメモリーを食いつぶして、ハングアップしていた。 一回に、5Kのメモリーリソースを潰してゆけば、当然そうなるわけだ。 システムが自動でメモリーのガベージコレクションを管理してくれているだけに、この問題は、ソースコードを追っているだけでは見つけにくいだろうなぁ。(汗)

 後片付けをまったくしないまま、TCP/IPで送られて来たXMLデータからクラスを作成(new)し続けて、一万回。 とても、気持ちが悪い話しだが、エラー無しでテストは終了した。

 てーぇことは、.NET CompactFramework と C# がきちんと後片付けをしてくれているということなんだろうねぇ。 すごい!と言うべきか?何にせよ、これで一日の業務としては実用になるはずだ。
 次は無線LANの接続と切断の連続テスト。 これも、連続千回くらいの回数には耐えてもらわねば...

03/21/2008 9:24 AM

LinQはFramwork 3.5からでしたね、Safari入れてみました。
表示がすこし速いような

スー

03/21/2008 1:25 PM

スーさん、こんにちは。 Windows版の SAFARI も バージョンが、3.1 になっていたんですね。 Firefox 3 と IE 8 ...なかなか忙しいですね。

本人

 Windows CE 機はなんといってもリソースが少ない。 C++で書いていた頃は、メモリーリークは勿論のこと、長期駆動でも問題を起こさないように気を使ってプログラムを書いてきた。

 今回の .NET CompactFramework + C# ではこのリソース管理のかなりの部分を自動的に内部で行っている。 その分、プログラムを書く本人には見えにくくなっているわけだ。 良いんだか?悪いんだか?

 ちょうど、Windows Server 2008 の日本語正規版のダウンロードが昨日から再開されたので、ネットワークの負荷テストも含めて、BUG FIX したものを長時間テスト中。 一万回のループテストを通るのが目標。 2秒間隔だから、5時間以上かかる。

 こちらが、我が家で食べた、少し小ぶりなシャルロットポワール。

 そりゃー、おいしかったですよ。 大満足。

 BUG にはまっていた。 Socket から受け取ったデータの処理がとても不安定だ。 出来上がったプログラムが一日中無事に動作するためには、数万回程度の処理で問題が起こらないことを確認しなければならない。

 データを処理する部分ではどうしても BUG を見つけることが出来ない。 では受け取ったデータはどうなっているのだろうか? これも、データを作り出す部分では、過去に長時間のテストを繰り返し、BUG は洗い出している。

 最後に疑ったのが、今回 C#で書くにあたり、いつもの別スレッドで動かすパターンに置き換える形で書き変えた非同期通信部分だ。 実は、この方法は始めて書くということもあり、かなりの部分でかき集めのソースコードを使っている。

 実際に問題があったのは下記の部分なのだが、実は眼から涙が出るほど読みまくっても、BUG を発見できなかった。
 int iRx = socketData.m_currentSocket.EndReceive(asyn);
 char[] chars = new char[iRx + 1];
 Decoder d = Encoding.UTF8.GetDecoder();
 int charLen = d.GetChars(socketData.dataBuffer, 0, iRx, chars, 0);

 String szData = new String(chars);
 C,C++ のプログラマは char 型のバッファーを確保する時には、必ずヌル文字が入るスペースを用意する。 しかし、C# ではこれをやると、最後の String 型への変換で、その余分な分も付いてくることになる...

 見慣れた、[iRx + 1] というパターンが、ノーミソを素通りしていたわけだ。 これって、ほとんど病気だね。(笑) この発見に、ほとんど一日を費やした。

ちょっと悔しいので、デバイス(Windows CE.NET 5.0 .NET COmpactFramework 2.0) 上で、デシリアライザーを実装してみる。
 public static InventoryChip Deserialize(byte[] b)
 これで、
 InventoryChip ic = InventoryChip.Deserialize(b);
 で、クラスを復元できることになる。 ざーっと書いただけなので、動作が不安定だ...CE側ではこれでゆくかなぁ。

Windows CE 5.0 側から、Server側への InventoryChip クラスのデシリアライズは...Sgen.exe で予め InventoryChip.XmlSerializers.dll を生成しておけば
  Microsoft.Xml.Serialization.GeneratedAssembly.InventoryChipSerializer scs =
    new Microsoft.Xml.Serialization.GeneratedAssembly.InventoryChipSerializer();
  MemoryStream ms = new MemoryStream(Encoding.ASCII.GetBytes(hoge));
  InventoryChip sc = (InventoryChip)scs.Deserialize(ms);

 で簡単に実現できる。
 しかし、これも、.NET CompactFramework 2.0 ではサポートされていないらしい。

 JSON 却下、Serialization 駄目、ということになると、XML によるシンプルな?データの受け渡しということか? 面白くないなぁ。(笑)

 いよいよ、食パンに変身する時が来た。

 おいしいパンになる予感がある。 (笑)

 デバイス(Windows CE.NET 5.0 搭載機)に付いている、まさにトリガー(引き金)を引くイベントを取り、RFID のスキャンが出来るようになった。 しかし、これが時々エラーとなる。 画面表示はしているのだが、トリガーを引いた時に、何か反応が欲しい。

 ゲームじゃないけど音だろうね、ということでWAVファイルの再生を試みる。 .NET Framework 2.0 から音を扱う SoundPlayerクラスが追加されたようだが、.NET CompactFramework 2.0では実装していないらしい。 Win32API の PlaySound を呼ぶしかないようだ。

 デバイスを ActiveSync で繋いで、母艦のエクスプローラから、 Coredll.dll を探してみる。 フォルダオプションで、「すべてのファイルとフォルダを表示する」にして、「保護されたオペレーションシステムファイルを表示しない」のチェックを外す。

 これで見れるはずだと思ったら見えないのねーぇ。 デバイス側のエクスプローラのオプション「隠しファイルおよび隠しフォルダを表示しない」のチェックを外して、やっとデバイス側で Coredll.dll の存在を確認。 早速 PlaySound を叩いてみると、音が再生される。 これだけでも、何か器械と対話しているような気分になる。 病気っぽい?のかもしれないが、そんなものなのかも?(笑)

03/17/2008 12:16 PM

こんにちは、どんなWAVE音か楽しみです、ホァア、ホォコと想像しゃいます。連射時はどうなるんですか。

スー

03/17/2008 3:56 PM

スーさん、こんにちは。 デバイスの中に ScanOK.wav というそのものずばりのファイルがありました。 良く聞く、「ピィーィ」と言う音です。(笑)
PlaySound は非同期で再生しますし、同時にいくつもの音を再生する方法もあるらしいですよ。 そんなに早くRFIDを読んでも、在庫チェックなので数量を入れることが出来ませんしねぇ...

本人

 丸一日、JSON を .NET CompactFramework 2.0 からいじっていて、ついに使うことを諦める。 CompactFramework 3.5 からは、JSON のクラスがあるにしても、2.0 で独自実装してみてつくづく感じた。

 Serialize はともかく、Deserialize にコストがかかりすぎる。

 幸い、クライアントとサーバーはWindows 環境限定なので、データを扱うクラスを、Serialize してネットワークで転送することにした。 XML化して送るわけだ。 SOAP でもよかったのだけれど、ちっちゃいデータだからねぇ。 ほんとは、さくっと!JSON で実装したかったんだ...

 ポーリングするのもあんまりだなぁ、と思いながら、SDK の sysioapi.h を読んでいたら、そのものずばりに見える定義が見つかった。
typedef void (*HOSTTRIGGERCALLBACK)( BOOL,int );
void OemSetTriggerCallback( HOSTTRIGGERCALLBACK );
 これはどう見ても、トリガーイベントに対するコールバック関数の登録にしか見えない。(笑)

 eMbedded Visual C++ で書いてみると、当たり! 次は、C#からどうするかだね。

デバイスに拳銃タイプの引き金が付いている。 RFID タグの読み込みの時にこの引き金をトリガーとして使いたい。 SDK の マニュアル PDF を読んでみると。
トリガキーの動作はEXT("KeybdTriggerChangeEvent")という名前のイベントを生成します。
と書いてある。 サンプルコードは...
gKeyEvents[0] = CreateEvent(NULL, TRUE, FALSE, kKeybdTriggerEventName);
gKeyEvents[1] = CreateEvent(NULL, TRUE, FALSE, kKeybdAlphaKeyEventName);
while (1)
{
  WaitForMultipleObjects(2, gKeyEvents, FALSE, INFINITE);
  TriggerKeyStatus(LEFT_TRIGGER_KEY);
  TriggerKeyStatus(RIGHT_TRIGGER_KEY);
}
 これじゃ、あんまりだね、(まったくユーザーインターフェースの部分は動かなくなる)と思いつつも、eMbedded Visual C++ 4.0 SP4 で書いてみると、確かにイベントを拾える。

 実用的には、別スレッドを走らせ、イベントを監視するしかないようだ。 C# でやるには、「名前付きイベント?」が必要だ。 調べてみると、 .NET Compact Framework 3.5 から EventWaitHandle Class という名前付きイベントを扱えるようになったらしい。

.NET Compact Framework 2.0 では Win32API コールで、CreateEvent を呼ぶしかないようだ。 たかがキーイベントを拾うだけで、面倒なことになりそうだ。 ...続く...

 ここ数日の暖気で雪解けもかなり進んだ。

 イグルーの壁の厚さもどんどん薄くなり、中が透けて見えるほどの厚みになってきた。 でも、中の様子は、画像下段のとおり、天井は低くなったものの、形を保っている。

 天候が良く、きょうは我が家の裏でゆきだるま作り。

 ここは雪が融けたら菜園なのだ。 この後はアウトドアクッキング。 外で食べる食べ物は特別な味わいがあるね。

円錐形に作ったとは言え、よくもったものだ。

作成から、ほぼ一ヶ月。
ここ数日の暖気で雪が痩せ、光りが差し込むようになった。

画像は、本日のイグルーの様子。

03/09/2008 3:18 PM

まだ原形を保ってるのがすごいですな~

03/09/2008 4:22 PM

hori さん、こんにちは。 あれから、ずーっと晴れています。
雪もかなり緩みました。 イグルーは風が吹かない限り、10cm程度の厚さになるまでこの形のまま耐えるはずです。 まだ中は十分に広く、不思議な感じです。

本人

 いただいたハスカップで夏の頃に作ってあったジャムをリメークした。

 ハスカップは酸味が強いので、少し糖分を追加...そのほか、秘密の*を入れ...まあ、特別なものではありませんが、よりおいしく変身してくれた。

 昨年の秋頃に公開した?公開する?と聞いていたが、作業の途中でふと気になってソースコードをダウンロードしてみた。

 表示しているのは、System.Windows.Forms.Form のソースコード。 英文だがコメントもたくさん入っている。 人が書いたソースを読むのは楽しい...

 風が治まるのを待って、外に出た。 玄関はごらんの有様で、当然内側から出ることは不可能。

 地面から1mほどの高さに駐車してあった車も左下の画像のような有様。 これでもミニバンだから結構高さがある車なんだけどね。

02/24/2008 7:35 PM

どうやって出たんですか・・・

02/24/2008 7:53 PM

hori さん、こんばんは。 窓からですよ...
明日は、車を掘り出さなければなりません。 フロントの部分に3m近い吹き溜まりが出来ているので大変な作業になりそうです。(汗)

本人

 調べものがあって英語のドキュメントを読んでいるうちに、発作的にiKnow に登録した。

 少し頑張ってみるかな? たぶん続かないだろう。(汗)

02/24/2008 10:22 AM

こんにちは、英語は避けられないですね、昔文献を訳してもらったことがあったんですが、文献に書いてある意味が解からんとか言われて困ったことがありました、専門書は同じ英語でも違うものみたいです。

スー

02/24/2008 10:27 AM

スーさん、こんにちは。
仕事での英語はともかく、最近この付近での生活には英語がないと不便になりました。 日本語がわかる外国人ばかりじゃないですから、英語できちんと話さないと、彼らは何でも好き勝手にやってしまいますから、かなり不具合があります。(笑)
もともと、わからないのに、訛った発音だと、殆ど聞き取れません。(汗)

本人

 今朝は、かなりニセコっぽい雪が積もっていた。 イグルーはすっかり雪に埋もれていた。

 見慣れたイグルーの形でないのは、中で大人が立てるように天井を高くしたため。 まるでピラミッドだね。

02/15/2008 10:44 AM

こんにちは、てっぺんがもう少し丸いとかまくらですよ~。
ラーメンもいいけど甘酒が良いと思うんですが。

スー

02/15/2008 11:50 AM

 スーさん、こんにちは。 甘酒も良いですね。 近くに酒造があるので、良い酒粕が手に入ります。

本人

 果肉はいつの間にかおいしいマーマレードに変わっていた。 実はボクは結構なマーマレード好き。

 ちょっと舐めてみたら、あまりのおいしさに、しばらくこのビンから遠ざかる決心をした。(笑) 食べだしたら止まらないからねぇ...

 間欠的な吹雪で降り積もる雪が層を成している。 昨日は標高の高いところで久しぶりにシュカブラを見た。

 シュカブラとは厳冬期の高山で雪が風に叩かれ、縞模様になっている状況。 すごい時は、1m以上もの段差が形成されることがある。 なぜか最近あまり見かけなくなった。 ひよって、悪い気象条件の時に山に行かなくなったせいか???(汗)

 とりあえず、ボクの好物のアップルパイをサクッと焼いてくれた。 ろうそくは数えるのも大変なので一本。

 全部一人で食べることも...できるけど...大きな一切れで我慢。 夜は、手打ちパスタが待っている。(嬉)

01/22/2008 7:17 PM

ぉおっ、思わずよだれが出ました。

やっぱり遊びに行かねば。

EzoTanuki

01/22/2008 11:36 PM

Happy Birthday 横浜より,こちらは明日の未明から雪のようです・・・私も一切れ口にしたいです。うらやましい!!

Nao&Yuki

 大げさだけど、帰って来たんだなぁ... 実はきょうはボクの誕生日。 相当年を取りました。(笑)

 修行の方は、なぜか絶好調で、二十年ぶりくらいに新境地を開拓出来そうです。 年を取っても、退化ばかりでなく、進歩もするということに自分ながら驚いています。 頑張るぞー!

 夕食の後に我慢しきれずに食べてしまったアップルパイ。 今回のパイは、折りたたんだ全ての層が、ぱりっとしてすばらしい食感だった。

 作ったすぐ後の食感は味わった...きょうは、次の日にはどうなっているかの味見だね...体重が増えるはずだ。(汗)

 もっと食べたいよー。(笑)

 今年は、フライパンのコンディションが悪かったせいか、煮しめの色が悪くなってしまったのが残念。 全部手作りです。 三点ほど、いただきものがあります。

 ゴマとアーモンドのたづくり、八幡巻き、祝いシイタケ、松風焼き、ピーナット粉をまぶしたナマス、白花豆の煮豆、黒豆の煮豆、数の子、竜眼焼き、伊達巻、シシャモの南蛮漬け、栗の茶巾、ユリ根のキントン、煮しめ、キリコ、サケのいづし、ホッケのいづし、ニシンの昆布巻き、お雑煮の餅、その他...

01/02/2008 8:44 AM

明けましておめでとうございます。
ようやく普通の体にもどりつつあります、おせちは実家で頂いてすぐに就寝でした。スローライフど真ん中です。
良い年でありますように。

スー

01/02/2008 9:4 AM

スーさん、あけましておめでとうございます。 本年もよろしくお願いします。

本人

 .NET では簡単なはずの...Messenger などでタスクトレーの上にずるずるーっと小さなウインドウが伸び上がって、消えてゆく、そんな仕組みをガリガリ書いている。 実はこれは単に普通のウインドウなので、ボタンを置いたり、いろいろな機能を追加出来る。

 と言っても、今回はボタンを一つ付ける程度で終わりそうなんだけどね。

 訳があって、Visual Studio 6.0 でアプリケーションを書いている。 タスクトレーに置いたアイコンからTrackPopupMenuでポップアップメニューを出している。 MSDN 日本語版では第七引数にNULLを与えると、メニュー部分以外をクリックした時にメニューは自動的に消えることになっている。

 しかし、消えない...何と、MSDN英語版にはこの問題に関して 詳細な解説 が出ていた。 一件落着。

 久しぶりの梅沢無線。 格安の駐車場を近くで見つけたのでついでに寄ってみた。

 相変わらず、狸小路7丁目は昔ながらのアーケード、時代を感じさせる。 店内は大幅にレイアウトが変わり、どこに何があるのか探すのが大変。 娘も一緒だったこともあって、何も買わずに店を出る。

 大勢で食べる鍋はおいしい。

 本格キムチをぶち込んだ鍋は、真っ赤だ。

 ふだん辛いものが苦手のボクも思い切り食べた。 調理してくれたTさんありがとう。

12/18/2007 9:44 PM

今晩は、家ではキムチうどんが定番になっています。野菜をいれてキムチで食べて後からうどんを入れて食します。食べ過ぎるのが難点てせす。

スー

12/19/2007 8:40 AM

スーさん、おはようございます。
キムチ好きでしたか...今回の鍋は最後にうどんを入れて食べた後、残ったスープを翌日にちょっと熱がある家内に食べさせるためにおじやにしました。 やはり、おいしかったですよ。

本人

 携帯電話の話題が出たついでに...SoftBank の X01T がついに発売になった。 早速手にしてニヤニヤしている人もいるんだろうなぁ。

 Windows Mobile 6 Professional 搭載、WVGA(800x640) 画面、QWERTY方式のキーボードと言うだけで、ガジェットとしての要素は十分。 興味を引くPDAが出てこない中で、携帯電話マーケットが奮闘している。 欲しい、欲しい、欲しいなぁ。

12/11/2007 8:15 AM

おはようございます、WVGA(800x640)は早くほしいです。携帯は老眼にはきつい物が...。明るさと電池のもちも...。

スー

12/11/2007 9:7 AM

スーさん、こんにちは。 W-ZERO3[es] は、VGA (640 x 480) ですが、想像するよりずっと見やすいです。 それを考えると裸眼ではなくめがねをかければ、そんなに違和感はないのかもしれません...
まあ、ボクにとっては実用と言うより、いじるおもちゃですが。(笑)

本人

 この地に「Nathan's」がオープンしたということで、昼ごはんにホットドッグを食べに行く。 まだ日本国内では数えるほどしかチェーン店展開をしていないと言うのに、ここにオープンしてどうしようというのだろう?

 経済原理ではない何かが動き出しているとしか思えない。 とにかくすごいスピードで、この地は変わりつつある。

 いつもの安いガソリンスタンドは100mを越す車の行列だった...いつもは並ぶのは避けるのだが、体験のためあえて並んでみた。 安いガソリンを買うために30分以上もエンジンをかけっぱなし、のろのろ運転とはなぁ。

ボクの労働単価と経費はいくらに換算されるのだろう?

 関東はもう少し安いのだそうだ。 これから、暖機運転をしたり、のろのろ運転を余儀なくされたり、無雪地域に比べてガソリンの消費量は多い北海道が高いとは...車を捨てて歩くか???(笑)

12/01/2007 11:11 AM

こんにちは、北海道の環境税を払っていると思うしかない∵!

スー

12/01/2007 12:7 PM

スーさん、こんにちは。 昔は確かに北海道の自然環境は良かったですから、その分払うのも納得出来ますが、最近の北海道は、特にボクが住んでいるところは「ごみだめ」化しています。 迷惑料を逆にいただきたいくらいですよ。(笑)

本人

 家内の実家がCATV接続だった時は、CATV側のサービスに制約があって、Messenger で画像、Skypeで音声という複雑な形態でしかビデオチャットは出来なかった。 今回 Bフレッツにしたので、Skypeも Messengerも単体でビデオチャットが出来る。

 Skypeのサービスが始まった頃、無理やりアドオンを入れてビデオチャットをしていた頃が、ずいぶん昔に感じる。

 RTC Client API を使ってC++で、がいがり書いた自前のアプリケーションでもビデオチャットをしたことがあったなぁ。 今、Office Live Communications Server ってどうなっているのだろうか? 久しぶりに思い出した。

 ぶつぶつ言いながら、Microsoft Encoder を操作。 Output を Silverlight にする。 時間はかかったが何事も無くページが立ち上がり、Silverlight の動画が再生された。 必要なファイルは自動的に作ってくれている。

 サーバーにファイルをアップロードする。 XAML の MIME タイプが登録されていないので、暫定的に関係するファイル名と記載を .xaml から .xml にする。 これもあっけなく動いてしまった。 良いのだけれど、すばらしいのだけれど、何かつまらない。 自分でがいりがり書きたいなぁ。 楽しみを返してくれー! (笑)

 いや、文句を言っているのではありません。 学習しているのです。 本来メニューやツールバー、コンテキストメニューにさまざまな機能が割り振られているのに慣れているので、あちこちに機能ボタンが散在しているのが不思議。

 何と言っても、インポートした動画ファイルが、リスト表示される時、左側に「バッテン」メークが付いている。 硬化したノー味噌では、問題が発生したと思ってしまう。 実はこれはこのファイルを削除するためのアイコンなのだ...この時点で何も問題はないのだ。 (汗)

 Silverlight の動画コンテンツが自動で出来るということと、mp4からWMVファイルへの変換が出来そうだということで評価版をインストールしてみた。 本来30日の試用期間だが特殊なキーを入れるとその期間が120日に増えるということも背中を押した。

 Expressin Blend 2 もそうだが、とにかく画面が黒い! 前にも書いたが、ボクのディスプレィの環境ではとても辛い。 現在、mp4ファイルをWMVファイルに変換中だが、妙に時間がかかっている。

 コーヒーを飲んで待つことしばし...結果はEncodeに失敗するようだ。 ボクの操作が間違っているのか? さーて?

11/28/2007 9:46 AM

こんにちは、音声、動画ファイルは処理に時間がかかります。
あまり操作したくない気持ちが専攻します。

スー

11/28/2007 10:24 AM

スーさん、こんにちは。 動画コンテンツがもてはやされるようになって早一年以上が経ちました。 今後は避けて通れない分野ですね。
MSは、このEncoderでSilverlightのでデプロイメントを面倒な設定抜きで出来ると言っています。 とにかく、一つ作ってみるのが一番です。 しかし、CPUの使用率が100%になってるなぁ。(汗) Pentium 4の2.6Gじゃー耐えられない。

本人

 日本語版は年末に出る(店に並ぶのは来年2月?)と言われている、Visual Studio Team System 2008 出荷バージョン。 英語版はすでに11月16日にリリースされている。 トライアル版 もダウンロード出来るらしい。

 MSDN のサブスクライバダウンロードに入ってみると、ベータ2は無くなり、ドキュメントのみが残されている。 ここに英語版のVisual Studio 2008 が上がるのは、時間の問題だね。 と言っているうちにダウンロードを始めている人がいるかも?

 すでに、Visual Studio 2008 の次期バージョン、“Rosario”の情報も流れていて、もう何がなんだか?(笑) 少なくとも、ちっちゃなアプリケーションを書くだけなら、もう(十分に)オーバースペックだね!

 COM 相互運用の変換試験をしてみたかったのが List。 List ってマネージドコードなのだけれど、文字列配列かSAFEARRAYあたりを渡してやれば自動的に変換してくれるのだろうか? 試してみた。

 呼び出すと、エラーが起こるばかり...どんな型の呼び出しに変換されているのだろうかと、タイプライブラリを覗いてみる。 タイプライブラリのinterfaceに何も記載されていない。 えー???

 C#のクラスの記述の前に [ClassInterface(ClassInterfaceType.AutoDual)] が必要ということがわかり、コンパイルし直す。 今度は、List はエクスポート出来ないというエラーが出る。 string [] にしてみる...タイプライブラリのinterface を見ると、SAFEARRAY(BSTR) に変換されている。 これで納得。 でも、SAFEARRAY ってC++のコードからは使い難いよねぇ。

11/19/2007 1:46 PM

こんにちは、Frameworkで出来るところまで作って、Frameworkの外からコントロールをC++で行うんですね、まだWin32 API も必要ですね。

スー

11/19/2007 2:3 PM

スーさん、こんにちは。 これは、Arago のためのただの遊びです。 どうしても、C++の機能が欲しければ、C++/CLR を使えば、C# のクラスを使うのは簡単ですし、相互運用は後ろ向きの互換機能です。 わざわざ使う意味はないと思います。
一昨日は、C++のインラインアセンブル機能を使ってスタックをいじるプログラムを書きました。 久しぶりの超低レベルプログラムは楽しかったですよ。(笑)

本人

 C# で書いたアセンブリを C++から使ってみようと、初めてRegAsm.exeを使ってみた。
いきなり

warning RA0000 : 型は何も登録されませんでした。

というエラーを喰らう。 これじゃ、何が何だか解らないよね。

Visual Studio 2005 の「プロジェクト」メニューから「xxxのプロパティ」「アプリケーション」「アセンブリ情報」とたどり「アセンブリをCOM参照可能にする」にチェックを入れ、リビルドしたものを再度RegAsm.exeで登録。 とりあえず、「型は正常に登録されました。」のお返事をいただく。
コードの中に、[assembly: ComVisible(true)] と記載してもOKらしい。

まだ、C#の独自データ型をどうやってC++から呼ぶのか疑問が残る。 どうやるんだろーねぇ...

 まだ道路工事が続いていた。 車を止められたので、脇を見ると画像のような看板が目に入る。 周りを見渡しても、日本語の看板はない。

 いったい、ここはどんなところになってしまったんだー??? 英語、中国語、韓国語、そして日本語はない。

UPnP を使って外部からルーターのポートマッピングを変更する仕組みを準備している。 テストは、C++ で書いたコードですでに終了している。 さーて、ということで、ASP.NET 2.0 で実装することにして、コードをC#に書き換えた。

 これで必要な時に、Web にアクセスして必要なポートを開け、外部からVPNをするのだ。(嬉)

 ところが何か様子が変だ。 レスポンスを途中までしか読むことが出来ないのだ。 パケットをキャプチャーしてみると、実際は必要な情報は全部流れて来ている。 下記はそれを一部抜粋したものだ。
0002 : 50 18 0C 00 94 E4 00 00 48 54 54 50 2F 31 2E 31 P.......HTTP/1.1
0003 : 20 32 30 30 20 4F 4B 0D 0A 43 6F 6E 6E 65 63 74  200 OK..Connect
0004 : 69 6F 6E 3A 20 20 63 6C 6F 73 65 0D 0A 53 65 72 ion:  close..Ser
0005 : 76 65 72 3A 20 55 50 6E 50 2F 31 2E 30 20 55 50 ver: UPnP/1.0 UP
0006 : 6E 50 2D 44 65 76 69 63 65 2D 48 6F 73 74 2F 31 nP-Device-Host/1
0007 : 2E 30 0D 0A 43 6F 6E 74 65 6E 74 2D 6C 65 6E 67 .0..Content-leng
0008 : 74 68 3A 20 34 30 32 0D 0A 43 6F 6E 74 65 6E 74 th: 402..Content
0009 : 2D 54 79 70 65 3A 20 74 65 78 74 2F 78 6D 6C 3B -Type: text/xml;
000A : 20 63 68 61 72 73 65 74 3D 22 75 74 66 2D 38 22  charset="utf-8"
000B : 0D 0A 0D 0A                                     ....

Source Address: 192.168.11.59 
Destination Address: 192.168.11.11
Source Port: 1900  Destination Port: 1524
0000 : 45 00 01 BA 5F EB 00 00 40 06 81 BC C0 A8 0B 3B E..._...@......;
0001 : C0 A8 0B 0B 07 6C 05 F4 33 F2 60 0D D6 77 7A 87 .....l..3.`..wz.
0002 : 50 18 0C 00 19 7D 00 00 3C 3F 78 6D 6C 20 76 65 P....}....<
0004 : 53 4F 41 50 2D 45 4E 56 3A 45 6E 76 65 6C 6F 70 SOAP-ENV:Envelop
0005 : 65 20 78 6D 6C 6E 73 3A 53 4F 41 50 2D 45 4E 56 e xmlns:SOAP-ENV
 読み込んでいるコードはこんな感じ
do {
    bytes = stream.Read(data, 0, data.Length);
    if (bytes == 0)
      break;
    ms.Write(data, 0, bytes);
}
while (stream.DataAvailable);
 一番上のキャプチャーデータのように、ストリームが間歇的に途絶えると、 (charset="utf-8" のあたり)
NetworkStreamクラスのDataAvailable は偽(false)を返すようだ...
 この動作を制御する方法があるのかどうかはわからない。 検索してみると、同じように記載してあるサンプルコードが大量に見つかった。(汗)

 ほんと、しょうがないので下記のように書き換える、
do {
    bytes = stream.Read(data, 0, data.Length);
    ms.Write(data, 0, bytes);
}
while ((bytes !== 0);
 これって、このコードって、何か悲しい。 ボクの環境でだけ起こることなのか? 誰も困っていないのだろうか?

 実駆動しているWeb Server に組み込む前に開発マシーンに組み込んでテストしていた Windows Service プログラム。 イベントログを見ると昨夜エラーを起こした様子。

 ソースコードはこのマシーン上にあるので、イベントログからデバッガを起動して、ソースコードの中の問題を起こした行を直接特定出来る。 なんて便利なんだろう。 それにしても、やっぱ、ここかぁ。 というところでエラーを起こしていましたねぇ。

 Windows Service プログラムをスクラッチから書く。 .NET Framework を使うと嘘のように記述が簡単になるので、最後にきちんとスクラッチから書いておきたいという気になった。 SCM との通信部分、そしてインストールや削除用の別プログラムも書いた。

 Visual Stuidio 6 の C++でと思ったが、Visual Stuidio 2005 の C++で書くことにした。 コンパイルすると、太古のCの標準関数は、そろそろ使えなくなるので注意しろ、とのワーニングが出る。 そーか...

 サービスプログラムはテストするのが大変。 本来10分に1回ほどの頻度で作業をしてもらうのだが、それを10秒に短縮して、耐久テストをする。 面倒だけれど、比較的詳細なログをファイルに出力させて様子を見る。 いきなり、実駆動しているサーバーには組み込めないものなぁ...

 もう一つ必要な、Windows Service プログラムは Visual Studio 2005 のC#で書くことにする。 2008 ベータでも良いんだけどね。 これは、特定のアドレスへのメールを監視するサービスだ。 たぶん、あちこちにフリーのツールがあるんだろうけど。 (笑)

 便利に使っていた自作のツールが、Vista で動かない。 不便なのでちょっと調べてみた。 このツールでは、CreateProcess() で外部プログラムを起動し、その時点で存在するウインドウをサーチして、CreateProcess() から得たプロセスIDで起動したプログラムのウインドウハンドルを得ている。

Vista では不思議なことに、ウィンドウを全部サーチしても、このプロセスIDを持つものは見つからない。 外部プログラムは起動するが、プロセスIDが違う。 不思議だ。

 Spy++ で見てみたところ、起動した外部プログラムは、親プロセスIDとしてCreateProcess()を起動したプログラムのプロセスIDを持っている。

 Vista の場合はウインドウハンドルを検索する前に、全部のプロセスを列挙し、親プロセスを調べ、これがCreateProcess()を起動したプログラムのプロセスIDと同じプロセスを見つけ、そのプロセスIDを使ってウインドウハンドルを探すように書き換えた。

 ボクのやり方が悪くてこんな結果になるのか? Vista ではこの辺の仕様を変えたのか? わかりません。(汗)
 これに関する情報を見つけることが出来ないので、誰も文句?を言っていないようです。 と言うことは皆さんは困ってはいないようです。 ね?

PROCESSENTRY32 pe32;
ZeroMemory(&pe32, sizeof(pe32));
pe32.dwSize = sizeof(PROCESSENTRY32);

HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (INVALID_HANDLE_VALUE != hProcessSnap) {
  if (Process32First(hProcessSnap, &pe32)) {
    do {
      // pe32.th32ParentProcessID 親プロセスのID
      // pe32.th32ProcessID 自分自身のプロセスのID
    } while (Process32Next(hProcessSnap, &pe32));
  }
  CloseHandle(hProcessSnap);
}

 最近ルータのWAN側のアドレス、プロバイダから受け取っているグローバルアドレスが頻繁に変わるようになってきた。 今までは、電源を落とすか、ルータをリセットしない限り、そのままだったのに...

 サーバーの再インストールのついでに二年ほど前に書いたUPnPのプログラムをアドレスの監視のために動かすことにした。 ところが、動きが妙だ。 最近メモリー不良を起こしたVista機で散々苦労したので、また「わけわか」の再来かと一瞬いやーな気になった。

 デバッグをしてみると、ルータが HTTP/1.1 401 Unauthorized エラーを返している、 まれにそのエラーの後に壊れた構造のHTML文書が流れてくる。 ルータが変わったので、何か内部のデータ構造に変更があったのかと、ルータ相手に、手動で各種の .xml 文書を要求し眺めてみる。 serviceType の WANPPPConnection も存在し、GetExternalIPAddress もサポートしているのは確認した。 しかしエラーは止まらない。 ヘッダーに基本認証情報を付け足したり、危険だけれど一時ルーターのパスワードを解除してみたりもした。 問題は変わらない。

 Intel のサイトから、IntelToolsForUPnPTechnologyという,.NET用のライブラリをダウンロードし、その中にある Devise Spy を動かしてみた。 無事にGetExternalIPAddressは動作しているようだ。 では、どんなパケットを飛ばしているか?ということでパケットをキャプチャーしてみた。 それが、残念ながら、じぶんが飛ばしているものと殆ど変わらない。 ヘッダーの項目の順番が違うくらいだ。 単純なSOAPリクエストなので、当然誰が書いてもそんなに違いが出るものではない。

パターン1
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
   <s:Body>
      <u:GetExternalIPAddress xmlns:u="urn:schemas-upnp-org:service:WANPPPConnection:1" />
   </s:Body>
</s:Envelope>
パターン2
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<u:GetExternalIPAddress xmlns:u="urn:schemas-upnp-org:service:WANPPPConnection:1" />
</s:Body>
</s:Envelope>
 パターン1とパターン2の違いは何だろうか? そうインデントがあるか?ないか?の違いだけだ。
XML文書ではインデントは必須ではないと規定されている、インデントした方が人間が見た時に理解しやすいですよ、との解説が多い。

 結論から言うと、このインデントが問題だったようだ。 ボクはプログラムに送りつけるXML構文なので、インデントを入れていなかった。 最初の<s:Body>の頭に一つでも空白を入れれば、ルーターは元気に正しいグローバルアドレスを戻してくる。

 Intel のツールキットでは律儀に空白三文字分のインデントを入れているので動作したわけだ。

 この問題の解決に、他の仕事をやりながらだが、ほぼ12時間を費やした。 どうしても頑固なルーターの挙動に、一時は取替えを決心したほどだ。 しかし、いかにもその解決策はプログラマとして悔しい。 と言っても、半日もかけるのもなぁ...(笑) 今回はルーターのファームウエアのルール違反だね。 メーカー名と型番は言わないこととする。

 おかげで、IntelToolsForUPnPTechnology を発見。 なかなか優れものなようなので、そのうちいじってみよう。 Microsoft の UPnP SDK も?

10/06/2007 11:11 AM

こんにちは、お疲れ様でした、転んでも....良いもの見つかりましたね。
昔、全角の空白で苦労したことが有りますが (笑)

スー

10/06/2007 12:52 PM

ルーターのファームウエア側での処理の方法が想像できません。 改行を 0x0a だけにしてみましたが、動作は変わりませんでした。 パターン2の<s:Body>の左にたった一つだけ空白を入れ、他はそのままでも動作します。
同じメーカーのほかの型番のルータはXMLの規定どおり、インデントがあっても無くても動作します。 まあ、しょうがないね...と言うしかありません。(笑)

本人

 今年も、十月一日がやってきた。 十月は、レイブラッドベリの 「10月はたそがれの国」  フレッドホイルの「10月1日では遅すぎる」 が、30年以上も頭の中をぐるぐるしている季節。

 毎年、おんなじことを書いているボク...(汗)

Visual Studio 2005 で 「新規プロジェクト」「スマートデバイス」「Pocket PC 2003」「 デバイスアプリケーション(1.0)」 を指定する。これで良い筈だ。 でも、コンパイル後の「配置」に失敗し、デバイス側にもっと新しいWindows が必要だと怒られる。

新しいWindows じゃなくて、新しい .NET Compact Framework だろうね? ちっとも新しくないけど...(笑)

Visual Studio 2003 をインストールするなんて嫌だったので .NET Compact Framework 1.0 SP3 をインストール。 デバイスをリセット。 今度はコンパイル時にPC側に.NET Framework 1.1 パッケージがないので駄目だと怒られる

確かめてみると、確かに 2.0, 3.0, 3.5 beta しか入っていない。
 .NET Framework 1.1 パッケージをインストール
 .NET Framework 1.1 language pack をインストール
 .NET Framework 1.1 SDK をインストール
 .NET Framework 1.1 SP1 を当てる

今度も「配置」に失敗したと冷たく報告される。 でも、しぶとく手動でファイルをコピーすると無事に動作する。

ついでにTOSHIBA の GENIO e550GX にも同様の作業無事動作を確認する。

Compact Framework も 3.5 の時代なのに時代に逆行して良いのだろうか? 本当に、リサイクルできる???

 サーバーの再構築で、何か使えるものはないかとジャンク箱を漁ってみた。 本来あるはずがなんだけど。(笑)

 バッテリーが切れて眠っているたくさんのデバイスが出て来た。 とりあえず、ACアダプタを探し、いくつかのものは充電を始める。 バックアップバッテリーまで放電してしまっているので、復帰出来るかどうかも判らない。

 Sigmarion 3 とか TOSHIBA の Pocket PC である GENIO e550GX、その他もろもろ。
 ぼやーっと付いているランプを見ていると、Compact Framework 2.0 を入れると、まだ結構使えるかも? なんて邪心が出て来た。

 しかし、古い Windows CE 機は 2.0 のサポートが無いらしい。 ここで諦めれば良いものを、いろいろやってみた。 リサイクルの暗黒面だ。 (笑) 続く...

 結果から言えば、必要十分な条件で、ユーザー定義のペーパーサイズの最小、最大を得ることができているようだ。 試しに我が家のプリンタ EPSON PM-A920 で 1メートル超えの印刷をしてみた。 OK。 壁に飾ったその紙は、小学校に飾ってあった書初めを思い出させてくれた。 一度も提出した覚えがないなぁ...(汗)

 次はカーニングなのだけれど、GDI+になってから、情報を見たことがないなぁ...GDI なら SetTextCharacterExtra なんだけど。

 ユーザー定義の用紙サイズの最小値、最大値を得ようと、いろいろ考えてみた。 プリンタドライバが持っているはずのその値の格納場所は作ったメーカーに依存するので、位置を突き止めたとしても汎用性はない。

 ある特定のプリンタだけをサポートすれば良いケースでは、手動でプリンタのプロパティの設定を変え、メモリをダンプして変わった部分を調べ推測する方法をとった。

 いろいろ回りくどいことを考えた末、ふと単純な方法を思いついた。 早速プログラムを書いてみると、自分のプリンタではバッチリ動作する。 他のプリンタで試してみよう。 下手な考え休むに似たり、かな?

09/03/2007 5:19 PM

こんにちは、単純な良い方法みっかったんですか、凄いですね
こっそり耳打ちして下さい。

スー

09/03/2007 8:4 PM

スーさん、こんばんは。 自分のプリンタではOKなのですが、果たしてそれが汎用性があるものか...他のメーカーのプリンタで試さなければいけません。 たぶんOKだとは思いますが。

本人

 printDocument 内のプロパティをいろいろいじってみたものの、プリンタ側に反映される気配がない。 これはボクのやり方が悪いだけだと思う。 でも仕方がないので、 printDocument1 内部の DEVMODE 構造体を直にいじってみた。
// DEVMODE のハンドル取得
IntPtr hMem = printDocument1.PrinterSettings.GetHdevmode();
// ハンドルからポインタへ変換
IntPtr dmPtr = GlobalLock(hMem);
// DEVMODE 構造体を得る
DEVMODE dm =
 (DEVMODE)Marshal.PtrToStructure(dmPtr, typeof(DEVMODE));
// テストなので直に数値...ごめん
dm.dmOrientation = 2;
dm.dmPaperSize = 256;
dm.dmPaperWidth = 2150;
dm.dmPaperLength = 11170;
dm.dmFields = 1 | 2 | 4 | 8;
// 構造体からポインタに変換
Marshal.StructureToPtr(dm, dmPtr, true);
// ハンドルのロックを解除
GlobalUnlock(hMem);
// PriterSetteings に戻す
printDocument1.PrinterSettings.SetHdevmode(hMem);
// ハンドルを解放
GlobalFree(hMem);
このやり方なら、設定した項目がプリンタに反映される。

 次はユーザー定義サイズの最小、最大サイズを推測することかな? DEVMODE 構造体の後ろにメーカー定義の領域があって、そこに保存されているのは容易に想像できるけれど、これはメーカー、そして機種依存のデータ様式だ。 何か別に汎用的な方法を考えなければならない。

09/02/2007 12:37 PM

出力するプリンタを限定した方がいいですかね?使用中のリコーのレーザープリンタは用紙等の印刷条件をファイル化して置けます。またいくつも同じプリンタをインストールして個別の用紙を設定しておけます。

EzoTanuki

09/02/2007 1:33 PM

EzoTanuki さん、こんにちは。 ユーザー定義のペーパーサイズは、最小と最大の間なら自由に設定できるというのが逆に解りにくいかも? A4タイプとA3タイプの長尺ですから、長さの指定? もしくは数種類のテンプレートを選択する考えの方がすっきりするかもしれませんね。

本人

 C++で書いたり、C#で書いたり...いろいろテストをした。

 結果、C#側から長尺印刷に成功。 まあ、API をゴリゴリ呼んでいる醜いコードになってしまった。 struct や enum の定義、Marshal.StructureToPtr そしてその逆のオンパレード...(汗)

いや、ボクが出来ないだけで、printDocument で何とかできると思うんだけどね。 プリンタが壊れていないことが確認できたので、次は printDocument パターンだなぁ...

09/01/2007 10:4 PM

なんかえらいことになってきてますね。
テストプリントは細い線の字にした方がインクの節約ができますよ~、とせこいことを言ってみる(笑

09/01/2007 10:16 PM

horiさん、こんばんは。 二年ほど前にラベルプリンタを使うプログラムを書いた時、テストで数百枚単位で出力する必要があって、家族の名前をいろんなサイズ、フォントで印刷しました。 今でもそれが使い切れないほど残っています。 (笑)
業務用のラベルプリンタってカウンタがKm単位なんですよ。

本人

 残念ながら、8月30日のパターンでは手持ちの PM-A920 にはユーザー定義のペーパーサイズが片影しないことがわかった。 EPSON のサイトから長尺印刷のユーテリティをダウンロードして試してみたけれど、長尺印刷ボタンそのものが無効になっている。

 サポートに電話をかけ、丁寧に全てのドライバをアンインストールし、関連していそうなファイルも削除し、ドライバやユーテリティ類を再度ダウンロードし、インストールし直してみたけれど、状況は変わらない。

 プリンタそのものが長尺印刷に対応していないのではない。 その証に、手動でユーザー定義のペーパーサイズを設定し、そのサイズをディフォルトの設定にした上で印刷すると、相当長いサイズで印刷が出来る。 さー、それでは、DEVMODE 構造体を直にいじってみるか。 どうせなら、C#でやってみたい...

09/01/2007 11:6 AM

うわあ~~~
えらいことになってきたなぁ・・・・

EzoTanuki

09/01/2007 11:16 AM

こんにちは、はまってきたきた WIN 32 API のおでましですか?

スー

 C#で最初から書くことにした...
PrintDocument pd = new PrintDocument();
PrinterSettings ps = new PrinterSettings();
// プリンタを選び
ps.PrinterName = "プリンタ名";
pd.PrinterSettings = ps;
// ロール紙をフィードできる給紙指定をする
pd.DefaultPageSettings.PaperSource = pd.PrinterSettings.PaperSources[4];
// Custum 属性がある用紙を指定する
pd.DefaultPageSettings.PaperSize = pd.PrinterSettings.PaperSizes[26];
pd.DefaultPageSettings.PaperSize.Width = 100;
pd.DefaultPageSettings.PaperSize.Height = 3000;
 ところが、
「Kind プロパティを Custom に設定しない限り、PaperSize を変更できません。」
というエラーが出る。

 ぐぐって見ると、ほとんど「どうしてこのエラーが出るのでしょう?」で終わっているページが多い。
pd.DefaultPageSettings.PaperSize.Kind.ToString()
で調べてみると、きちんと Custom との報告がある。 で、なぜこんなエラーが出るんだ?

 Microsoft のページを熟読してみる。
「PaperSize コンストラクタを使用して、カスタム用紙サイズを指定できます。Width プロパティと Height プロパティの値は、カスタムの PaperSize オブジェクトに対してのみ設定できます。」
との記載がある。

 生でDEVMODE構造体をいじっていた時は、変更したいプロパティを dev->dmFields = DM_PAPERSIZE; のように指定しなければならなかった。PrintDocument ではこんな部分は隠蔽されているものなぁ...
DefaultPageSettings.PaperSize = new PaperSize("myPaper", 100, 3000);
でOKとなる。 その後なら、自由に Width や Height 値を変更できる。 日本語は?良く判らない。 かと言って、英語がわかるわけでもないのが悲しい。(笑)

 さーて、次は...描画して、実際に紙にプリントしてみる。

08/30/2007 7:45 PM

今晩は、こんな部分は隠蔽されているものなぁ...つてクラスでカバーしてくれてるんでしょうが何だかな~、動けばいいのか、動かせるのがいいのかですね

スー

08/30/2007 8:1 PM

スーさん、こんばんは。 まだまだ細かいことをやろうとすれば、Win32API は必須のようです。(涙)

本人

 インクジェットプリンタで長尺の用紙への印刷テストをするため、ロール紙と言うものを買ってきた。

 最初は、今使っている PM-A920 で使うためにロール紙ホルダのオプションがないか店員に聞いてみた。 この<安い>プリンタでは最大A4サイズまでしかサポートしていませんと言う。 しょうがないので、紙の売り場に行ってみると、これまた写真印刷用の細いサイズのロール紙しか見つからない。 やっと見つけたのが画像のもの。

 まずはこの手のプログラムを多く書いたC++でテストプログラムを書いてみる。 プリンタが言うことを聞いたら、C#に移植することにしよう。

 今更ながらなのだろうけど、 .NET Framework 2.0 では textBox に GetCharIndexFromPosition メソッドが実装されている。 殆どの解説ページでは、このメソッドは 「指定した位置の一番近くにある文字のインデックスを取得します」 と説明されている。 そのとおり動作する。

 しかし、この実装の元になったのだろうと推測される、EM_CHARFROMPOS メッセージを送る旧来の方法と少し動作が違っている。 文字列がない部分の座標を指定した時に前者は本当に最寄の文字のインデックスを返すし、後者は文字列の長さを戻しているように見える。 これは環境の違いによるものなのかもしれない。 実際このページの記載と反対の動作の解説も見たことがある。

たとえば、テストのため、MouseMove イベントの中に記載した場合、有効な文字列上以外の座標の時以下は、最後の文字インデックスを返すし
 private void textBox1_MouseMove(object sender, MouseEventArgs e)
 {
  Point p = new Point(e.X, e.Y);
  int pos = textBox1.GetCharIndexFromPosition(p);
}
以下は、文字列長を返す
[DllImport("user32.dll")] public static extern
int SendMessage(IntPtr hWnd, int msg, int wParam, int lParam);
private void textBox1_MouseMove(object sender, MouseEventArgs e)
{
  const int EM_CHARFROMPOS = 0x00D7;
  int p = ((e.X & 0xFFFF) | (e.Y << 16));
  int result = SendMessage(textBox1.Handle, EM_CHARFROMPOS, 0, p);
  int pos = result & 0xFFFF;
}
何が違うかと言うと...文字のインデックスとキャレットの位置の違いなのだ。

 たとえば、ユーザーがテキストボックスの中の文字列以外の部分をクリックした時、キャレットは最後の文字の右側に来るのが自然だ。 (と思う)

 そう考えると、EM_CHARFROMPOS メッセージを送るパターンの反応の方が自然だと思うのだけれど...実在しない文字インデックスを返すことになるね?とも言われそうだなぁ。

 ともかく、似たようなことをやっているはずなのに、動作の違いがある場合があるということは要注意。 >自分

08/28/2007 9:10 AM

こんにちは、やってますね細かいチェック、メモメモです。
日曜日に運動会に参加して、筋肉痛と戦っていました。
金曜日の穴掘りもかなり効いています。その後のテトラでの釣りも
足にきています。

スー

08/28/2007 9:14 AM

スーさん、こんにちは。 体を動かすことは良いことです。 健康の第一歩ですね。
黒いトマトはまだ黒くなりません...(汗)

本人

 この長雨で溜め込んだ水分を一気に発散させているんだろうか?羊蹄山の傘雲がダイナミックに展開している。

 画像は、露出をオーバーにしていたのを忘れて撮ったので、飛んでしまっているけれど...薄い傘雲を突き破って、小さな爆発のような雲が湧いてきたタイミング。 火口壁のあたりはすごいことになっているんだろうなぁ。

08/14/2007 7:58 PM

今晩は、塩谷へ墓参りでした、羊蹄山の山頂で自然の営みが目で確認出来るんですね、レタッチした感じですね。

スー

08/14/2007 8:42 PM

スーさん、こんばんは。 ボクは息子と明日にでも墓参りに行く予定です。 駐車スペースが少ないので、混んでいる時を避けなければならないのです。
釣りのスポット、兜岩の千畳敷の近くですよ...

本人

 適当に組み立てた Type3 レスポンスを送ってみる。
0002 : 00 00 00 00 00 00 00 00 54 6C 52 4D 54 56 4E 54 ........TlRMTVNT
0003 : 55 41 41 44 41 41 41 41 47 41 41 59 41 45 41 41 UAADAAAAGAAYAEAA
0004 : 41 41 41 59 41 42 67 41 57 41 41 41 41 41 41 41 AAAYABgAWAAAAAAA
0005 : 41 41 42 77 41 41 41 41 45 41 41 51 41 48 41 41 AABwAAAAEAAQAHAA
0006 : 41 41 41 4D 41 41 77 41 67 41 41 41 41 41 41 41 AAAMAAwAgAAAAAAA
0007 : 41 41 43 4D 41 41 41 41 42 34 49 49 41 41 35 71 AACMAAAAB4IIAA5q
0008 : 50 69 75 42 4F 47 4C 5A 41 41 41 41 41 41 41 41 PiuBOGLZAAAAAAAA
0009 : 41 41 41 41 41 41 41 41 41 41 41 41 41 50 76 6B AAAAAAAAAAAAAPvk
000A : 32 47 33 6A 47 33 63 35 49 4C 47 39 46 64 79 63 2G3jG3c5ILG9Fdyc
000B : 4E 63 6C 46 72 46 62 4C 39 4D 39 35 79 31 55 41 NclFrFbL9M95y1UA
000C : 55 77 42 46 41 46 49 41 54 67 42 42 41 45 30 41 UwBFAFIATgBBAE0A
000D : 52 51 42 51 41 44 51 41 4C 51 41 79 41 44 59 41 RQBQADQALQAyADYA
000E : 52 77 41 3D 0D 0A                               RwA=..
-------------------------------------------------------
0002 : 00 00 00 00 00 00 00 00 2B 4F 4B 20 55 73 65 72 ........+OK User
0003 : 20 73 75 63 63 65 73 73 66 75 6C 6C 79 20 6C 6F  successfully lo
0004 : 67 67 65 64 20 6F 6E 0D 0A                      gged on..
NTLMv2 の認証はうまくいったようだ。
4E, 54, 4C, 4D, 53, 53, 50, 00, 03, 00, 00, 00, 18, 00, 18, 00
40, 00, 00, 00, 18, 00, 18, 00, 58, 00, 00, 00, 00, 00, 00, 00
70, 00, 00, 00, 10, 00, 10, 00, 70, 00, 00, 00, 0C, 00, 0C, 00
80, 00, 00, 00, 00, 00, 00, 00, 8C, 00, 00, 00, 07, 82, 08, 00
0E, 6A, 3E, 2B, 81, 38, 62, D9, 00, 00, 00, 00, 00, 00, 00, 00
00, 00, 00, 00, 00, 00, 00, 00, FB, E4, D8, 6D, E3, 1B, 77, 39
20, B1, BD, 15, DC, 9C, 35, C9, 45, AC, 56, CB, F4, CF, 79, CB
55, 00, 53, 00, 45, 00, 52, 00, 4E, 00, 41, 00, 4D, 00, 45, 00
50, 00, 34, 00, 2D, 00, 32, 00, 36, 00, 47, 00
0E, 6A, 3E, 2B, 81, 38, 62, D9
はクライアント側で適当に作った数値。
その後に続くのは、昨日のアルゴリズムで作られたレスポンスだ。

まだいろいろなやり方はあるようだけれど、現行のThunderbird 1.5.0.8 がこのパターンで動いているので、これはこれで良しとする。 NTLM と NTLMv2 認証が出来た。(とても完成とは言えない)

なんだかんだと、一週間もかかったものなぁ。 (汗)

11/24/2006 8:47 AM

ながかったですね(w

|masashiAT NOSPAMhorijp dot com

11/24/2006 8:51 AM

おはようございます。大変ためになる情報感謝です。今日、明日、明後日と腰が痛くなる作業です。IT化には程遠い作業です。

スー

 Tunderbird が送った Type3 レスポンスを見てみると
4E, 54, 4C, 4D, 53, 53, 50, 00, 03, 00, 00, 00, 18, 00, 18, 00
5A, 00, 00, 00, 18, 00, 18, 00, 72, 00, 00, 00, 00, 00, 00, 00
40, 00, 00, 00, 10, 00, 10, 00, 40, 00, 00, 00, 0A, 00, 0A, 00
50, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 05, 82, 08, 00
75, 00, 73, 00, 65, 00, 72, 00, 6E, 00, 61, 00, 6D, 00, 65, 00
70, 00, 34, 00, 32, 00, 36, 00, 67, 00, 08, A1, C8, 44, 4B, 8A
3C, A8, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
00, 00, EA, 29, EB, 41, DC, 71, 11, D1, 37, AB, 60, D9, 5C, 74
3A, A8, FD, AD, 6D, D3, 89, AB, B9, A4
08, A1, C8, 44, 4B, 8A, 3C, A8, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
普通のLM レスポンスではなく、NTLM2 Session Response のもののようだ。 (汗)

これと Type2メッセージで送られてきた charenge を組み合わせて NTLMv2 レスポンスを
作るということらしい。
charenge を F6, 59, EA, AE, 51, EF, 29, F3 とすると
連結したものは F6, 59, EA, AE, 51, EF, 29, F3, 08, A1, C8, 44, 4B, 8A, 3C, A8 となる。

これを md5 digest したものが
36, 47, BA, 50, 4E, 53, 2C, 53, 97, 40, 2C, 1E, 61, A8, 63, AE となる。
これを8バイトに切り詰め NTLM レスポンスを作る鍵とする。 

得られた NTLM レスポンスは
EA, 29, EB, 41, DC, 71, 11, D1, 37, AB, 60, D9, 5C, 74, 3A, A8
FD, AD, 6D, D3, 89, AB, B9, A4
これで正しく解析できたことになる。
次は実際に、Type3 レスポンスを作り認証してみる。

 昨日、ついに Vista の RTM 出荷版がダウンロードできるようになった。

 しかし、RC1でもRC2でもボクのPCのマザーボードに積んでいる Realtek AC'97 は認識してくれない。 RC2の段階でインストールしたドライバは出力は出来るものの、入力が出来ない。 これでは SkypeやLive Messenger などは使えない。(汗)

 今回は気を入れてドライバの検索をした。 結果、入力、出力共OK。
http://www.realtek.com.tw/downloads/downloadsView.aspx
?Langid=1&PNid=23&PFid=23&Level=4&Conn=3&DownTypeID=3&GetDown=false#AC
(注)URLは二行になっています。

 画面のキャプチャーはVista付属の Snipping Tool というのを使った。 なぜかこの名前は英文のまま。(笑) なかなか便利、蛍光ペンなどというのも使える。

 プレーンなNTLM 認証のテスト。 昨日のType2メッセージから抽出した Charenge を使ってLMレスポンスとNTLMレスポンスを作って そのほかの情報も組み合わせ、Type3レスポンスをつくる。
パケットを送出した結果は以下のとおり。
送信
0002 : 00 00 00 00 00 00 00 00 54 6C 52 4D 54 56 4E 54 ........TlRMTVNT
0003 : 55 41 41 44 41 41 41 41 47 41 41 59 41 45 41 41 UAADAAAAGAAYAEAA
0004 : 41 41 41 59 41 42 67 41 57 41 41 41 41 41 41 41 AAAYABgAWAAAAAAA
0005 : 41 41 42 77 41 41 41 41 45 41 41 51 41 48 41 41 AABwAAAAEAAQAHAA
0006 : 41 41 41 4D 41 41 77 41 67 41 41 41 41 41 41 41 AAAMAAwAgAAAAAAA
0007 : 41 41 43 4D 41 41 41 41 42 34 49 41 41 45 2F 63 AACMAAAAB4IAAE/c
0008 : 6B 59 57 68 6D 39 5A 50 63 79 5A 33 4B 56 54 31 kYWhm9ZPcyZ3KVT1
0009 : 5A 71 51 48 68 6A 63 6F 6B 53 34 31 35 32 78 49 ZqQHhjcokS4152xI
000A : 4C 6E 53 6B 6D 4C 52 54 43 6C 73 76 33 61 51 75 LnSkmLRTClsv3aQu
000B : 63 76 6B 59 31 63 49 61 64 4C 4A 76 72 31 55 41 cvkY1cIadLJvr1UA
000C : 55 77 42 46 41 46 49 41 54 67 42 42 41 45 30 41 UwBFAFIATgBBAE0A
000D : 52 51 42 51 41 44 51 41 4C 51 41 79 41 44 59 41 RQBQADQALQAyADYA
000E : 52 77 41 3D 0D 0A                               RwA=..

返信
0002 : 00 00 00 00 00 00 00 00 00 00 4B 20 55 73 65 72 ........+OK User
0003 : 20 73 75 63 63 65 73 73 66 75 6C 6C 79 20 6C 6F  successfully lo
0004 : 67 67 65 64 20 6F 6E 0D 0A                      gged on..
ログインに成功した。
4E, 54, 4C, 4D, 53, 53, 50, 00, 03, 00, 00, 00, 18, 00, 18, 00
40, 00, 00, 00, 18, 00, 18, 00, 58, 00, 00, 00, 00, 00, 00, 00
70, 00, 00, 00, 10, 00, 10, 00, 70, 00, 00, 00, 0C, 00, 0C, 00
80, 00, 00, 00, 00, 00, 00, 00, 8C, 00, 00, 00, 07, 82, 00, 00
4F, DC, 91, 85, A1, 9B, D6, 4F, 73, 26, 77, 29, 54, F5, 66, A4
07, 86, 37, 28, 91, 2E, 35, E7, 6C, 48, 2E, 74, A4, 98, B4, 53
0A, 5B, 2F, DD, A4, 2E, 72, F9, 18, D5, C2, 1A, 74, B2, 6F, AF
55, 00, 53, 00, 45, 00, 52, 00, 4E, 00, 41, 00, 4D, 00, 45, 00
50, 00, 34, 00, 2D, 00, 32, 00, 36, 00, 47, 00
green がLMレスポンスの位置とレスポンス本体。 red がNTLM。 violet がユーザー名。
その後がワークステーション名と続く。

あー、このアカウントはテストの後削除してしまうので無駄な解析はしないで下さい。 (笑)

次は、いよいよNTLMv2 の解析へと進むのか?

 最初はどうしても、プレーン?なNTLM認証をやってみたいのでPOP3サーバーに自前のリクエストを投げてみる。
フラグから NTLMv2 0x00080000 ビットを外した 0x00008207 を送った
TlRMTVNTUAABAAAAB4IAAAAAAAAgAAAAAAAAACAAAAA=

4E, 54, 4C, 4D, 53, 53, 50, 00, 01, 00, 00, 00, 07, 82, 00, 00
00, 00, 00, 00, 20, 00, 00, 00, 00, 00, 00, 00, 20, 00, 00, 00
戻ってきたType2メッセージは
+ TlRMTVNTUAACAAAACgAKADgAAAAFgoICA/DSyAwamsw
AAAAAAAAAAGQAZABCAAAABQLODgAAAA9QADQALQAzA
EUAAgAKAFAANAAtADMARQABAAoAUAA0AC0AMwBFAAQA
HgBwADQALQAzAGUALgBuAGkAcwBlAGsAbwAuAGoAcAADA
B4AcAA0AC0AMwBlAC4AbgBpAHMAZQBrAG8ALgBqAHAAAAAAAA==

4E, 54, 4C, 4D, 53, 53, 50, 00, 02, 00, 00, 00, 0A, 00, 0A, 00
38, 00, 00, 00, 05, 82, 82, 02, 03, F0, D2, C8, 0C, 1A, 9A, CC
00, 00, 00, 00, 00, 00, 00, 00, 64, 00, 64, 00, 42, 00, 00, 00
05, 02, CE, 0E, 00, 00, 00, 0F, 50, 00, 34, 00, 2D, 00, 33, 00
45, 00, 02, 00, 0A, 00, 50, 00, 34, 00, 2D, 00, 33, 00, 45, 00
01, 00, 0A, 00, 50, 00, 34, 00, 2D, 00, 33, 00, 45, 00, 04, 00
1E, 00, 70, 00, 34, 00, 2D, 00, 33, 00, 65, 00, 2E, 00, 6E, 00
69, 00, 73, 00, 65, 00, 6B, 00, 6F, 00, 2E, 00, 6A, 00, 70, 00
03, 00, 1E, 00, 70, 00, 34, 00, 2D, 00, 33, 00, 65, 00, 2E, 00
6E, 00, 69, 00, 73, 00, 65, 00, 6B, 00, 6F, 00, 2E, 00, 6A, 00
70, 00, 00, 00, 00, 00
フラグは 0x02828205 つまり、NTLMv2 0x00080000 は外れている。
これでプレーンな NTLM Type3 リクエストを受け付けてくれるのか?
さらなる、深みへ。 (笑)

 いよいよ、Thunderbird[ が送り出した Type3 メッセージの解析だ。 これと同じものを生成できればOKということ。 (のはず)
 デコードした実データは
4E, 54, 4C, 4D, 53, 53, 50, 00, 03, 00, 00, 00, 18, 00, 18, 00
5A, 00, 00, 00, 18, 00, 18, 00, 72, 00, 00, 00, 00, 00, 00, 00
40, 00, 00, 00, 10, 00, 10, 00, 40, 00, 00, 00, 0A, 00, 0A, 00
50, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 05, 82, 08, 00
75, 00, 73, 00, 65, 00, 72, 00, 6E, 00, 61, 00, 6D, 00, 65, 00
70, 00, 34, 00, 32, 00, 36, 00, 67, 00, AF, CA, CE, BA, B4, 84
82, 6D, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
00, 00, 85, EF, B2, A0, 58, 8F, E2, 17, 6C, C1, 3C, A3, 2E, 53
0B, 56, F4, 51, 9B, FB, 98, 02, EB, D5
まず、LM レスポンスだ。 offset 12 を見てみると 18, 00 つまり、 24byte分のデータが 5A, 00, 00, 00 つまり、offset 90 に置いてあると書いてある。

 しかし、置いてあるデータはどう見ても LM レスポンスじゃないよね。
 Type3 レスポンスではフラグはオプションらしいのだけれど、一応見てみると、 05, 82, 08, 00 つまり、0x00088205 だ。 これが本当なら、Thunderbird のソースコードにある
#define NTLM_NegotiateNTLM2Key 0x00080000
が有効だよね。
NTLMv2 認証の Type3 レスポンスというわけだ。 はまりそうだなぁ。 (汗)
 いまさらながら、Type1 メッセージを見てみると
4E, 54, 4C, 4D, 53, 53, 50, 00, 01, 00, 00, 00, 07, 82, 08, 00
00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
フラグは 07, 82, 08, 00 つまり、 0x00088207 堂々と NTLMv2 認証をサポートすると宣言している。
再び、Thunderbird のソースコードを見てみると
// we send these flags with our type 1 message
#define NTLM_TYPE1_FLAGS      \
  (NTLM_NegotiateUnicode |    \
   NTLM_NegotiateOEM |        \
   NTLM_RequestTarget |       \
   NTLM_NegotiateNTLMKey |    \
   NTLM_NegotiateAlwaysSign | \
   NTLM_NegotiateNTLM2Key)
なんて書いてある。
まず、NTLMv2 認証の前にNTLM 認証の理解を深めたいなぁ。

11/20/2006 11:22 AM

こんにちは、8ビットのZ80のアセンブラー時代、上位、下位を逆にしてと言うの思い出した。アースキーコード表と16進->10進の変換表を用意してあった。
Thunderbird のソースコードはC++ ver6.0 との記憶が C++/CLR でもコンパイル可能?。言語を超えた通信の仕組みは大変ですね。

スー

11/20/2006 11:30 AM

スーさん、こんにちは。
Thunderbird や Firefox のソースコードはかなりさまざまな環境でコンパイルが出来ます。 Windows ばかりでなく、Linux や FreeBSDなどでも出来るようですよ。 ですから、さまざまなコンパイラに対応しているわけです。
コンパイルはコンパイラがやってくれますが、今回は自分でソースコードを読み解いて理解しなくてはなりません。 Thunderbird だけでも 38,000 ものファイルがあります。(汗)

本人

 Type2レスポンスの解析だ。 レスポンス自体は
TlRMTVNTUAACAAAACgAKADgAAAAFgooCBptSVzwnE0YAAAAAAAAAAGQAZABC
AAAABQLODgAAAA9QADQALQAzAEUAAgAKAFAANAAtADMARQABAAoAUAA0AC0
AMwBFAAQAHgBwADQALQAzAGUALgBuAGkAcwBlAGsAbwAuAGoAcAADAB4AcAA0
AC0AMwBlAC4AbgBpAHMAZQBrAG8ALgBqAHAAAAAAAA==
(適当に改行を入れている)
ということは、デコードすると 16進数で

4E, 54, 4C, 4D, 53, 53, 50, 00, 02, 00, 00, 00, 0A, 00, 0A, 00
38, 00, 00, 00, 05, 82, 8A, 02, 06, 9B, 52, 57, 3C, 27, 13, 46
00, 00, 00, 00, 00, 00, 00, 00, 64, 00, 64, 00, 42, 00, 00, 00
05, 02, CE, 0E, 00, 00, 00, 0F, 50, 00, 34, 00, 2D, 00, 33, 00
45, 00, 02, 00, 0A, 00, 50, 00, 34, 00, 2D, 00, 33, 00, 45, 00
01, 00, 0A, 00, 50, 00, 34, 00, 2D, 00, 33, 00, 45, 00, 04, 00
1E, 00, 70, 00, 34, 00, 2D, 00, 33, 00, 65, 00, 2E, 00, 6E, 00
69, 00, 73, 00, 65, 00, 6B, 00, 6F, 00, 2E, 00, 6A, 00, 70, 00
03, 00, 1E, 00, 70, 00, 34, 00, 2D, 00, 33, 00, 65, 00, 2E, 00
6E, 00, 69, 00, 73, 00, 65, 00, 6B, 00, 6F, 00, 2E, 00, 6A, 00
70, 00, 00, 00, 00, 00
Thunderbird のソースコードによれば
  // 0  NTLMSSP Signature
  // 8  NTLM Message Type
  // 12 Target Name
  // 20 Flags
  // 24 Challenge
  // 32 end of header, start of optional data blocks
Target Name は offset 0x00000038 つまり 56バイト目から 0x0x000a
つまり、10バイトである。
実際は、 50, 00, 34, 00, 2D, 00, 33, 00 45, 00
Flags は 05, 82, 8A, 02 つまり 0x028A8205 で 0x00000001 フラグが有効
従って Unicode が使われていることを示している。
変換すると(頭の中で)、P4-3E なのだ。

Challenge は 06, 9B, 52, 57, 3C, 27, 13, 46
文字として表示できないコードも含まれているとは知らなかった。(笑)

後は、この Challenge を基に Type3 メッセージを組み立てる。 予定、あくまでも予定。 (笑)

 .NET Framework 2.0 では簡単に書けてしまうNTLM認証。 そうなんです、たったフラグが一個。 (汗)

 ずいぶん前から、この認証プロトコルをきちんと書きたいと思って、こつこつ調べてきた。 手持ちの参考書籍ではあまりにも簡単に書いてある。 Web上で見つかる情報は、どれも少しづつ表現が違う。 第一、実データをキャプチャーした結果とあまりにも違いすぎる。

 あきらめて、Firefox, Thunderbird, openssl などのソースをダウンロードして中身を見てみた。 ファイル数は十万を超えた。 (笑) そこでやっと、Type1 と呼ばれるメッセージを最初にクライアントから送り出すことが解った。

 ところが、32ビットのフラグが資料とは合わない。 わけが解らない。 Thunderbird のソースコードを目の痛みをこらえながら見ているうちに、
#ifdef IS_BIG_ENDIAN 
  // NTLM uses little endian on the wire
  dword = SWAP32(dword);
#endif
なんて記述を見つけた。 そうか、Microsoftがはじめた方式だから、32ビットの格納はリトルエンディアンなんだ。 これで、Type1メッセージは大丈夫。 次は、サーバーから送り返されるType2レスポンスの解析だよね。 ここで深みにはまるのか???

11/19/2006 9:17 AM

おはようございます。MD4の暗号パスワードですね。
最近ちょっととうざかって居ます。

スー

11/19/2006 9:25 AM

スーさん、おはようございます。
DES, MD4, MD5 の暗号化はドキュメントやソースコードもたくさんあってうれしいんですが、NTLM の認証の細かいプロトコルが解らない。
POP3, SMTP, HTTP と少しずつ違っているようなんですが。 (汗)

どれも、実際に動いているソースコードがあるので、何とか解析できるでしょう。(笑) ただ、人より理解するための時間がかかるだけです。 と慰めてみる。 (爆)

本人

 今朝は、開発環境の中で試験用に動かしているIISがダウンしていた。 「予期しないエラー 0x8ffe2740 が発生しました」とのこと。



 Microsoft の「Web サイトを開始しようとすると、<中略>エラー メッセージが表示される」に行ってみる。 なおもぐぐっていると、からくり屋Blog というBlogにたどり着く。

 Skype だってぇ??? 気になってSkype の設定を見てみた。



 何と!こんなことになっていた。 いつの間にこんなことに? ともかく一件落着。 (笑)

07/02/2006 10:52 AM

おはようございます。OS起動どきにIISが先に起動しているとSKYPEは80を使わないか?、でもなさそう。接続のチェックは外しておきます。

スー

07/02/2006 11:6 AM

スーさん、こんにちは。 確かにIISが先に起動しているとSkypeは他のポートで接続を試みるようです。 その前提条件が、複数のバージョンのFrameworkを同時に動かすことになった今回のCommunityServer2.0のインストールによって変わってしまったようです。 具体的には、いままでSkypeより先に起動していたIISが...service ですから当然でしょうが...80ポートで待ちうけを始めるのが遅くなったということでしょうね。

本人

 いやはや、とんでもない見落としをしていた。 ListViewItem の中には object を受け取る Tag プロパティがありました。

1) サンプル
listView1.Items.Add(new ListViewItem(new string[] { "hoge", "1200" }));
listView1.Items[listView1.Items.Count -1].Tag = 100;  // ここに保存する
2) サンプル
ListViewItem[] items = new ListViewItem[nCount];

items[i] = new ListViewItem("hoge1");
items[i].Tag = i;          // ここに保存する
items[i].SubItems.Add("hoge2");

参照は
listView1.Items[i].Tag
いやー、情けない。 ドジだー! (汗)

 卑しい根性で、開発用のPCのCPUを Pentium4 3EGHz に換えてみた、その後。 確かに体感的に早くなったような気がする。 引き抜いた方のCPUも新しいマザーボードで無事に動作した。 (嬉)

 が、しかし、Firefox と Thunderbird が途中で黙り込んだり、終了時におかしな終わり方をするようになった。 再インストールしても状況は変らない。 CPUに負担がかかるようなソフトを複数同時に起動してみた。 他のソフトでは不具合に遭遇しない。

 諦めて、元のCPUに戻すことにした。 (涙)

 画像は、このトラブルには関係ないと思うけれど、テスト中に出現して消えなくなってしまったコンテクストメニュー。 面白いことが起きるものだ、時間がある時にでもFirefoxのソースコードを眺めてみよう。

 夏から連続駆動しているサーバー機の行く末が気になって、安いベアボーンとCPUを買った。 残りはあるもので済ませるつもり。 何せ、三年ほど開発に使ったPCをサーバーに転用したわけだから、いつ止まっても不思議はない。

 今や安いCPUと言えどもなかなかのもの。 気がつくと、現在開発に使っているものよりクロックが高い Pentium4 3EGHz FSB800MHz BOX。 それじゃ、CPUだけは取り替えようと、CPUファンを外そうと試みる。 なかなか外れない。 ゆっくり引き抜いたつもりが、CPUも付いてきた。 と言うことは、ロックを外さず...(汗)

 その後、ファンから外れないCPUを何とかしようとして、傷だらけに! まったく加減を知らない自分に呆れる。 まぁ、その後このBlogを書いている訳だから、無事に作業が終わったということか? (爆笑)

06/23/2006 10:49 PM

これが中古市場で出回っている「コア欠け」って言われている
物なのかな?
みんなCPUファンを交換しようとしてなるのだろうか?
壊れなくて良かったですね?あっ外したCPUは動かないかも・・・・・

そんなこと無いですね。

EzoTanuki

06/24/2006 8:2 AM

EzoTanuki さん、おはようございます。
壊すほどの力がなのが幸い? (笑)
壊れていないと思い込んでいますが、結果は報告します。 (汗)

本人

 息子が、「動かなくなってしまったんだよねー」と言って掃除機を持ってきた。 どうせホース部分についているコネクタの接触不良だろうとたかを括っていたら、それが動かない。

 テスターを持ち出したり、コントロール部分と直に繋いだりして問題を解明する。 結果、劣化したホースの内部で銅線を覆っている皮膜に亀裂が入り、内部の水分による漏電が原因だと判明。 漏電が激しい部分20cmを切り離して問題を解決。 人間の外科手術も同じようなことをしている...と思ったら、ボクののーみそは、しばらく遠い旅にでたのであった。 (笑)

 昨年は、部屋から廊下に降りる階段の脇に滑り台を作った。 今年は、何と!二階の部屋の床からドリルで穴を開け、ボルトを通しブランコを取り付けた。

 ドリルでバリバリと穴を開けながら、やはり自分は変わり者だと認識してしまったのは内緒。 (笑)
 娘が喜ぶのを見てどうでも良くなってしまった。

06/20/2006 4:26 PM

子供たちに、手作りで作ったものは、ベビーベットです。なかなか良く出来ていました。

スー

06/20/2006 6:36 PM

スーさん、こんばんは。 ベビーベットのことは前にもお話していましたね。
息子を育てていた時には、何をする余裕もありませんでした。 (汗)

本人

 .NET で ListView を使っていて MFCで提供されていた GetItemData や SetItemData のような機能が見つからなくて困っていた。 ListView に表示されるデータとほかに持っているデータのリレーションがとり難いのだ。
 ちょっと話題になったので調べてみた。 実は、その機能そのものを探していたので見つからなかったということらしい。

 ListViewItem を継承したクラスを作り、そこに何でも置いておける。

 まず、好きにクラスを作り
    class myItem : ListViewItem
    {
        private int data;

         public myItem(string[] str, int data)
            : base(str)
        {
            this.data = data;
        }

        public int ItemData
        {
            get
            {
                return data;
            }
        }
    }
 初期化はこんな感じ
        listView1.Items.Add(
            new myItem(new string[] { "カレーライス", "1200" }, 100));
        listView1.Items.Add(
            new myItem(new string[] { "レバニラ炒め", "280" }, 101));
        listView1.Items.Add(
            new myItem(new string[] { "塩ラーメン", "650" }, 102));

 保存したデータは自分のクラスで定義したプロパティで取得できる
    private void listView1_DoubleClick(object sender, EventArgs e)
    {
        if (this.listView1.SelectedItems.Count > 0)
            myItem mi = (myItem)listView1.Items[listView1.SelectedItems[0].Index];
            MessageBox.Show(mi.ItemData.ToString());
        }
    }
 何でも出来るから、勝手にやって、ということなのだろうけど、なかなかこのことに気がつかなかった。 あまりにも当たり前の話なので逆に話題にもならないのか?
 解説本は読まないので、意外にあらゆる本に記載されていることなのかも知れない。(汗)

 いずれにしても、自分ののーみその固さに唖然とした出来事でした。 (爆笑)

06/20/2006 4:24 PM

昔、苦労して作ったコンテンツが、今では一発で出来てしまうのですね。
でも元を理解していると応用が早く出来ますね。がんばるぞ~。何をだと言われそうだけど。

スー

06/20/2006 6:34 PM

スーさん、こんばんは。 元を覚えていて、それに固執すると先が見えてこない、という一番ばかばかしいパターンに陥ったわけです。
柔軟にものごとをとらえて行くやわらかい心が必要です。 自分への戒めですが。

本人

 きょうの天気予報は曇りとか雪、決して晴れという予報ではなかった。 これがピーカンに晴れたのはなぜだろう?

 なんにせよ、良い方に外れたのだから、結果オーライ。 ニセコらしさを楽しんだ一日でした。 それにしても、もう体が動かないぞ。

テスト環境のサーバーを立てるため、札幌へ部品を買いに出かけました。 たいていは、帰り道で寄ることになる「とっぴー」が改装中だったので、久しぶりに「GASTO」に寄りました。各テーブルにはなにやら怪しい(笑)端末がありました。 これで注文も出来るのかと思いましたが、考えすぎでした...

これから、ニセコに帰還します。美笛峠は吹雪でしょうか。明日はスキーを楽しむぞぉ。

01/22/2004 2:20 PM

羽田までたどり着いた。今日の高速羽田線は空いていた。

本人

01/22/2004 4:46 PM

千歳に到着。いつもより積雪が多い感じがする。気温が高いので吹雪はなしか?

本人

神奈川は晴天、富士山が良く見えます。ぽかぽか陽気です。

出かける時、今回もばたばたとCameraを仕込みました。 今度こそは、機能アップをはかろうと思っていたのに、そのままです。

01/19/2004 10:28 AM

BMP画像はサムネイル表示を出来ないみたいですね。やはり、JPGに変換した方がよさそうです。

本人

一ヶ月ぶりの、大阪千里中央のスターバックスです。 ノートパソコンをひろげている人、本を読んでいる人、いつもの朝の時間が流れています。 のんびりジャズを聞いていると、懐かしい時間の中に迷いこんでしまいそうです。

フライトまでちょっと時間があるせいか、大阪行きの便の待合席には誰もいません。 係員もいないし、ずっと向こうの方で、何人かの人が歩いているのが見えるだけです。 こんなに空いているのは久しぶりです...