何となく Blog by Jitta
Microsoft .NET 考

目次

Blog 利用状況
  • 投稿数 - 515
  • 記事 - 17
  • コメント - 1932
  • トラックバック - 159
ニュース
  • 検索エンジンで来られた方へ:
    お望みの情報は見つかりましたか? よろしければ、コメント欄にどのような情報を探していたのか、ご記入ください。
It's ME!
  • はなおか じった
  • 世界遺産の近くに住んでます。
  • Microsoft MVP for Visual Developer ASP/ASP.NET 10, 2004 - 9, 2008
広告

記事カテゴリ

書庫

日記カテゴリ

ギャラリ

その他

わんくま同盟

同郷

 

2008年7月8日

ソート祭りなの?→祭りだワショーイ(東方算程譚)

あ、こっちにトラバかな?→のんちゃんのVBお勉強に協力する試み (1)(東方算程譚)

それで、やっぱり基本の「バブルガム クライシス」じゃなくて、「バブル ソート」なのね。

こういうのは、絵を描きましょう。理解が進みます。ただし、この絵は「バブル ソート」ではなく、「ストーン ソート」です。

「バブル」は泡。泡は上に浮かぶ。「ストーン」は石。石は下に沈む。

なんかねぇ、前回の始点の近くにペンを置くと、勝手に前回の始点と今回の始点を結んじゃうんだよね。なぜ?

posted @ 22:56 | Feedback (0)

2008年7月7日

本題の前に、フンワリ考えてみる。

re: Vista UAC の未来をモワモワ考えるより:

「○○してもいいですか?」とセキュリティソフトが聞いてくる。俺もKasperskyを使ってますが、ぶっちゃけ、それをするとどんなリスクがあって、それをしないとなにができないのか、人並み以上にPC知識があるだろうと思う俺でも判断できません。

一応、詳細を読んだりしていますが、わかりません。つまり、情報の提示量に問題があると思います。

また、Kaspersky については、もうちっと調査をしておいてくれてもいいんじゃないの?とも思います。Symantec も同じような機能を実装していますが、標準で Windows に入っている機能については、聞いてきません。すでにルールが組み込まれています。また、どういう基準で選んでいるかわかりませんが、オンラインソフトを含む多くのソフトで、やはりルールが組み込まれています。

# re: Vista UAC の未来をモワモワ考えるより:

User へ選択を委譲しても責任の回避にしかなりません。
そんなんだったら、専門家が定めた policy で厳しく制限を課し利用させる方がよいかと。

ええ、そうですね。Vista の UAC は、その方向へ向かうのではないかと思います。あるいは、「向かって欲しい」と思います。

re: だいめいなし。より:

だったら、インストール可不可チェックの代行業者がいてもいーんじゃないかと。
#ウィルスチェッカーと同じノリで。
で、業者ごとにブラックリストとホワイトリストを持ってて、それに基づいてインストールの可否を判断する。
個々のソフトについてのインストールの可否はユーザが判断できないけど、その代行業者に対して信頼できるかどうかで判断する。

で、本題。本題の元ネタが、これ↑。

「Windows ロゴ プログラム」という、プログラムがあります。「Windows ロゴ プログラム : 概要」とか、「Windows Vista ロゴ プログラム」とか。Windows Application のロゴ プログラム要件に、「最小特権の原則」があります。日本語の資料を探せなかったのですが、英語の資料はこちら→Developer Best Practices and Guidelines for Applications in a Least Privileged Environment

テスト要件も、ダウンロードできますね。いきなりダウンロードしちゃうので、リンクにはしません。→ http://download.microsoft.com/download/a/4/c/a4c003f7-76be-444b-a3b7-4e74b7d5767f/Certifiedfor_ProgramTestCases_1.3J.doc

この中に、「TEST CASE 2. 最小特権ユーザーが他のユーザの文書やファイルを変更できないことを検証する」、「TEST CASE 3. 最小特権ユーザーが Windows System ディレクトリにファイルを保存できないことを検証する」というのがあります。「最小特権ユーザが」という制約がありますが、Windows ロゴ プログラムをパスしているアプリケーションは、勝手にシステム ファイルを書き換えないことが、第三者機関によって保証されているわけです。かつ、署名されていることも検査されますので、ウィルスなどによる改ざんを検出することもできます。

