.NET & Win Note

主にVisual Basic .NETについてのメモ書きです。
関連するWindows関係のメモも残していきます。

2003年5月2日 0:23:13

[VB] 暗号化について

ここに割とわかりやすい説明が
http://www.ascii.co.jp/pb/msdn/article/a28_0048.html

ところで、 Rijndael ってラインダールって読むんだね。読めなかったよ。

[VB] 暗号化エラーの原因?!

ヘルプの BlockSize プロパティーにそれらしき説明がありました。

ブロック サイズは、1 つの操作で暗号化または復号化できるデータの基本単位です。ブロック サイズを超える長いメッセージは、連続したブロックとして処理され、ブロック サイズに満たないメッセージは、ブロック サイズに達するまで余分なビットを埋め込む必要があります。

特に気になるのが「ブロック サイズに満たないメッセージは、ブロック サイズに達するまで余分なビットを埋め込む必要があります」の所。
たとえば BlockSize が128(ビット)となっている場合は、16バイト分のデータを確保しておく必要があるということだと思われる。

テスト用のソースはこんな感じ
これの Encrypt メソッドを呼び出すときに配列のサイズを指定しているが、これが肝。
今まで(Frameworkが1.0の時)は動的にサイズを変えるような事もせずに、プログラム内で256固定で宣言していたのに、なんの問題もなく動作していた。
ところが、1.1になってからは的確なサイズを指定する必要が出てきたようだ。
的確なサイズというのが、上記の BlockSize です。
自分でいろいろテストしてみての解釈で、これで正しいのか確証はもてないが、
たとえば、
123456789012
という12バイトのデータを暗号化する場合(上記ソースのForm1のButton1_Click)、 BlockSize が128ビット(=16バイト)ならば、上の説明通りに、16バイトのデータを用意する必要があるので、
Dim data(15) as Byte   ←配列は0から始まるので15
で宣言した変数を用意する必要がある。
上のリンク先のソースだと CryptoクラスのEncrypt メソッドのsizeの引数に15を与える。
これはコンソールの出力を見ると、暗号化前のデータと複合化したデータが一致しているのがわかる。

次に
12345678901234567890
という20バイトのデータを暗号化する場合、Byte配列が足りないので(だと思うが)、
「メモリ ストリームは展開不可能です」というエラーになる。
また、Encrypt メソッドにBlockSizeに合わない中途半端なサイズを与えても同様のエラーが発生する
上記20バイトのデータで、Encrypt メソッドのsizeに24を与えても、同じ「メモリ ストリームは~」のエラーになる。

しかし、ここでEncrypt メソッドにさきほどの15より BlockSize分大きい値である31を与えると、うまく暗号化、複合化が成功する。
ようは、暗号化するデータのサイズを満たす BlockSizeの倍数になるByte配列を用意すればうまくいくようである。

ここで、
12345678
の8バイトのデータでEncrypt メソッドに31を与えるとどうなるか。
すると今度は
「PKCS7 パディングは無効です。削除できません。」というエラーでやはりうまくいかない。
暗号化するデータよりも必要以上にByte配列のサイズを増やしてもこのように問題が起きる。
おそらく、Framework1.0ではこれが許されていたのだが、1.1になって厳密になってエラーとするようになったと思われる。

[.NET] オンラインの MSDN ライブラリ

なかなか探しきれなかったのだけど、たまたま見つけたのでメモ。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/netstart/html/sdkstart.asp

[.NET] MSDN マガジンいいこと書いてあるなぁ

でも、日本版は休刊するとか・・
http://www.ascii.co.jp/pb/msdn/toc/bn2003_index.html
眺めてみるといろいろ面白いことが書いてある

[.NET] GotDotNet

http://www.gotdotnet.com/team/ja/team/vb/
MLが非常に活発

[.NET] NUnit 2.0 の説明

どうやら加筆修正されたようです。
http://www.atmarkit.co.jp/fdotnet/tools/nunit2/nunit2_01.html
例外が「仕様通りに」起きるかどうかもテストできるんですね、知らなかった。

[SQL Server] ファイアホースモード ってなんじゃい

