主にVisual Basic .NETについてのメモ書きです。 関連するWindows関係のメモも残していきます。 |
2003年5月2日 0:23:13
ここに割とわかりやすい説明が http://www.ascii.co.jp/pb/msdn/article/a28_0048.html ところで、 Rijndael ってラインダールって読むんだね。読めなかったよ。 |
ヘルプの 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になって厳密になってエラーとするようになったと思われる。 |
なかなか探しきれなかったのだけど、たまたま見つけたのでメモ。 http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/netstart/html/sdkstart.asp |
でも、日本版は休刊するとか・・ http://www.ascii.co.jp/pb/msdn/toc/bn2003_index.html 眺めてみるといろいろ面白いことが書いてある |
http://www.gotdotnet.com/team/ja/team/vb/ MLが非常に活発 |
どうやら加筆修正されたようです。 http://www.atmarkit.co.jp/fdotnet/tools/nunit2/nunit2_01.html 例外が「仕様通りに」起きるかどうかもテストできるんですね、知らなかった。 |
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になった。 |
コマンドの一覧やら説明です http://www.atmarkit.co.jp/fnetwork/rensai/netpro07/netpro01.html しかし、NEMCHIはフォーカス奪うときがあるなぁ。ウィンドウ制御がいまいちなのか・・・ |
2003年5月1日 2:36:34
これが、.NET Framework 1.1 にした途端にNEMCHIで出始めたエラー。 CryptoStream を使ったのだが、いまいち理解せずに使い始めているので、原因がさっぱりわかりません。 1.1になって IO.MemoryStream に与えるバイト列の長さのチェックが厳密になったのかもしれません。暗号データ保存用のバイト配列のサイズを変えていくとたまたまうまくいったりもします。 ドキュメント読みつつ、小さなテストプログラムを動かしながら、試してみるしかないですね。 やっぱ、理解せずにネットに落ちてるソースをほぼそのまま使ったのが失敗のはじまりでした。暗号化の部分はドキュメントを読んでもよくわからなかったので、手を抜いてしまったんですよね・・・ .NETの暗号化の仕組みを理解するまでは解決しそうにないです(T.T) |
2003年3月18日 0:19:18
VB.NETではプロパティーを探してもツールチップを設定する場所が見あたらない。 と思っていたら、今回は一つ手順が必要なようだ。 (MSDNインストール済み & IE の場合リンク可) ms-help://MS.VSCC/MS.MSDNQTR.2003JAN.1041/cpref/html/frlrfSystemWindowsFormsToolTipClassTopic.htm ツールチップコントロールを追加して、コントロールを選ぶとツールチップを入力するところが出てくる。 |
2003年3月16日 10:57:23
なにげに中西さんのコーディング標準の中を見ていると、 「 String 値の比較には Equals を使うべき」と書いてある。 そういや、Java でも「==」を String オブジェクトに対して使うと、同じオブジェクトを指しているかを判断するのであって、中の値を比較するわけではなかった!! すっかり忘れてた、まずい! と思ったら、 .NET では String オブジェクトに対して=を使うと、ちゃんと参照先の値で比較をするようになっているようです。なーんだ、焦って損した(笑) まあ、でもグループで開発する時には、混乱を避けるために Equals を使う方が無難だと思った。 ※しかし、逆に同じオブジェクトを指しているかどうか判断したいときはどうするんだろ?あんまり String オブジェクトで必要性は感じたことがないが・・・ |
2003年3月15日 1:07:54
VB6と同じ感覚で、For Each in を使ってみたが、なぜか「キャストが有効でありません」というようなエラーが出る始末。 そのエラーが出たコード(すごく断片的ですが・・)
かなりいろいろ試してみて、やっと間違いに気づきました。
同様にキーもとれたりします。 Collection と違うわけやね・・・ |
2003年3月11日 0:01:23
たいした事してないのに起動するだけで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
TreeView コントロールはノード毎にチェックボックスをつけることも可能だが、チェックをマウスでクリックしたところで、ノード自体が選ばれるわけではないので、
SelectedNode プロパティーを使うと、チェックを変更したところではないノードを取得することになったりする。 こういう場合は SelectedNode プロパティーを使わずに、イベントの引数に与えられている e という変数を使うと良い。 この中には、どのノードでどういう操作をされてこのイベントが起きたのかという情報を含んでいる。 実際のところ、だいたいはこのイベントの引数を使えばほとんどの処理は事足りるのかも。 |
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のプログラムやってる自分は変態でしょうか?(笑) NEMCHIですが一応、完成しましたがまだWebにはアップしてません。 今回、メールのフィルタ機能とパスワードを暗号化して保存という、でかい機能を二つつけたのでしばらく自分で使ってみてテストした後に公開します。 今回、苦労したのはフィルタ機能。フィルタ自体はテストケースを作って問題なく(といっても、後で間違いも見つかったが)いけたのだが、問題は UI の部分。 フィルターの階層構造を、ツリービューと関連づけるのはツリービューの各ノードの Tag プロパティーを使って簡単に出来たけど、追加やら削除がなかなかうまくいかなくて本当に苦労しました。(これもツリービューの Tag をベースに操作すれば簡単に出来たんだろうけどねぇ・・・) アバウト画面も追加して、 LinkLabel (?)からブラウザが起動できて、「おーっ」とか言いながら、なんとかまともに仕上がりました。 今回は本当にテストケース( NUnit )に助けられましたね。 テストケースなしでやってたら、変更の度にバグに悩まされていたことでしょう。 UI のテストもこれで簡単に出来るといいんだけどなぁ。 .NET は本当に楽ですね。 今回、ソケット通信や正規表現やタスクトレイへの表示やシリアライズやブラウザやメールの起動など、 .NET のクラスライブラリが無かったら、とてもじゃないですがこんな簡単にこのソフトは作れなかったでしょう。 VB6 で同じ機能のものを作ろうとしたら、考えるだけでぞっとしますね(一からほとんどのものを作り、APIの嵐でしょうね) |
2003年3月9日 2:23:05
Label コントロールの TextAlign を指定してもなぜか文字が左上に固定で表示されてしまう現象に陥った。 原因は、 FlatStyle を System にしていたためのようだ。ヘルプには「 Label クラスではこのプロパティーは無効です」って書いてあるのに・・・ |
2003年3月2日 22:46:50
某いだてん大佐にダメだし食らったので(笑)修正、というか全面的に間違っていたので、消去♪ cvsNTってのがあるぜ!ということなので、教えてもらったのをそのまま貼っとこ(^.^) http://www.atmarkit.co.jp/fjava/devs/xpd02/xpd02.html これならなんとかなりそう・・・ |
ここにいろいろかいてあります http://www.atmarkit.co.jp/fdotnet/tools/websetup/websetup_05.html |
2003年2月24日 0:30:09
自分が実際に使う上で、必要な機能はマルチアカウントと、フィルタ機能だけになりました。 フィルタ機能をまず作って、メーリングリストのメールには反応しないようにすることにします。 フィルタ機能は To , From , Subject などのヘッダーに特定の文字列が入っているか、いないによって、通知ウィンドウへの表示対象とするかを決定づける機能です。ようは、いちいち通知しなくても良いメールを設定する機能です。 条件指定には And と Or を使えるようにします。 たとえば、 ML からのメールで、自分のアドレスが From にあるものは表示しない、などです。 この場合は To=ML@ML.ne.jp AND From=test@a-tak.com みたいな感じですね。 この And と Or は階層で表現できます。 上の条件に spam@spam.com からのメールも表示しないようにすると
こういう階層表現を表すというと、 Composite パターンが思い浮かびます。 Composite パターンに関しては、「Java言語で学ぶ デザインパターン入門(結城 浩 著 ソフトバンク パプリッシング 出版)」でも見てください。 VB.NET でのサンプルコードは中西さんのサイトにあります。 今回はサンプルのようにファイルとディレクトリの区別はないので、条件を表すFilterクラスを一個作ってそれで階層構造を表現します。 こんな感じのクラスです。
Addでfilter変数にインスタンスを追加します。 verifyは引数にメールのヘッダクラスのインスタンスを与えて、条件に一致したかどうかを調べます。 また、verifyはfilterメンバーに変数がセットされていれば、その中のインスタンスに対して、それぞれのverifyメソッドを呼び出します。 それぞれのインスタンスはまた、自分のfiter変数を確認して・・・・という感じで再帰的に処理がすすみます。これで、Andの処理が実現できます。 Orはfilterメンバーを順次処理していけば、自然とOr処理になる。 これでいこー。 [URL] VB.NETとC#でデザインパターン |
2003年2月23日 3:42:24
やっと念願の IMAP 対応メールチェッカー完成です。 とりあえず、普通に使う分には問題ないレベルのものにはなってます。 初のフリーソフトにしては、無難に仕上がったものです。開発に関しても、テストファーストを一部実践してみたり、クラスの構造もかなりの検討を行って作っただけあって、ソースもきれいにまとまってます。 デザインパターンも意識して作成したかったのですが、使ったのと言えば Iterator パターンと Template Method パターンぐらいかな? ただ、フィルター機能の時には、つかえそうなパターンがあったと思うので、デザインパターンの本でも見ながらチャレンジしてみます。 ご感想、要望ありましたら、メールでください。掲示板は今崩壊してますので(笑) |
案の定、 .NET のクラスライブラリに暗号化のクラスがいろいろ用意されているようだ。らっきー(笑) サンプルもありました。どこまでの安全性がはかれるかわからないけど、平文よりは全然マシでしょう。 http://software.nikkeibp.co.jp/software/special/200212toku2/0212tk2b.html |
2003年2月19日 23:16:03
なぜだか、 NEMCHI が起動していると Windows のシャットダウンが始まらない。むむむ・・ こいつが邪魔しているのは確実で、 NEMCHI を止めると終了して、再度シャットダウンするとすんなりおわるんだよね(笑) タスクバーに常駐している他のソフトは終了して、NEMCHIの順番にくると、シャットダウンを中断しちゃうような感じ。 困ったもんだ。これではさすがにまだ外に出せん。 実は既にもういっこ会社で個人的に使うソフトを .NET で作ったのだが、これも実は起動していると終わらなかったりする(笑) 試しにフォームを一個だけ作成した EXE を起動して試してみるが、これはちゃんと終わる。 今、ソースをコピーして一個ずつ機能やフォームを削除して試して言ってるが、どうもフォーム関係をプロジェクトから削除すると、怪しいながらも一応終了はしてくれるようになった。 フォームが解放できてないのかなぁ。 ・・・というわけで、さんざんいろいろ試した結果、やはりフォームが解放されていないのが原因でした。 というのも、フォームを close ではなく、 hide したかったため、 closing イベントをキャンセルして hide してたんですね。 それで、そこで引っかかって終了できなかったというわけ。 やっぱhideとか使って手抜きするのは良くないみたいです。わかりづらくなるしねぇ。 |
2003年2月16日 20:30:38
フォームの Left や Top プロパティーを使えば、フォームの位置を指定できるが、フォームを
Show する前にこれらの値を指定しても、通常は指定した値は無効になってしまう。 実は、フォームの Start Position プロパティーがミソで、これを manual に指定しておかないと、 Show したタイミングで Left や Top プロパティーは変更されてしまうようだ。 VB6 もこんなだったけな? |
作成方法はこちら。 http://www.microsoft.com/japan/msdn/windows/windowsxp/winxpicons.asp |
2003年2月16日 3:00:37
一応、メールを確認して、未読があれば通知ウィンドウを出すまでは完成したので、一応これでもメールチェッカーとしての役割は果たせるようになりました。 ソフト名も.NET Mail Checker for IMAPから、適当に文字を拾って「NEMCHI」としました。 ただ、今のところ通知ウィンドウの場所やサイズを覚えてくれなかったりと、ベータと出すにもいまいちなので、もうちょっと作り込んでから公開する予定です。 |
2003年2月14日 1:08:46
追加したファイルのプロパティーにあるビルドアクションを「埋め込まれたリソース」に変えておくのがポイント。 これに気づかず、ドツボにはまりました(笑) MSDN(?)の通知領域にアイコンを表示するサンプルプログラムでもアイコンがリソースとして登録してありました。 http://dobon.net/vb/dotnet/programing/all.html |
設定画面と設定のファイルへの保存も完成。 あとは、タイマーで定期的に、既に作成済みのメールをチェックする処理を起動するようにすれば完成だが、今日はここで時間切れです。 |
2003年2月13日 0:30:15
VB6 の頃はプロジェクトのプロパティーで設定できていたが .NET では「属性」で設定を行う。 ただ、ひな形が AssemblyInfo.vb というファイルでプロジェクトを作ったときに既に用意されている。 この中の AssemblyProduct が製品名だ。他にもいろいろあるので、設定しておくと良いかもしれない。 値を取得する場合は Application クラスのメンバを参照すると良い。 |
やっぱり、見かけにもこだわりたいじゃない。 http://www.microsoft.com/japan/msdn/thisweek/vbxp/vbxp3.asp |