つまり、Windows ロゴのついているソフトウェアは、比較的安心してインストールできると言っていいでしょう。言い切りませんよ。レジストリに関して、テストケースが見あたりませんから。

100%の安心を保証するものではないにしろ、危険な要素が少ないことは保証してくれるものであります。しかし、大企業を含め、日本企業のソフトウェアの多くは、ロゴ プログラムに参加していません。なぜでしょう?

「費用の問題」であったり、「他社の動向を見て」であったりします。

自社製品を使って下さるお客様に「安心・安全」を付加することより、コスト(そりゃ、コストがかかるとそもそも選んでもらえない可能性も出てくるけどね)や周りの目の方が気になる様です。セキュアな環境を阻んでいる要因は、案外、こういう事だったりするのかもしれない。

セキュリティに関しては、リスクです。リスクは、顕在化するか、しないか、わかりません。問題として顕在化しないのであれば、つっこむ金は少なくしておこう、という考え方なのでしょうか。でも、顕在化したときにかかる費用は、顕在化回避のために費やすお金の比じゃないと思うのです。でも顕在化しなければ、無駄金になる・・・これだぁ!!「無駄金」という考え方だ!!

どうにかなりませんかね?

posted @ 21:58 | Feedback (7)
 

とか書きながら、養護するつもりはない。しかし、歴史を知っておく必要はあると思います。

Win32 API のリファレンスを見ていてよく見かける(無理矢理組み合わせた、かも)、「lpctstr」という表記。これを、分解してみようかと思います。

まず、「p」から。これは、Pointer の p です。C 言語において、「文字配列」と「文字列へのポインタ」は、同じように扱えてしまえますが、実は違うものです。そのため、「ポインタであること」を明示するのは、読むとき、保守するときに有用です。

次、「l」。これ、よくわかりません。いろいろ読んでいるうちに「これかな?」と思ったのは、「local」か、「long」の「l」です。大昔、扱えるメモリ量が少なかったり、少ない故に小さいバイト数でいろいろ扱うために、DLL や EXE の境界を越えてポインタを渡せなかったようです。「ポインタ」に、「起点からの距離」を表すものと、「絶対距離」を表すものがあった様です。このうち、「起点からの距離」は、起点が違えば指す場所が変わってしまいます。あるいは、「GlobalHeap」という関数がありましたが、特定のプロセスのみで使えるアドレスと、Windows 全体で使えるアドレスか。そのため、これらを分けるために付けられたようです。はい、そこの人!!鵜呑みにしない。自分で確認すること。なんにしても、Windows 2000 の頃には、分ける必要がなくなっています。

次、「c」。これは、Const の c です。関数の引数に対して、「この引数の値は、関数内で変化させない」事を示すために付けられます。関数の入力、出力を明示するために使うわけです。これも、C++ になって const で修飾した場合、コンパイラがエラーを出します。このため、変数の修飾に使用して明示する必要はなくなっています。

次、「t」。これは、Multi-byte charactor set と、wide charactor set の、どちらにでも変化するよ、を表しています。そのため、文字(列)にしかつきません。Win32 API 関数の最後につく、A とか W と同じカテゴリです。

そして、「str」。これは String です。C では、char は「文字」だけでなく、「1バイトの数値」の意味も持っています。このため、「char a[10];」だと、「10バイトのデータ」なのか、「最大9文字の文字列」なのか、わかりません。そこで、str を付け、「文字列」であることを明示したわけです。

他に、整数値につく「i」があります。これは、整数といえど、割り算をすると浮動小数点型に変換されることがあります。こういった、暗黙の変換を防ぐ(注意を向ける)意図を持ちます。

また、short の場合、演算結果がオーバーフローする可能性が高くなりますから、これをレビューで検出できるようにすることもあります。

あとは、符号のあるなしについても、ありますかね?signed char の 0x80 と、unsigned char の 0x81 を比べると、どちらが大きいか。これは、最近だとコンパイラが警告を出してくれます。また、符号の有無と同じように、縮小変換についても警告、あるいはエラーとなるようにコンパイラが修正されています。したがって、変数名に明示する必要はなくなっています。