VB6 の話であれですが、SQL Server 操作してたらいきなり、
「 ファイアホース モードの間はトランザクションを開始できません。 」とかエラーが出てきやがってわけわからなかったのですが、どうやらトランザクションが既にかかってる状態で、さらにトランザクションを開始しようとしていたようです。

ヘルプではいくら探してもファイアホースなんかでてきやしないので、いろいろネットで調べてみると一つ発見。
http://www.users.gr.jp/ml/archive/sql/41.asp

ここによると
CursorType を adOpenForwardOnly 以外にすると良い
とあった。
ODBC を使わなければ避けることができるという解釈が成り立つのかもしれません。
というのも書いてあるけど、ADO直接で直接つないでもエラーは出ているのでODBCに限った話ではないのかも。

今までDBは一辺倒な使い方しかしたことがなかったので、気づかなかったけど、もしかすると・・・
・カーソルタイプによっては、レコードセットは同時に一つしか開くことが出来ない?
・レコードセットを既に開いているときに、トランザクションを開始することはできない?
・レコードセットを既に開いているときに、Updateを実行することも出来ない?

最後のは
Set Rs = Con.Execute(SQL)

Set Con = gTransDB.GetConnection
Rs.Open SQL, Con, adOpenStatic
とすることでOKになった。

[NEMCHI] POP3対応目指して

コマンドの一覧やら説明です
http://www.atmarkit.co.jp/fnetwork/rensai/netpro07/netpro01.html
しかし、NEMCHIはフォーカス奪うときがあるなぁ。ウィンドウ制御がいまいちなのか・・・

2003年5月1日 2:36:34

[VB] 暗号化を解除するデータの長さが無効です

これが、.NET Framework 1.1 にした途端にNEMCHIで出始めたエラー。
CryptoStream を使ったのだが、いまいち理解せずに使い始めているので、原因がさっぱりわかりません。
1.1になって IO.MemoryStream に与えるバイト列の長さのチェックが厳密になったのかもしれません。暗号データ保存用のバイト配列のサイズを変えていくとたまたまうまくいったりもします。
ドキュメント読みつつ、小さなテストプログラムを動かしながら、試してみるしかないですね。
やっぱ、理解せずにネットに落ちてるソースをほぼそのまま使ったのが失敗のはじまりでした。暗号化の部分はドキュメントを読んでもよくわからなかったので、手を抜いてしまったんですよね・・・
.NETの暗号化の仕組みを理解するまでは解決しそうにないです(T.T)

2003年3月18日 0:19:18

[VB] ツールチップの設定

VB.NETではプロパティーを探してもツールチップを設定する場所が見あたらない。
と思っていたら、今回は一つ手順が必要なようだ。
(MSDNインストール済み & IE の場合リンク可)
ms-help://MS.VSCC/MS.MSDNQTR.2003JAN.1041/cpref/html/frlrfSystemWindowsFormsToolTipClassTopic.htm

ツールチップコントロールを追加して、コントロールを選ぶとツールチップを入力するところが出てくる。

2003年3月16日 10:57:23

[VB] equal メソッド?!

なにげに中西さんのコーディング標準の中を見ていると、
「 String 値の比較には Equals を使うべき」と書いてある。
そういや、Java でも「==」を String オブジェクトに対して使うと、同じオブジェクトを指しているかを判断するのであって、中の値を比較するわけではなかった!!
すっかり忘れてた、まずい! と思ったら、 .NET では String オブジェクトに対して=を使うと、ちゃんと参照先の値で比較をするようになっているようです。なーんだ、焦って損した(笑)
まあ、でもグループで開発する時には、混乱を避けるために Equals を使う方が無難だと思った。

※しかし、逆に同じオブジェクトを指しているかどうか判断したいときはどうするんだろ?あんまり String オブジェクトで必要性は感じたことがないが・・・

2003年3月15日 1:07:54

[VB] For Each ~ in の使い方が変わった?

VB6と同じ感覚で、For Each in を使ってみたが、なぜか「キャストが有効でありません」というようなエラーが出る始末。
そのエラーが出たコード(すごく断片的ですが・・)
For Each obj in objs
    obj.Display
Next
objs は Hashtable です。 GetEnumurator で列挙を使っても同じ結果。
かなりいろいろ試してみて、やっと間違いに気づきました。
For Each obj in objs.Values
    obj.Display
Next
そう、Values というプロパティー(メソッドだったけかな?)を使って初めて値がとれるのです。
同様にキーもとれたりします。 Collection と違うわけやね・・・

2003年3月11日 0:01:23

[.NET]今日は、 .NET のメモリのなんでだろう?

たいした事してないのに起動するだけで20MBもメモリ食っちゃうのなんでだろ~♪
メインフォームを最小化するだけで、それが1MB程度に減っちゃうのなんでだろ~♪
プロセスモニターが嘘つきなのか~、それとも.NETのきまぐれか~
ガーベージコレクション休みっぱなしなのなんでだろう?
なんでだろ~なんでだろう~なんでだなんでだろ~う ちゃんちゃん♪


20MBは平均?!
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=3646&forum=7&10
gc.collectも手かなぁ
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=2683&forum=7&19

2003年3月10日 0:47:35

[VB] TreeView コントロールの AfterCheck イベントを処理する

TreeView コントロールはノード毎にチェックボックスをつけることも可能だが、チェックをマウスでクリックしたところで、ノード自体が選ばれるわけではないので、 SelectedNode プロパティーを使うと、チェックを変更したところではないノードを取得することになったりする。

こういう場合は SelectedNode プロパティーを使わずに、イベントの引数に与えられている e という変数を使うと良い。
この中には、どのノードでどういう操作をされてこのイベントが起きたのかという情報を含んでいる。
実際のところ、だいたいはこのイベントの引数を使えばほとんどの処理は事足りるのかも。

[VB] LinkLabel からブラウザやメールを立ち上げる

MSDNにサンプル(MSDNを入れている人のみリンク可)があります。
WebもメールもHTMLと同じ要領で Links.Add で定義しておけば良いようです。
linkLabel1.Links.Add(0, linkLabel1.Text.Length, "mailto:test@a-tak.com")
linkLabel2.Links.Add(0, linkLabel2.Text.Length, "http://www.a-tak.com")
そして、 LinkLabel のクリックイベントで、
System.Diagnostics.Process.Start(e.Link.LinkData.ToString())
で、関連づけされたアプリケーションを起動します。

[NEMCHI]1.0バージョン完成

かなり忙しくなっている仕事の合間にちょこちょこ作って、やっと正式版が完成しました。
仕事でプログラムやって、昼休みや夜に息抜きでNEMCHIのプログラムやってる自分は変態でしょうか?(笑)

NEMCHIですが一応、完成しましたがまだWebにはアップしてません。
今回、メールのフィルタ機能とパスワードを暗号化して保存という、でかい機能を二つつけたのでしばらく自分で使ってみてテストした後に公開します。
今回、苦労したのはフィルタ機能。フィルタ自体はテストケースを作って問題なく(といっても、後で間違いも見つかったが)いけたのだが、問題は UI の部分。
フィルターの階層構造を、ツリービューと関連づけるのはツリービューの各ノードの Tag プロパティーを使って簡単に出来たけど、追加やら削除がなかなかうまくいかなくて本当に苦労しました。(これもツリービューの Tag をベースに操作すれば簡単に出来たんだろうけどねぇ・・・)
アバウト画面も追加して、 LinkLabel (?)からブラウザが起動できて、「おーっ」とか言いながら、なんとかまともに仕上がりました。

今回は本当にテストケース( NUnit )に助けられましたね。
テストケースなしでやってたら、変更の度にバグに悩まされていたことでしょう。 UI のテストもこれで簡単に出来るといいんだけどなぁ。

.NET は本当に楽ですね。
今回、ソケット通信や正規表現やタスクトレイへの表示やシリアライズやブラウザやメールの起動など、 .NET のクラスライブラリが無かったら、とてもじゃないですがこんな簡単にこのソフトは作れなかったでしょう。 VB6 で同じ機能のものを作ろうとしたら、考えるだけでぞっとしますね(一からほとんどのものを作り、APIの嵐でしょうね)


2003年3月9日 2:23:05