このように、単に型を示していたのではなく、目視レビューで間違いを検出しやすくするための工夫だったわけです。で、コンパイラが検出するようになったからか、Visual Studio 2008 に付属する SDK のドキュメント(英語)では、これらのシステム ハンガリアンな記述がなくなっています(作業中かもしれない)。

このように、C/C++ では、意味がある事でした。しかし、すべての言語で意味があることではない、あるいは、同じ記号であっていいわけではありません。

VB や C# のコードで、型名を明示する必要はありません。特に、「クラスだから」と、「cls」を頭に付けているようなものは、全く意味がありません。

そんな無駄なことをするより、なぜそのような符号を付ける必要があるのかを知り、その上で、使用している言語にそれが必要なのか、同じようにしていいのか、他に追加することがあるか、といったことを考える事の方が重要ではないでしょうか。「システム ハンガリアン使うな」とは言いません。しかし、使う前に、それにどんな意味があるか、知って欲しいと思います。

posted @ 21:54 | Feedback (9)

2008年7月6日

マイクロソフトの開発製品開発部からのプレゼントにより、急遽参加することにしました。

VS2005 のときも、同様のプレゼントがありました。そのとき、某さんから「これを勉強会に参加してもらうことのネタにしたくない」というお言葉がありましたので、「じゃぁ、個人的に配っちゃおう」と、3人決めたのが前回のエントリ。その後、某所に「提供して」とのメッセージが流れていることに気がつくorz

私の分は、1つは「Silverlight を囲む会」に提供しました。「どう使ってもらってもいいです。」とお渡ししましたが、代表さんががめてしまったと思われます。
1つは、画伯にお渡ししました。画伯の、「おにょれ、敵か!」リストから削除していただくための賄賂でございますです。だって、ナメクジの被害が、本当にひどくて...想像してみてください。雨の降り始めに、壁をびっしりと這う、ナメクジの大群を...写真を撮ったのですが、あまりに気持ち悪いので、載せずに削除しました。
1つは、Ognacさんにお渡ししました。前回、VS2005 のときに期待を持たせてしまったので、そのお詫びです。
ではみなさん、Visual Studio & .Net Framework プロダクト フィードバック センター へ登録の上、そうですね、3つ以上のフィードバックをすること!!(MUST)よろしくお願いします。

そんなこんなで、750万円相当の「権利」が集まっていたことになりますね。


今回のグダグダ。借りたプロジェクターの、緑が死んでた。「部屋を暗くすれば・・・」って、そんなので、「鮮やかさ」は変わっても、「色合い」まで変わるわけないじゃないですか(白い蛍光灯なので、そう変わらない)。

部屋によって、電波の善し悪しが変わります。建物の仕様です。

セッションの方ですが、黒龍さんのマジックに期待していたのですが。。。1つですか、そうですか。いや、楽しめました。じゃなかった、勉強になりました。「空気読め」じゃなく、「距離を読め」ですね。・・・激ムズですorz

酢酸さんのセッション。なんで「加速度センサー」なのに、常時数値が出ているんですか?!わかりません、教えてください!!それと、小さいものを持つときは、カメラのことを考えてください。おながいします。

お昼。午後から教室が移動になります。荷物は持って、お昼ご飯に出かけてください。ただし。今後、LT 話者と司会者はお昼に出かけないでください。お願いしますです。

お昼ご飯買い出し隊が、お昼を食べられなかった件について、一言。「          」←ここに当人のコメントが浮かびます。見えない?気愛が足りません。

「イカロス」というと、お父さんの注意を聞かずに太陽に近づきすぎ、蝋が溶けてしまい、墜落するのですが、それでいいのですか?!それより何より、大鷲、コンドル、ミミズク、白鳥、ツバメという組み合わせは、タツノコプロじゃないですか!!

ライセンスの有効期限は、前もって調べておきましょう。前日動いたからって安心していたら、当日切れていて大変な目に遭います。

浮動小数点が、なにげにおもしろかった件。なんて仕様だ!!→Microsoft

画伯が2枚目な件。さらっとスルーする件。「ぶっちょめす」な件。

羽の生えた人が、途中でハムスターに変身する件。この辺で、睡魔にとらわれてしまった件。

twitter で、中さんがいなくなると、英語 SPAM が割り込んでくる件。センサーを付けられてる?!


おみやげは、ちゅきさんが写真に撮られています。今回、私からはシアトル土産を提供いたしました。大外れを引いた黒龍さん、期待させてごめんなさい。
USB メモリ付きボールペンを持って帰られたのはどなたでした?256MB なんです、ごめんなさい。


懇親会1次会場での話題。
ハーブを育てる技術。いや、難しいんですよ、これが。雑草のくせに!こんど、ローズマリー持って行きますね。
画伯の呪い。上に書いたのでもういい。
花子さんによる、じゃんぬさんの感想。必ず出るよね、じゃんぬさん。
でっかいプロジェクトのコンパイルについて。某、掲示板の話題。
聞き方っちゅうもんがあるだろ、ってことについて。某、掲示板の話題。
とりこびっちがぴえろっちに勝った件。
「毎晩パスタです」な件。
無謀にもりょーいちさんに退行する件・・・なんでこんな漢字に変換する!(T^T)>ATOK でも、植物は、動物ほどおもしろくないのよね。ひっそり公開中→Live Space 上のアルバム




なんだか、MSDN のサブスクライバ登録がうまくいかない人が多いようですね。どこかで集中して、情報交換しましょうか。

posted @ 17:03 | Feedback (6)
 

Vista の UAC、ホント、評判悪いですね。このブログへの検索エンジンからの参照は、「お待ちください画面」、「なからいさえさん」、「ボタン押下」などに並んで5強に入ります。

でも、私は、そんなにじゃまだと感じたことはありません。家で1台、会社で数台、Vista をインストールしています。家では Users グループ、会社では Administrators グループで使っています。ここ最近、UAC 画面を見たことは、家ではありません。会社では、レジストリ エディタを起動したり、インストーラの試験をするので、しょっちゅう見ています。

それで、「鬱陶しい」といわれる UAC ですが、通常の使用で本当に鬱陶しいですか?

開発やテスト業務に使う分には、確かに鬱陶しいです。先述のように、レジストリ エディタやインストーラは、起動するごとに表示されますからね。

でも、家のマシンで鬱陶しいと思ったことは、初期設定がすめばありません。いえ、家のマシンも鬱陶しいです。でもそれは、Vista ではなく、AV ソフトが、です。

私は今、Kaspersky を使っています。おそらく、設定によって変わるとは思うのですが、鬱陶しい。

このソフト、何かのソフトウェアがインターネットにアクセスしようとすると、「**が DNS サーバにアクセスしようとしています。許可しますか?」と聞いてきます。その次に、「**が、アドレス xxx.xxx.xxx.xxx にアクセスしようとしています。許可しますか?」と聞いてきます。

Windows Messanger の場合は、もっと鬱陶しい。どこかのバージョンで、PtoP になったのですか?おそらくオンライン状態を送信するためだと思うのですが、登録している人の数だけ「許可しますか?」が出てくるorz

また、MicrosoftUpdate などでアップデートすると、「最後に検査してからファイルの内容が変わっています。実行しますか?」と聞いてくる。鬱陶しい。。。

でもね、思うのです。本当は Vista も、これくらいやるべきなんだろうな、と。

Vista の UAC は、今のところ、ファイルのマニフェストで「管理権限が必要」とマークされているものを実行する場合に、「管理者として実行しますか?」と聞いてきます。では、「管理権限が必要」と判断するのは、誰ですか?

そのソフトウェアの開発者です。では、管理権限が必要とするそのソフトが、どんなことをするので管理権限を必要としているか、ご存じですか?

期待する以外の動作(取扱説明書に書いていないこと)をしないことは、我々にはわかりません。署名されていなければ、ウィルスにとりつかれる可能性もあります。この場合、我々にはウィルスがとりついていることはわかりません。