[VB] TextAlign を指定してもラベルの文字が左上に表示される

Label コントロールの TextAlign を指定してもなぜか文字が左上に固定で表示されてしまう現象に陥った。
原因は、 FlatStyle を System にしていたためのようだ。ヘルプには「 Label クラスではこのプロパティーは無効です」って書いてあるのに・・・

2003年3月2日 22:46:50

[CVS]Windowsで個人のファイル履歴用にCVSを運用する

某いだてん大佐にダメだし食らったので(笑)修正、というか全面的に間違っていたので、消去♪
cvsNTってのがあるぜ!ということなので、教えてもらったのをそのまま貼っとこ(^.^)
http://www.atmarkit.co.jp/fjava/devs/xpd02/xpd02.html
これならなんとかなりそう・・・

[VS]インストーラーの画像を変更する

ここにいろいろかいてあります
http://www.atmarkit.co.jp/fdotnet/tools/websetup/websetup_05.html

2003年2月24日 0:30:09

[NEMCHI]フィルタ機能の設計

自分が実際に使う上で、必要な機能はマルチアカウントと、フィルタ機能だけになりました。
フィルタ機能をまず作って、メーリングリストのメールには反応しないようにすることにします。

フィルタ機能は To , From , Subject などのヘッダーに特定の文字列が入っているか、いないによって、通知ウィンドウへの表示対象とするかを決定づける機能です。ようは、いちいち通知しなくても良いメールを設定する機能です。

条件指定には And と Or を使えるようにします。
たとえば、 ML からのメールで、自分のアドレスが From にあるものは表示しない、などです。
この場合は To=ML@ML.ne.jp AND From=test@a-tak.com みたいな感じですね。
この And と Or は階層で表現できます。
上の条件に spam@spam.com からのメールも表示しないようにすると
To=ML@ML.ne.jp
And(絞り込み条件)
From=test@a-tak.com
Or(並列条件)
From=spam@spam.com
こんな感じで表現できますね。

こういう階層表現を表すというと、 Composite パターンが思い浮かびます。
Composite パターンに関しては、「Java言語で学ぶ デザインパターン入門(結城 浩 著 ソフトバンク パプリッシング 出版)」でも見てください。
VB.NET でのサンプルコードは中西さんのサイトにあります。

今回はサンプルのようにファイルとディレクトリの区別はないので、条件を表すFilterクラスを一個作ってそれで階層構造を表現します。
こんな感じのクラスです。
   Filter  
filter
Add()
Verify()
メンバ変数にfilterを持っています。これはHashtableやCollectionになっていて、下階層のFilterクラスのインスタンスが複数(または単数や0)入っています。
Addでfilter変数にインスタンスを追加します。
verifyは引数にメールのヘッダクラスのインスタンスを与えて、条件に一致したかどうかを調べます。
また、verifyはfilterメンバーに変数がセットされていれば、その中のインスタンスに対して、それぞれのverifyメソッドを呼び出します。
それぞれのインスタンスはまた、自分のfiter変数を確認して・・・・という感じで再帰的に処理がすすみます。これで、Andの処理が実現できます。
Orはfilterメンバーを順次処理していけば、自然とOr処理になる。
これでいこー。

[URL]
VB.NETとC#でデザインパターン

2003年2月23日 3:42:24

[NEMCHI]やっと完成ですね

やっと念願の IMAP 対応メールチェッカー完成です。
とりあえず、普通に使う分には問題ないレベルのものにはなってます。
初のフリーソフトにしては、無難に仕上がったものです。開発に関しても、テストファーストを一部実践してみたり、クラスの構造もかなりの検討を行って作っただけあって、ソースもきれいにまとまってます。
デザインパターンも意識して作成したかったのですが、使ったのと言えば Iterator パターンと Template Method パターンぐらいかな?
ただ、フィルター機能の時には、つかえそうなパターンがあったと思うので、デザインパターンの本でも見ながらチャレンジしてみます。
ご感想、要望ありましたら、メールでください。掲示板は今崩壊してますので(笑)

[暗号化]文字列の暗号化