「開発者の自己申告である」、つまり「羊の皮をかぶったオオカミを防げない」という意味で、UAC は(全く無用とは言わないが)無用の長物だと思います。ここは、「開発者の意図」ではなく、「コードの意図」を警告しなければならないと思うからです。

「コードの意図を警告する」とは、どういう事でしょうか?そのために、Kaspersky の動きをあげました。このソフトは、レジストリに対する書き込み、チェックした後に変更がある実行可能コードの実行、ネットワークに対する応答用ポートの設置、ネットワークの彼方へのデータ送信などの「動作」を検知し、使用者に許可を求めてきます。

以前にもエントリしていますが、はっきり言って、鬱陶しい。

しかし、「何を許可しようとしているか」を理解すれば、使用者にとっては安心できる環境となり得ます。

とはいえ、重要なことなので繰り返しますが、鬱陶しい。この鬱陶しさと安心の妥協点。それが、UAC が向かうべき点ではないかと思います。

posted @ 16:58 | Feedback (10)
 

ネタもと:なぜこうもレビューされてないコードを記事に書く?(がるの健忘録)より

ん、、、すごいです。この、勘違い、すごすぎます。おもしろいネタをありがとう>がるさん

えと、なんか、ネタの元ネタ、注記が入っています。それでも、だからこそ、ネタにする・・・ネタができた。

わずか数行で"ものすごいテーブル"に! - jQueryプラグイン「Flexigrid」(マイコミジャーナル)より:

ここではPHPを使用し、MySQLから郵便番号データを取り出してJSON形式で返すサンプルファイルを作成してみた。


function sanitizeTag($var)
{
    if ( is_array($var) )
    {
        $var = array_map("sanitizeTag", $var);
    }
    else
    {
        $var = htmlspecialchars(trim($var));
    }
    return $var;
}

$postdata = sanitizeTag($_POST);
(以下略)

で、この、sanitizeTag 関数を通したものを、MySQL に、文字連結で渡している、と。

なんていうか。。。だからさぁ、「サニタイズ」という言葉だけで括るのやめようよ。

がるさんところに書いてあるように、また、注記が入っているように、この sanitizeTag 関数は、HTML に出力するためにはサニタイズしているけど、SQL としてはサニタイズしていない。単に「入力は、サニタイズしてから使う」などというから、こういう間違いをする。また、HTML としてのサニタイズも、おそらく不完全(なんだよね?>がるさん)。

「サニタイズ」は、使う対象に対して、使う直前に行う必要があります。もう一度書きますよ。「サニタイズ」は、使う対象に対して、使う直前に行う必要があります。

また、最近は「ハンガリアン使うな」が言われ出していますが、これ、正しくは、「型によるハンガリアン(システム ハンガリアン)使うな」です。そうではなく、変数の目的によるハンガリアン(アプリケーション ハンガリアン)は、大いに使うべきです。

変数 $postdata を、アプリケーション ハンガリアンによって改名してみます。たとえば、$htmlEscapedPostdata だったら。こうしておけば、HTML に対しては比較的安全に出力できるが、SQL に対しては安全ではないことがわかるでしょう。もちろん、「HtmlEscaped」だと長いので、適切に短くするのは可。ただし、ルールを決めて、そのルールを守りましょう。このように、アプリケーション ハンガリアンで変数を記述しておけば、「使う直前に」サニタイズすることの必要性は薄れます。

もっとも、この「使う直前」の元々の意味は、「ウェブアプリケーションで、ユーザ入力をサニタイズして、ユーザに確認させる画面に送付し、確認画面から戻ってきたものを使う」事に対する警告なので、ここで書いたこととは意味が違います。

posted @ 16:54 | Feedback (3)

2008年6月21日

マイクロソフトの開発製品開発部より、プレゼントをいただきました。「君のフィードバックをさらによいものにするために、君のコミュニティで役立ててくれ」ということなので、勝手ながら、あなたと、あなたと、あなたにプレゼントさせていただきます。該当者の方は、貰ってから驚いてください。

posted @ 21:01 | Feedback (8)

2008年6月19日

少し昔のエントリに、コメントをいただきました。その内容が、あまりにも「う~む?」だったので、紹介させていただきます。

re: VB 使うな、開発者なら。

「まぁ おかしいと思っていても実は正しくなってんじゃん。XPで動いていたんだし」
なんていわれました。
あまりにあっけにとられて こんな話してると「あれ。これって別に問題ないんだっけ?」
思わず考えてしまったほど・・・

もちろん、「う~む?」なのは、コメントをくださった通りすがりさんではなく、お話の中に出てくる「他の開発者」さんです。


やはりこの手の問題は開発ツールうんぬんではなくて
ちゃんとした知識を持っているか、理解が出来ているか この一点と言えるのではないでしょうか。

確かに。

私の意見は、「VB の開発環境は、無知でいることを助長するので、開発者なら VB の開発環境を使うな」と書くべきだったのですが、「無知で居続けようとする」人にとっては、開発環境が何であっても関係ないのですねorz



最後になりましたが、通りすがりさん、コメントありがとうございます。また、反応が鈍くてごめんなさい。

posted @ 22:32 | Feedback (0)
 

「人力検索サービス」って、どこかに同じような名前のサービスありませんでしたか?→情報検索に困ったときには、「人力検索サービス」

MSDN サブスクリプションの特典である、オンライン コンシェルジュですね。何度かお世話になりました。なかなかいいですよ。

posted @ 22:31 | Feedback (1)

2008年6月12日

Silverlight 2 β2 で、WebHttpRequest や WebClient が、本当に非同期通信になりました。

うん。なんかね、「非同期通信にしか対応していないよ」と書いてあったのに、Silverlight 上ではスレッドが1つしかなかったのね。それが、UI Thread と、Communication Thread に分かれたの。

はい、何が起こるかわかるよね。Communication Thread で UI Elements を操作しようとすると、例外が発生しますorz...


それと、Uri 型だった WebClient.BaseAddress が、ただの文字列になりましたorz...



そんなわけで、第3回と、第4回のコードを書き直し。


まず、SyncronizationContect を用意します。その名の通り、同期するためのコンテキストです。こいつに、UI Thread を参照させます。そして、通信を受け取った後、UI Thread で通信の内容を転写します。

元ネタは、開発者さんのブログ

では、書き直したコード。


// 同期コンテキスト
SynchronizationContext syncContext;

public Page() {
    InitializeComponent();
    this.Loaded += new RoutedEventHandler(Page_Loaded);
}

void Page_Loaded(object sender, RoutedEventArgs e) {
    // 現在のコンテキストを参照させておく
    syncContext = SynchronizationContext.Current;
    WebClient client = new WebClient();
    // ただの文字列なので、Uri に変換
    Uri assmblUri = new Uri(client.BaseAddress);
    // β1ではパスだったのに、.xap に変わっているので、パスに変換
    string path = System.IO.Path.GetDirectoryName(assmblUri.LocalPath).Replace('\\', '/');
    // スキーマやホストをつなげて URI にできる文字列にする
    string uri = String.Format("{0}://{1}{2}/warnigLog.xml"
        , assmblUri.Scheme, assmblUri.Host, path, assmblUri.AbsolutePath);
    textBox1.Text = uri;
    Uri logUri = new Uri(uri);
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(logUri);
    request.BeginGetResponse(new AsyncCallback(GetWarningLog), request);
}

private void GetWarningLog(IAsyncResult result) {
    HttpWebRequest request = (HttpWebRequest)result.AsyncState;
    HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(result);
    // 同期コンテキストから呼び出す
    syncContext.Post(SynchronizedResponse, response);
}

private void SynchronizedResponse(object state) {
    HttpWebResponse response = state as HttpWebResponse;
    Stream stream = response.GetResponseStream();
    try {
        XmlSerializer serializer = new XmlSerializer(typeof(WarningLog));
        log = (WarningLog)serializer.Deserialize(stream);

        textBox1.Text += ":resieved\n";
        foreach (Warning w in log.WarningList) {
            textBox1.Text += (w.ToString() + "\n");
        }
    } catch (Exception ex) {
        textBox1.Text = ex.ToString();
    }
}
posted @ 21:39 | Feedback (0)