案の定、 .NET のクラスライブラリに暗号化のクラスがいろいろ用意されているようだ。らっきー(笑)
サンプルもありました。どこまでの安全性がはかれるかわからないけど、平文よりは全然マシでしょう。
http://software.nikkeibp.co.jp/software/special/200212toku2/0212tk2b.html

2003年2月19日 23:16:03

[NEMCHI]Windowsがおわらねぇ

なぜだか、 NEMCHI が起動していると Windows のシャットダウンが始まらない。むむむ・・
こいつが邪魔しているのは確実で、 NEMCHI を止めると終了して、再度シャットダウンするとすんなりおわるんだよね(笑)
タスクバーに常駐している他のソフトは終了して、NEMCHIの順番にくると、シャットダウンを中断しちゃうような感じ。
困ったもんだ。これではさすがにまだ外に出せん。
実は既にもういっこ会社で個人的に使うソフトを .NET で作ったのだが、これも実は起動していると終わらなかったりする(笑)
試しにフォームを一個だけ作成した EXE を起動して試してみるが、これはちゃんと終わる。
今、ソースをコピーして一個ずつ機能やフォームを削除して試して言ってるが、どうもフォーム関係をプロジェクトから削除すると、怪しいながらも一応終了はしてくれるようになった。
フォームが解放できてないのかなぁ。

・・・というわけで、さんざんいろいろ試した結果、やはりフォームが解放されていないのが原因でした。
というのも、フォームを close ではなく、 hide したかったため、 closing イベントをキャンセルして hide してたんですね。
それで、そこで引っかかって終了できなかったというわけ。
やっぱhideとか使って手抜きするのは良くないみたいです。わかりづらくなるしねぇ。

2003年2月16日 20:30:38

[VB]フォームの位置をフォーム表示前に指定する

フォームの Left や Top プロパティーを使えば、フォームの位置を指定できるが、フォームを Show する前にこれらの値を指定しても、通常は指定した値は無効になってしまう。
実は、フォームの Start Position プロパティーがミソで、これを manual に指定しておかないと、 Show したタイミングで Left や Top プロパティーは変更されてしまうようだ。
VB6 もこんなだったけな?

[XP]Windows XP 用のアイコンを作成する

作成方法はこちら。
http://www.microsoft.com/japan/msdn/windows/windowsxp/winxpicons.asp

2003年2月16日 3:00:37

[NEMCHI]ほぼ完成

一応、メールを確認して、未読があれば通知ウィンドウを出すまでは完成したので、一応これでもメールチェッカーとしての役割は果たせるようになりました。
ソフト名も.NET Mail Checker for IMAPから、適当に文字を拾って「NEMCHI」としました。
ただ、今のところ通知ウィンドウの場所やサイズを覚えてくれなかったりと、ベータと出すにもいまいちなので、もうちょっと作り込んでから公開する予定です。

2003年2月14日 1:08:46

[VB] リソースファイルを使う

追加したファイルのプロパティーにあるビルドアクションを「埋め込まれたリソース」に変えておくのがポイント。
これに気づかず、ドツボにはまりました(笑)
MSDN(?)の通知領域にアイコンを表示するサンプルプログラムでもアイコンがリソースとして登録してありました。

http://dobon.net/vb/dotnet/programing/all.html

[メールチェッカー]あと少し

設定画面と設定のファイルへの保存も完成。
あとは、タイマーで定期的に、既に作成済みのメールをチェックする処理を起動するようにすれば完成だが、今日はここで時間切れです。

2003年2月13日 0:30:15

[VB] EXE の製品名などを設定する

VB6 の頃はプロジェクトのプロパティーで設定できていたが .NET では「属性」で設定を行う。
ただ、ひな形が AssemblyInfo.vb というファイルでプロジェクトを作ったときに既に用意されている。

この中の AssemblyProduct が製品名だ。他にもいろいろあるので、設定しておくと良いかもしれない。
値を取得する場合は Application クラスのメンバを参照すると良い。

[VB] VB.NET で XP の 視覚スタイル を使用する

やっぱり、見かけにもこだわりたいじゃない。

http://www.microsoft.com/japan/msdn/thisweek/vbxp/vbxp3.asp