Hatena::ブログ(Diary)

当面C#と.NETな記録 このページをアンテナに追加 RSSフィード

2005/4/28 (木)

[] Longhorn 10:38  Longhornを含むブックマーク  Longhornのブックマークコメント

WinHEC2005でLonghornの情報がいっぱい出てきてますね。

見た目はこれまでのまるっこいデザインから、角ばったものに変更された模様。

スケスケウインドウはいいんですが、日本語フォントが気になる。フォントがこのままなら、台無しですよ!

トラックバック - http://d.hatena.ne.jp/siokoshou/20050428

2005/4/27 (水)

[][] スクロールポジションの初期化 13:25  スクロールポジションの初期化を含むブックマーク  スクロールポジションの初期化のブックマークコメント

スクロールポジションを初期化するには、

panel1.AutoScrollPosition = panel1.AutoScrollPosition;

のように書けばいい。これでてっぺんに戻ります。

AutoScrollPositionで検索から飛んでくる人が多いのでメモ。

トラックバック - http://d.hatena.ne.jp/siokoshou/20050427

2005/4/26 (火)

[] オペラ8 18:06  オペラ8を含むブックマーク  オペラ8のブックマークコメント

本当に泳ぎだしちゃったよ。大丈夫なのか?

http://headlines.yahoo.co.jp/hl?a=20050426-00000004-cnet-sci

[] 移動メソッド 18:33  移動メソッドを含むブックマーク  移動メソッドのブックマークコメント

Point と Rectangle は Offset。Region は Translate ?

GraphicsPath は? Transform を使えば移動できるのかな?どうやるんだろ。

aspxaspx 2005/04/30 11:51 express版をいじり倒すことにします。
メモリも大量導入して準備オッケーデス。

siokoshousiokoshou 2005/05/03 11:45 HDDの空きがなくて指くわ中。整理しないと…。

トラックバック - http://d.hatena.ne.jp/siokoshou/20050426

2005/4/25 (月)

[] ウイルスバスター騒動 09:22  ウイルスバスター騒動を含むブックマーク  ウイルスバスター騒動のブックマークコメント

週末の世間を騒がせ、一般紙やニュースでも大々的に報道されたウイルスバスター騒動。問題の原因についての報道が出てきた。

トレンドマイクロのパターンファイル問題、ダブルチェックの不備が最大の原因 - CNET Japan

テスト項目実施漏れが原因のようだ。テスト工程の管理不備といったところか。

テスト項目はあったが実施漏れに気付かなかったそうな。ITの開発特有の問題でもなんでもなかった。

自分のとこでは、テスト実施管理なんかはExcelシートで管理してますが、実施漏れを見逃すとこうなってしまうのか。項目漏れはよくあるが、実施漏れはないなぁ。まぁ、出荷頻度が全然違うけど。

ところで、広く使われるソフトはテストパターンが膨大になり大変そう。漏れのない項目を作るのはどうやってるんだろう。絶対に漏れがないっては現実的には無理だけど。

ところでこの騒動、失敗データベースには登録されるよね?

(追記)もっと詳しい記事があった。

ニュース - トレンドマイクロが24日に再び緊急会見,「XP SP2環境ではテストせず」:ITpro

テストに使ったエンジンが最新版ではなかったとの情報も。

トラックバック - http://d.hatena.ne.jp/siokoshou/20050425

2005/4/23 (土)

[] .NETの普及率 09:19  .NETの普及率を含むブックマーク  .NETの普及率のブックマークコメント

.NETフレームワークはクライアントマシンにどの程度普及しているのか?

ある日のあるサイトにアクセスした、UserAgentの自己申告から調べてみた。

ユニークユーザ数(IPとUserAgent名の一致するものを省いた数): 1584

MSIEを含むUserAgent数: 1380
.NET CLRを含むUserAgent数: 613 (MSIE中 44.42%)

各バージョンごとの数:
Ver: 1.0.3705,		140
	(.NET全体に占める割合:	22.84%)
	(IE全体に占める割合:	10.14%)
	(ユニークユーザ数全体に占める割合:8.84%)

Ver: 1.1.4322,		559
	(.NET全体に占める割合:	91.19%)
	(IE全体に占める割合:	40.51%)
	(ユニークユーザ全体に占める割合:35.29%)

Ver: 2.0.40607,		2
	(.NET全体に占める割合:	0.33%)
	(IE全体に占める割合:	0.14%)
	(ユニークユーザ全体に占める割合:0.13%)

ここでいうユニークアクセス数には、携帯やロボットやWindows以外からのアクセスも含んでいる。各バージョンごとのユーザ数は、複数バージョンを別々にカウントした。

自己申告なので全然正しくないかもしれないが、インストールしていないのに申告するよりは、インストールしているのに申告しないことが多いと思うので、これよりは多いと思ってよさそう。

わりと入ってるな〜と思った。

トラックバック - http://d.hatena.ne.jp/siokoshou/20050423

2005/4/18 (月)

[] 買収 23:50  買収を含むブックマーク  買収のブックマークコメント

Adobe社がMacromedia社を買収。スラドで見てびっくり。

スラドにもあったけど、ライバルがいなくなるのが心配。

トラックバック - http://d.hatena.ne.jp/siokoshou/20050418

2005/4/17 (日)

[] もう戻れない 18:58  もう戻れないを含むブックマーク  もう戻れないのブックマークコメント

久しぶりにCをいじってて思った。

ヘッダに書く構造体の順番を気にするの面倒くさっ!

トラックバック - http://d.hatena.ne.jp/siokoshou/20050417

2005/4/15 (金)

[] .NETトリビア 00:29  .NETトリビアを含むブックマーク  .NETトリビアのブックマークコメント

プログラミング .NET Framework(isbn:4891003030)より。

MSCorLib.dllのMSは、Multilanguage Standardの頭文字。

元々は当然MicroSoftのMSだったけど、ECMAの標準化の際に変えたそうな。へぇ〜。CorLibはCommon Object Runtime Library。裏を取ろうかと思ったけど、どうでもいいのでやめたw

トラックバック - http://d.hatena.ne.jp/siokoshou/20050415

2005/4/14 (木)

[][] IndexOfのCompareOptionsの詳しい解説 の続き 23:29  IndexOfのCompareOptionsの詳しい解説 の続きを含むブックマーク  IndexOfのCompareOptionsの詳しい解説 の続きのブックマークコメント

id:siokoshou:20050411のプログラムで奇妙なのは keyword = ""、buff = "" のときです*1。このとき、無限ループに入ります(無限ループはプログラムがいいかげんなのが悪いのですがw)。posにいくつを入れても、optに何を入れても例外はあがってきません。StringSortが指定できたのもこの場合です。

String.IndexOfのMSDNライブラリの説明では「IndexOf( string value )のvalueがEmptyの場合、戻り値は0です」とあります。まぁ、IndexOfに渡す前にEmptyくらいチェックするので、たいした問題はないと思っていました。

ここに1文字の「〇」(ゼロ)を入れると、ゼロの文字が無視されてEmpty扱いで戻り値が0で返ってくるようです。OMG!

Emptyじゃなく「〇」(ゼロ)文字のように無視される文字の場合はチェックが難しい…、というか何が無視される文字なのか分からないので困ったものです。セキュアなプログラミング方法として、受け付ける文字だけを決めて、それ以外をはじくのがよいとされています。反対にまずい方法は、不正なデータをチェックする方法だそうな(昨日URLを挙げたIBMのdeveloperWorksより)。と文章ならさらっと書けますが、何が正しいかを決めることは大変なことです…。

ちなみにデバッガの不具合も見つけてしまいました。文字列はconstの""を与えているのに、デバッガではnullと表示されます。本当にnullを与えるとIndexOfで例外を挙げてくるので、デバッガの不具合かな?const stringに""を入れるのもなんですが。

keywordやbuffをstaticやインスタンスフィールドにして、""やString.Emptyを入れると、デバッガの表示が正しく""になりました。


今度こそ CompareOptions.None の説明。MSDNライブラリによると「文字列比較の既定のオプション設定を示します」。説明になってないような…。おそらく、CompareOptionsのNone以外の動作ではない、Ordinalでもなければ、Ignoreなんとかでもないってことだと思います。おそらく。

比較にはUnicode的な比較、IgnoreNonSpaceの説明で書いたような「ss」と「U+00DF」(エスツェット)が同一視される比較が行われます。 id:atsushieno:20050414 がとっても詳しいです。感謝します!(リンク先の Access のページの件は、CompareOptions.None ではないようです)

*1:if ( -1 != "".IndexOf( "" ) ) Console.WriteLine( "Find!)" ); を試すと解りやすい

トラックバック - http://d.hatena.ne.jp/siokoshou/20050414

2005/4/13 (水)

[] う〜ん 00:06  う〜んを含むブックマーク  う〜んのブックマークコメント

id:siokoshou:20050411ソースコードはセキュリティホールに繋がりそうだったので、一部削除しました。見た方、悪用厳禁ですよ!

[] 文字列とセキュリティ 15:22  文字列とセキュリティを含むブックマーク  文字列とセキュリティのブックマークコメント

文字列を入力に受け付けるっていうのは、間口の広い入り口を設けることになる。

間口の広いとはどういうことかというと、反対の狭い例を考えて見るとよくわかる。例えば、提示したいくつかの選択肢から選ばせる場合や、数字のみ入力に受け付ける場合なんてのが挙げられる。

間口が狭い場合は、チェックが容易だ。選択肢にないものをはじく、数字ではないものをはじく、数字の許容範囲を超えているものをはじくのは比較的容易だ。

文字列を受け付ける場合はどんなときがあるだろう?検索窓からの入力、アカウントの入力、パスワードの入力、記事を投稿する際の入力…。いくらでもありそう。数字を受け付ける場合も、バックエンドに渡るころには数字として扱っていても、初めは文字列として入力される。

入力された文字列の厳重なチェックはかかせない。当然サニタイジングしたり、SQLインジェクション対策のために文字列を厳重にチェックしているよね?

ASP.NETに限らず、セキュリティについて常に考えていますか?

IPA セキュア・プログラミング講座:IPA 独立行政法人 情報処理推進機構

no title

no title

ところで、そのチェックは完全ですか?ザルだったりしませんか?

文字列の比較って、どういう処理をしているのか知っていますか?

[][] IndexOfのCompareOptionsの詳しい解説 16:54  IndexOfのCompareOptionsの詳しい解説を含むブックマーク  IndexOfのCompareOptionsの詳しい解説のブックマークコメント

IndexOfでのCompareOptionsについてid:siokoshou:20050411のプログラムでいろいろ調べてみました。

Compareはまた別かもしれないので注意!


Ordinalは各文字のUnicode値を単純に比較する。もっとも単純な比較処理。デフォルトがこれだと思っていたら痛い目に会うので注意!


IgnoreCaseは大文字と小文字の区別をしない比較。「cool」と「Cool」、「COOL」、「cOOl」、「cool」が一致する。


IgnoreWidthは半角全角の区別をしない比較。カタカナのほかに「ABC」と「ABC」も一致する。

全角半角記述の論争も.NETが解決してくれる、人に優しいオプションw


IgnoreKanaTypeはひらがなとカタカナの区別をしない比較。「ドラえもん」と「ドラエモン」や「どらえもん」が一致する。「スネ夫」と「スネオ」は一致しない。


IgnoreSymbolsは空白文字、句読点、通貨記号などなどを無視する比較。かなり複雑な比較。ここまでくると、何が何やら分からない。MSDNライブラリの説明にも「〜などの記号を無視する」と記述されている。「など」って言われても…。その「など」を知らないと怖くて使えない…。

「cool」と「 c o o l 」や「c o o l」(先頭の空白に注意)が一致する。「cool」と「co%&$#ol」が一致する。


IgnoreNonSpaceの説明はMSDNライブラリより引用。

「文字列比較で、発音区別符など、非スペーシング組み合わせ文字を無視するように指定します。Unicode 標準は、基本文字を組み合わせて生成される新しい文字を組み合わせ文字として定義しています。非スペーシング組み合わせ文字は、表示されるときに文字間隔用の領域は確保しません。非スペーシング組み合わせ文字の詳細については、http://www.unicode.org の「The Unicode Standard」を参照してください。」

Unicodeの知識がないので、私には分かりません、これ。かなり高度な比較です。

「キー」と「キィ」が一致します!

ドイツ語の例(4/11のソースの例)なら「ss」と「\u00df」(エスツェット)が一致します。というのは実はひっかけの誘導で、「ss」と「エスツェット」が一致しないのは CompareOptions.Ordinal 指定のときだけです!「キー」と「キィ」の例は IgnoreNonSpace 指定時のみ一致です。


最後に残ったNone。StringSortはIndexOfでは使えま...あれ、使える例を発見…。おいおいおいおい。

続く

トラックバック - http://d.hatena.ne.jp/siokoshou/20050413

2005/4/12 (火)

[][] Compareの危険性 23:10  Compareの危険性を含むブックマーク  Compareの危険性のブックマークコメント

MSDNライブラリの「カルチャを認識しない文字列比較の実行」によると、「セキュリティ上の決定が文字列比較の結果に基づいて行われる場合は、カルチャを認識しない操作を実行して、結果が CultureInfo.CurrentCulture の値の影響を受けないようにします。」とあります。

本当にそれだけでいいんでしょうか?

using System;
using System.Globalization;

namespace Siokoshou
{
  public class Test
  {
    static void Main()
    {
      if ( 0 == String.CompareOrdinal( "〇あ", "あ〇" ) )
        Console.WriteLine( "Much! (CompareOrdinal)" );

      if ( 0 == String.Compare( "〇あ", "あ〇", false, CultureInfo.InvariantCulture ) )
        Console.WriteLine( "Much! (InvariantCulture)" );

      Console.ReadLine();
    }
  }
}

あなたの望む動作はどちら?

[][] IndexOfの危険性 01:16  IndexOfの危険性を含むブックマーク  IndexOfの危険性のブックマークコメント

IndexOfでも「〇」文字が不思議な動作をします。id:siokoshou:20050411のプログラムで、

const string keyword = "〇";
const string buff = "あいうえお";

にすると不思議なことが起きます。

[][] 危険な「〇」文字 01:16  危険な「〇」文字を含むブックマーク  危険な「〇」文字のブックマークコメント

上記2件の実行結果です。

Compareでは、CompareOrdinalはマッチせず、CompareのInvariantCultureではマッチします。Ordinal以外では「〇」文字は無視されます。

IndexOfで「〇」文字はすべての文字にヒットします。「あいうえお」くらいしか試してませんが、もしかしたらCharのすべての値にヒットするかもしれません。Ordinal以外のIndexOfではすべてこの問題が起きます。string.IndexOfも同様なので、ASP.NETなどで使う場合は注意が必要です。

さらに、同様の特徴を持った不思議な文字が多数あります。「\u01f6」〜あたりがヒットしまくる文字です。あんまり多いので調べるのやめました。

この2件をMSのセキュリティ問題窓口に報告したけど、セキュリティ上の脆弱性ではない、また各アプリケーションの実装に依存する事象だと返事が来てしまいました。まぁ、大きな問題ではないと思ってたので、それでいいことにしておきます。想像力が欠如した思考停止状態かもしれないので、いやこれは大きい問題になると思った方は注意してくださいね。

それから、自分のシステムに「〇」文字を入れてどうなるか試してみてください。検索で全部ひっかかる裏技としても使えます。自分のアプリではそうでしたw

(id:atsushienoさん、トラバさせていただきま〜す)

(追記)

IndexOfで「〇」だけで検索するとあらゆるものにヒットするのって、ゼロ文字が無視されてIndexOf( str, "" )が実行されるのと同じだからなんですね。今頃気付きました。

atsushienoatsushieno 2005/04/14 01:44 ユーザーの使い方の問題なので、これ自体はセキュリティ上の問題にはならないでしょうね。

siokoshousiokoshou 2005/04/14 13:55 コメントありがとうございます!そうですね、ユーザーの使い方によるので、フレームワークのセキュリティの問題ではないというMSの回答に納得しました。

2005/4/11 (月)

[][] IndexOfのCompareOptions 20:39  IndexOfのCompareOptionsを含むブックマーク  IndexOfのCompareOptionsのブックマークコメント

CompareInfoのIndexOfで、CompareOptionsってどんな比較をしてるの?と思って試してみました。

注)buffには本当は15文字目から半角カナが含まれています。はてなでは半角カナが全角に置き換えられてしまいます。

注2)IndexOfのいじめ試験プログラムです。IndexOfのまともな使い方の例ではありません。

using System;
using System.Globalization;

namespace Siokoshou
{
  public class GrepCount4
  {
    const string keyword = "ドラエモン";
    //                   0         5         10        15     22             32
    const string buff = "ドラエモンどらえもんドラえもんドラエモン ド ラ エ モ ン ドラえもん";

//  const string keyword = "cool";
    //                   0   4   8    13      21
//  const string buff = "coolCOOLcOoL c o o l Cool";

//  const string keyword = "ss";
//  const string buff = "\u00df";  // エスツェット

//  const string keyword = "";
//  const string buff = "";

    static void Test( CompareOptions opt )
    {
      Console.WriteLine( opt );
      CultureInfo ci = new CultureInfo( "ja-JP" );
      int found = 0;
      int pos = 0;
      while ( 0 <= ( pos = ci.CompareInfo.IndexOf( buff, keyword, pos, opt ) ) )
      {
        Console.Write( "{0}, ", pos );
        found++;
        pos++;
      }
      Console.WriteLine( "{0}found: {1}{0}", Environment.NewLine, found );
    }

    static void Main()
    {
      Test( CompareOptions.None );
      Test( CompareOptions.Ordinal );
      Test( CompareOptions.IgnoreKanaType );
      Test( CompareOptions.IgnoreKanaType | CompareOptions.IgnoreSymbols );
      Test( CompareOptions.IgnoreKanaType | CompareOptions.IgnoreSymbols | CompareOptions.IgnoreNonSpace
        | CompareOptions.IgnoreWidth | CompareOptions.IgnoreCase );

      Console.ReadLine();
    }
  }
}

実行結果:

None
0,
found: 1

Ordinal
0,
found: 1

IgnoreKanaType
0, 5, 10, 32,
found: 4

IgnoreSymbols, IgnoreKanaType
0, 5, 10, 21, 22, 31, 32,
found: 7

IgnoreCase, IgnoreNonSpace, IgnoreSymbols, IgnoreKanaType, IgnoreWidth
0, 5, 10, 15, 21, 22, 31, 32,
found: 8

どうやら文字列の比較処理は、Unicodeの詳細な知識なしで使うと問題に出会いそうですね。

keywordとbuffのコメントアウトしてある例もお楽しみください。@IT会議室を参考にしました。

(追記:ちょっとコード訂正しました)

(さらに追記:コード追加しました)

UTF-16になれば単純な値の比較だけで文字の比較ができるかと思っていたけど、世界中の文字を相手にするってことはそうもいかないってことなのか…。が〜んと打ちのめされました。

2005/4/10 (日)

[] サマータイム、夏時間、Daylight Saving Time 11:27  サマータイム、夏時間、Daylight Saving Timeを含むブックマーク  サマータイム、夏時間、Daylight Saving Timeのブックマークコメント

サマータイム導入のうわさがあちこちでささやかれてるようです。10年前くらいに一度うわさになったような気が…。

あらゆるものがコンピュータに依存している今、導入するとなると2000年問題級の一大事ですが、いいんでしょうか…。コンピュータがない世の中だったら、サマータイムはちょっと楽しそうだけど。

イギリスでATM停止なんて問題も起きたようです。

表示できません|河北新報オンラインニュース / ONLINE NEWS

日本にはタイムゾーンが一つしかないし、コンピュータが普及してからサマータイムを経験したことはないので、時刻を扱うソフトの多くは時刻に関して深く考えられてないんじゃないかと思います。海外との取引を扱うものならよく考えられているかもしれません。

私はサマータイム導入でどういう問題が起き得るのかもよく知りません。

春に一時間進んで、秋に一時間戻るのが一般的なようですね。戻ったときって、ファイルやらデータベースやらの整合性をどうするんだろ。全部UTC基準にすればいいのかな?今さらそんなことできないか??なんか2000年問題級どころじゃないね、これ。

手持ちのビデオとかは、使う人が対応するしかないのか。夏時間対応ってのが売り文句になりますね。経済効果?損失?よく分からん。

[][] stringのIndexOfは高度な比較処理 12:12  stringのIndexOfは高度な比較処理を含むブックマーク  stringのIndexOfは高度な比較処理のブックマークコメント

stringのIndexOfをいろいろ調べてみました。セキュリティにかかわる場面で仕様を知らずに使うと、セキュリティホールになりかねないもののようです。国際化なんてしないからSystem.Globalizationなんか知らなくていいやっと思ってたけど、知らないと危険かも。

まずはstringのIndexOfをMSDNライブラリで見ると、「このメソッドは、現在のカルチャを使用して、単語 (大文字/小文字を区別し、カルチャに依存した) 検索を実行します。」とありました。単純な文字の比較じゃないようです。

@ITの掲示板でIndexOfのバグ(?)と調査の話題がありました。stringのIndexOfは、CompareInfoのIndexOfを呼んでいるそうです。

CompareInfoクラスのMSDNでの説明を読むと、「セキュリティの決定が文字列の比較や大文字/小文字の変換操作に依存する場合は、システムのカルチャ設定にかかわらず一定の動作を保証するために InvariantCulture を使用してください。」と注意事項があります。なにやら危険な臭い。

CompareInfoのIndexOfにはCompareOptionsを引数に取って、比較方法を指定できるようになっています。

CompareOptionsの詳細はこちら。大文字小文字を区別しない、全角半角を区別しない、空白や句読点などを無視するなど、いくつかのオプションがあり、ずいぶん高機能です。これをUnicodeすべてについてテストしたんだろうか…。@IT掲示板の話題を見る限り、そうでもないんだろうなぁ。誰かあの問題は報告したんでしょうか。

この高度な比較は注意ですね。知らないで使うといろいろと問題を起こしそう。

CompareOptions.Ordinalを使うと単純な比較になるようです。単純な比較で済む場合、これを使うといいかもしれません。検討の価値ありです。

今日も実行速度比較をしてみます。文字列比較の問題は実行速度だけの問題じゃないけど、とりあえず速度は試してみたかったので。コードはかなり手抜きです。「aaa.txt」の名前でUTF-8のファイルを用意してください。このファイル中にある文字「の」を数えます。

using System;
using System.IO;
using System.Text;
using System.Globalization;

namespace Siokoshou
{
  public class GrepCount2
  {
    static string fileName = "aaa.txt";
    static string keyword = "の";
    const int LoopMax = 100;
    const int testNum = 5;

    static int TestDefaultIndexOf( string buff )
    {
      int found = 0;

      for ( int i = 0; i < LoopMax; i++ )
      {
        found = 0;
        int pos = 0;
        while ( 0 <= ( pos = buff.IndexOf( keyword, pos ) ) )
        {
          found++;
          pos++;
        }
      }
      return found;
    }

    static int TestIndexOfOrdinal( string buff )
    {
      int found = 0;
      CompareInfo ci = CompareInfo.GetCompareInfo( "" );

      for ( int i = 0; i < LoopMax; i++ )
      {
        found = 0;
        int pos = 0;
        while ( 0 <= ( pos = ci.IndexOf( buff, keyword, pos, CompareOptions.Ordinal ) ) )
        {
          found++;
          pos++;
        }
      }
      return found;
    }

    [STAThread]
    static void Main( string[] args )
    {
      int[] count = new int[ testNum ];
      int[] tick  = new int[ testNum + 1 ];
      int testCount = 0;

      string buff;
      using ( StreamReader sr = new StreamReader( fileName ) )
      {
        buff = sr.ReadToEnd();
      }

      tick[ testCount ]  = Environment.TickCount;
      count[ testCount++ ] = TestDefaultIndexOf( buff );

      tick[ testCount ]  = Environment.TickCount;
      count[ testCount++ ] = TestIndexOfOrdinal( buff );

      // もう一度
      tick[ testCount ]  = Environment.TickCount;
      count[ testCount++ ] = TestDefaultIndexOf( buff );

      tick[ testCount ]  = Environment.TickCount;
      count[ testCount++ ] = TestIndexOfOrdinal( buff );

      tick[ testCount ]  = Environment.TickCount;

      Console.WriteLine( "TestDefaultIndexOf: {0}, {1}msec", count[ 0 ], tick[ 1 ] - tick[ 0 ] );
      Console.WriteLine( "TestIndexOfOrdinal: {0}, {1}msec", count[ 1 ], tick[ 2 ] - tick[ 1 ] );
      Console.WriteLine( "TestDefaultIndexOf: {0}, {1}msec", count[ 2 ], tick[ 3 ] - tick[ 2 ] );
      Console.WriteLine( "TestIndexOfOrdinal: {0}, {1}msec", count[ 3 ], tick[ 4 ] - tick[ 3 ] );
      Console.ReadLine();
    }
  }
}

ものすごい速度差です…。

[][] 日本語Windowsでの文字列の比較や検索 16:09  日本語Windowsでの文字列の比較や検索を含むブックマーク  日本語Windowsでの文字列の比較や検索のブックマークコメント

文字列の比較のあたりの話題は、MSDNライブラリの「固有カルチャのデータの比較と並べ替え」に詳しい記述がありました。

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpguide/html/cpconsortingdataforspecificculture.asp

日本語の設定でWindowsを使うには、国際化のあたりを一通り読んだほうがよさそうです。

こちらが導入としてはよさそう。「推奨される国際対応アプリケーション開発手順」

IndexOfによる検索は、重要なセキュリティに関する場面では使用頻度は高くないかと思いますが、文字列の比較は使うこともあるかと思います。文字列の比較の話題は「カルチャを認識しない文字列比較の実行」が詳しいです。

bkbk 2005/04/10 14:21 かなり差がでますね!
いいこと知りました!

siokoshousiokoshou 2005/04/10 16:08 コメントありがとうございます!一度MSDNライブラリを読んでから試してみてくださいね〜。

トラックバック - http://d.hatena.ne.jp/siokoshou/20050410

2005/4/9 (土)

[][] ToArray( type ) の使い方 01:15  ToArray( type ) の使い方を含むブックマーク  ToArray( type ) の使い方のブックマークコメント

http://support.microsoft.com/kb/312390/ja/より。

Customer [] customer = (Customer[])myArrayList.ToArray(typeof(Customer));

NG: ToArray( typeof( Customer[] ) )

メモ。

[][] C#実行速度比較 10:59  C#実行速度比較を含むブックマーク  C#実行速度比較のブックマークコメント

blogサーバ構築記(サーバ構築記)さんで、C#の実行速度に関するおもしろい記事を見たので、速度比較してみます。

元の記事はこちら

ファイル中の文字列をカウントするコードです。C#でポインタを使って文字列を探し出しています。これと、素直に書いたコードがどれだけ違うのか興味を覚えて、実行速度を比較してみました。実行速度はメモリ状況など様々な要因で変わるので、なんともいえないところはありますが、素直な(つもりの)コードとあまりに速度が違ったのでショックでした。

続きを読む

campanellacampanella 2005/04/09 18:09 こんにちは。
「サーバ構築記」を管理していますカンパネルラです。
まずは私のブログに書き込みありがとうございます。

実は私は、プログラマーでも何でもありません。(^ ^ ;ゞ
趣味でサイト構築・プログラム・デザインをやっているだけです。ブログのタイトルを見ればわかるように、「サイト構築」を中心に気が付いたこと・実験したこと・調べたとことを載せています。

私は元々デザイナーだったのですが、プログラムをはじめたのも、BBSやカウンターに至るまで自分のデザインを表現したかったためです。(けっこうこの辺、デザイナーであれば文字の大きさから配置までもう、他人が見たら「え?そこまでやる?」レベルまでこだわると思います)

ので、プログラムはそ〜んなに詳しいわけではありませんが、ま、でもやってることは趣味の範囲を超えてしまっているかもしれないですね。(^ ^ ;ゞ
嫌々プログラムの仕事をやっている人から比べれば・・・・。

原辰徳元監督が言っていました。大学時代に他の大学と試合をしたときに、チームの誰かが対戦相手のチームに対して
「おまえらのような趣味で野球をやっているようなチームに、うちらが負けるはず無い」と見下したそうです。
それに対して彼らは、
「そうだ。趣味でやっている。だから命をかけてプレーできるんだ。」と言われたそうです。

趣味であるが故の強みですね。


さて、私の速度対決ですが、厳密な意味での対決は出来ていません。
たとえば、100回ループの for は、よりプログラムの初期に持って行くべきでしょうし、各変数の初期化やインスタンス化も、このループの中に入れないと、それらにかかる時間が含まれていませんからね。
ただ、変数の宣言やインスタンス化は、100回程度ならそう気にもならないかなぁ。と。

シオコショウさん(で、いいのかな?(^ ^ ;ゞ)は、測定する処理とループを丸々関数(メソッド)化してるんですね。この方がプログラムは見やすいかもしれませんね。

今回の私の測定はより実用的なもので実験してみようという試みから出発しました。(他のサイトだと数学の計算とかが多いですからね。)
よって次は、処理のみ関数化・クラス化させて、それらの呼び出しも含めて測定したいと思っています。
当然の事ながら関数・クラス化させると遅くなるでしょうから・・・。

siokoshousiokoshou 2005/04/09 20:44 書き込みありがとうございます。
職業プログラマよりも、「できる」趣味プログラマはよくいます。この業界では周知の事実です。Geekがこの業界を牽引していってますし。

この記事の比較は、あんまりこだわった比較はしていないです。かなりいいかげんです。
GCがいつ動くか分からなかったり、使うPCなどの環境によってもいろいろな要因が変わるので、厳密な比較をしたところで、限定された条件化での比較にしかならないとも思います。
そもそも各処理の汎用度が違うので、同じことをするものを比べているとも言えません。その点は目をつぶってください〜。

ほんじほんじ 2005/04/26 15:00 この比較ですが、処理時間の差は文字列のサーチ部分ではなくて、主にFileStream()とStreamReader()の差ですよね。

配列をなぞるだけの処理って、単純にポインタに置き換えたからってそうそう速くはならないんじゃないかと思いまして、

http://blog.livedoor.jp/campanella_77/archives/18471113.html

↑ためしに、こちらのコードのsearchLine()の部分を、すなおにIndexOf()で書いてみたらポインタを使ったオリジナルよりむしろ速くなりました。
(検証用に書いたのでバグチェックとか厳密にはやってません)

public static String searchLine2
(byte[] bBuff , String str , int max)
{
int pos = -1;
while((pos = Array.IndexOf(bBuff, (byte)str[0], pos + 1, max)) != -1)
{
int i;
for(i = 1; i < str.Length; i++)
{
if(bBuff[pos + i] != (byte)str[i] || pos + i >= max) break;
}
if(i == str.Length)
{
int start = Array.LastIndexOf(bBuff, (byte)’¥n’, pos, pos);
if(start == -1) start = 0;
int end = Array.IndexOf(bBuff, (byte)’¥n’, pos, max - pos);
if(end == -1) end = max - 1;
System.Text.StringBuilder res = new StringBuilder(end - start + 1);
for(int j = start; j <= end; j++)
res.Append((char)bBuff[j].);
return res.ToString();
}
}
return null;
}

siokoshousiokoshou 2005/04/26 17:55 ほんじさん、コメントありがとうございます。おもしろそうですね、これ。
文字列の比較はアルゴリズムのテキストによく出てくる深いトピックなので、いろんなコードを比較するとおもしろいかもしれないですね〜。

トラックバック - http://d.hatena.ne.jp/siokoshou/20050409

2005/4/8 (金)

[][] Unique Algorithm 08:45  Unique Algorithmを含むブックマーク  Unique Algorithmのブックマークコメント

フレームワークにUniqueがないな〜と思って書いてみました。あまりにも簡単に書けてびっくり!Unixでお馴染みのuniqの処理です。

using System;
using System.Collections;

namespace Siokoshou
{
  public class ArrayListWithUnique : ArrayList
  {
    public ArrayListWithUnique() {}
    public ArrayListWithUnique( ICollection c ) : base( c ) {}
    public ArrayListWithUnique( int num ) : base( num ) {}

    public void Unique()
    {
      for ( int i = 0; i < this.Count; i++ )
      {
        for ( int j = i + 1; j < this.Count; j++ )
        {
          if ( this[ i ].Equals( this[ j ] ) )
          {
            RemoveAt( j-- );
          }
        }
      }
    }
  }
}
トラックバック - http://d.hatena.ne.jp/siokoshou/20050408

2005/4/7 (木)

[] Google Maps衛星写真登場 09:53  Google Mapsに衛星写真登場を含むブックマーク  Google Mapsに衛星写真登場のブックマークコメント

Google Mapsで衛星写真が見れるようになりました。

http://maps.google.com/

おもしろかったので偉そうな感想を書いてしまいます。

Ajaxブームの火付け役のGoogleサジェストとMapsは技術もおもしろいけど、それよりもコンテンツのおもしろさが際立っています。ローカルアプリのような操作性と応答性能はさすがGoogleと感じましたけど。

サジェストは、よく検索されているキーワードがするするっと順に提示されるのが本当におもしろい!これまではほんの一部しか公開されることがなかったものを、なんだか世間の流行をリサーチしているような感覚で見れることに惹きつけられます。頻繁に検索される語句が優れたコンテンツになってしまう、Googleだからできた量から質への転換ですね。

一方、Mapsは技術はすごいけど、ローカルで動く地図ソフトがそのままネットに再現されただけに近かったので、ふ〜んとしか思いませんでした。今回これが、普段あまり目にできなかった解像度の高い衛星写真が見れるようになって、印象ががらっとかわってしまいました。衛星写真は非日常的でものすごく魅力的です。NASAのWorld Windもおもしろいですね。

家の一軒一軒が判別できる解像度でぐりぐりと動かせるのは、スパイ映画の世界のよう。21世紀のガジェットですね〜。

Prince Edward島の一部です。

http://local.google.com/maps?ll=46.234224,-63.145262&spn=0.007886,0.006995&t=k&hl=en

ちょっと動かすと、湾が凍っているのが見えます。こんなおもしろいものをネットで無料でぱっと見れるようにしてしまうっていうのが、Googleのすごさですね。学校で地理の勉強でこれを使えば、地理が大人気になりそう。

優れた技術と魅力的なコンテンツの融合をまさにやってのけてます。

トラックバック - http://d.hatena.ne.jp/siokoshou/20050407

2005/4/6 (水)

[][] Rss Bandit 17:24  Rss Banditを含むブックマーク  Rss Banditのブックマークコメント

C#で書かれたフリーのRSSリーダー。ソースのライセンスはBSDライセンス

RSS Bandit

河端善博さんのblogで知りました。河端さんにより日本語化されており、非常に便利です。

RSSBanditでは、フリーソフトなら無料で使えるコントロールがいろいろ使われています。見本として眺めてみるのもおもしろいです。

そのせいで、起動時間が恐ろしく長いんですが…。メモリ食い+起動時間が長いってのは、今のところ.NETの宿命っぽいですね。どうにかならないかなぁ。

id:siokoshou:20050128でちらっと紹介した、Divelements社のSandBarとSandDocが特に目立ちます。メニューとツールバー、それにタブによるdockable windowsです。商用ソフトでは有料ですが、フリーソフトなら無料で使えます。

divil.co.uk

タブの色は、RssBanditでOneNote風にきれいに色を配色するように工夫してあるようです。なかなかうまいです、この色使い。このソフト全体の見た目を引き立たせていますね。

ほかにも、フォーカスがなくてもホイールが効くようにしてあったり、参考になる部分がいろいろあります。また時間があったら、これを見ていろいろ勉強しようっと。

[] 色の基礎知識 17:45  色の基礎知識を含むブックマーク  色の基礎知識のブックマークコメント

上のエントリを書いててふと思い出したので。

HTMLでもWinアプリでも、色使いをちょっと工夫するだけで、見た目の印象ってかなり変わります。デザイナさんを雇えないからって手抜きで済ますときにも、ちょっとした部分の色を指定するだけでも、なかなか引き締まるものです。

でも、色のセンスなんてないっていう開発者が多いのも事実でしょうw

プロを目指すわけでもなければ、ちょっとした配色の基礎知識があれば、それで十分です。ほんの少し知っているだけで、だいぶ違います。

というわけで、お勧めのページをご紹介。

色の基礎知識

ほかにもAllAboutでカラーコーディネートのところを見ると、たくさんの役立ちそうなサイトが載っています。

[カラーコーディネート] All About|パーソナルカラーやトレンド色を紹介

コントロールの形を変えたりするのは、今でも割りと手間ですが、色の指定ならプロパティですぐです。一工夫してみることをお勧めします。

トラックバック - http://d.hatena.ne.jp/siokoshou/20050406

2005/4/5 (火)

[][] 検索結果をRSSでウォッチ 06:23  検索結果をRSSでウォッチを含むブックマーク  検索結果をRSSでウォッチのブックマークコメント

結城浩さんの1/26の日記で検索結果をRSSで受け取って、それをRSSリーダー(アグリゲーター)で監視するお話が出ていた。

http://www.hyuki.com/diary/20050126064005

MSNから検索結果をRSSで受け取るには、

http://search.msn.com:80/results.aspx?q=Windows+Forms&format=rss&FORM=R0RE

のように書けばいいようです。これは「Windows Forms」の単語を検索してます。

「q=」の後に検索語を入れて、RSSリーダーに登録してしまえばOK。

msn.co.jpでは、まだRSSで返してくれないようです。

[] Visual Studio Hacks のサイトができた 07:10  Visual Studio Hacks のサイトができたを含むブックマーク  Visual Studio Hacks のサイトができたのブックマークコメント

オライリー本のVisual Studio Hacksのサイトができたそうです。

http://www.visualstudiohacks.com/

今後2〜3週間でいろいろ追加していくとのこと。これは便利かも。

aspxaspx 2005/04/08 16:36 ライブドアの未来検索も同様のことができます。
http://sf.livedoor.com/search?os=rss&q=ASP.NET&sf=update_date&start=0
こんなかんじかな

siokoshousiokoshou 2005/04/08 23:04 あ、できました!便利便利!ありがとうございます〜。

トラックバック - http://d.hatena.ne.jp/siokoshou/20050405

2005/4/3 (日)

[] CodeZine 00:53  CodeZineを含むブックマーク  CodeZineのブックマークコメント

どぼんさんのメルマガ、.NETプログラミング研究で紹介されて知りました。

日本にも CodeProject みたいなサイトが生まれないかなぁと思っていたんですが、生まれました!

CodeZine

http://codezine.jp/

一般読者からの投稿も受け付けるそうで、これは期待大です。

tsutomu3tsutomu3 2005/04/03 16:14 三角形判定の記事を投稿してみました

siokoshousiokoshou 2005/04/03 17:25 おぉぉ!すばらしいです!公開前にチェックがあるんですかね。公開されるのを楽しみに待ってます。

tsutomu3tsutomu3 2005/04/04 13:14 一般投稿第1号だそうです。 siokoshouさんもどうです?

siokoshousiokoshou 2005/04/04 13:41 一番乗りおめでとうございます!
自分に何か書ける記事があるかなぁ。何か考えてみます〜。

トラックバック - http://d.hatena.ne.jp/siokoshou/20050403

2005/4/2 (土)

[][] 続 Bitmap( Stream stream )コンストラクタ 11:38  続 Bitmap( Stream stream )コンストラクタを含むブックマーク  続 Bitmap( Stream stream )コンストラクタのブックマークコメント

昨日の記事を訂正します。

using でリソースの Stream を開放しても「通常は」きちんと動きます。コンストラクタで Images.Add をやっても問題なしです。

問題を再現させる小さなサンプルを作ってみたんですが、全然再現しなくて、数時間格闘してしまいました。で、結局何がGDI+の例外の引き金になっていたかというと、リソースのBMPファイルでした。使ったBMPファイルが、実はICOファイルの拡張子だけBMPにしたものを使っていたんですが、それが原因のようです。なんともトホホな原因でした。なんでICOをBMPにしたんだ〜!>自分

きちんとしたBMPファイルを使うと、問題の起きたアプリでも using を使って問題なく動きました。

Stream をすぐに開放しなければ、絵が見えていたのでBMPファイルをすぐに疑わなかったのが悔やまれます(-_-)

でも、原因は分かったものの、デバッガで止める箇所によって ImageList に Image が追加されたりされなかったりしたのが、おもしろいですねぇ。フレームワークかGDI+によって、何らかの救済が動いてたってことなのかなぁ。

これも追求して調べてみたいけど、どこをどう調べればいいものなんだろう…。

id:tsutomu3 さん、コメントありがとうございました!つっこまれなければ、間違ったまま覚えてしまうところでした。

[] MSDNライブラリの七不思議 16:21  MSDNライブラリの七不思議を含むブックマーク  MSDNライブラリの七不思議のブックマークコメント

その1.

MSDNライブラリの.NET Frameworkクラスライブラリのリファレンスには、まったくと言っていいほど絵が載っていない。SystemIcons の説明も文章だけという徹底ぶり。

トップページのロゴマークが唯一かも。

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/netstart/html/sdkstart.asp


(全部を探してみたわけでもないんで、もしかしてあったりして)

七不思議と書いたけど、その1だけ。誰かのどこかのblogに続くことをちょっとだけ期待してみた。

[] GoogleなどでMSDNライブラリだけ検索するテクニック 16:21  GoogleなどでMSDNライブラリだけ検索するテクニックを含むブックマーク  GoogleなどでMSDNライブラリだけ検索するテクニックのブックマークコメント

上のエントリを書いてて気付いた小技。

Googleなんかで日本語のMSDNライブラリだけ検索にひっかけたい場合、検索語句に「このドキュメントについてのフィードバック」を含めるとよい。

あ、それより、「site:www.microsoft.com/japan/msdn/library/ja」のほうが確実か。

トラックバック - http://d.hatena.ne.jp/siokoshou/20050402

2005/4/1 (金)

[][] Bitmap( Stream stream )コンストラクタ 01:19  Bitmap( Stream stream )コンストラクタを含むブックマーク  Bitmap( Stream stream )コンストラクタのブックマークコメント

昨日書いた問題に続けてまた落とし穴に落ちました。

ImageList に bitmap を追加するのに、こんなコードを書きました。

1: System.Reflection.Assembly asm = System.Reflection.Assembly.GetExecutingAssembly();
2: using ( Stream stream1 = asm.GetManifestResourceStream( "Hoge.resources.cat.bmp" ) )
3: using ( Stream stream2 = asm.GetManifestResourceStream( "Hoge.resources.dog.bmp" ) )
4: {
5:   imageList1.Images.Add( new Bitmap( stream1 ) );
6:   imageList1.Images.Add( new Bitmap( stream2 ) );
7: }

これを実行すると、

'System.Runtime.InteropServices.ExternalException' のハンドルされていない例外が system.windows.forms.dll で発生しました。
追加情報 : GDI+ で一般的なエラーが発生しました。

と言われる。一般的なエラーなんて曖昧なことを言われても困ってしまう。

デバッガで、5行目で止めて imageList1 を見ながらステップ実行してみると、今度は例外が発生せずビットマップも表示できてしまった。あ〜、こういうの嫌だ。

次に5行目のブレークを外して、7行目でブレークすると、今度は imageList1 に Images が追加されてない。stream を開放しているのが悪そうなので、Bitmapのヘルプを読んでみました。

すると、解説に「Bitmap オブジェクトの有効期間の間は、このストリームを開いておく必要があります。」とのこと。ありゃ。そうだったのか。

Stream を開放しないように修正するとすんなり動きました。

System.Reflection.Assembly asm = System.Reflection.Assembly.GetExecutingAssembly();
imageList1.Images.Add( new Bitmap( asm.GetManifestResourceStream( "Hoge.resources.cat.bmp" ) ) );
imageList1.Images.Add( new Bitmap( asm.GetManifestResourceStream( "Hoge.resources.dog.bmp" ) ) );

道のりは遠く険しい…。4/1ですが、いつも通り。

(4/2 追記)問題は実は別のところでした。詳しくは http://d.hatena.ne.jp/siokoshou/20050402/1112409533

[] やっぱり4/1を楽しんでおこう 07:16  やっぱり4/1を楽しんでおこうを含むブックマーク  やっぱり4/1を楽しんでおこうのブックマークコメント

新gTLD「.orz」開始

http://internet.watch.impress.co.jp/static/uocchi/2005/04/01/orz.htm

メルマ (すごい!作った人にビールでもおごりたい)

http://www.melma.com/

tsutomu3tsutomu3 2005/04/01 11:01 VS.NET 2003で、同じように、using使ってもエラーになりませんでした。何が違うんですかね?
private void Form1_Load(object sender, System.EventArgs e)
{
    Assembly asm = GetType().Assembly;
    for (int i=0;i<2;++i)
    {
        using (Stream st = asm.GetManifestResourceStream(
            ”WindowsApplication1.Bitmap”+(i+1)+”.bmp”))
        {
            imageList1.Images.Add(new Bitmap(st));
        }
    }
    button1.ImageIndex = 0;
    button2.ImageIndex = 1;
}

siokoshousiokoshou 2005/04/01 13:05 あれ?2003で起きた現象でした。ムムム。てっきりBitmapがリソースの遅延読み込みでもしているんだと思ってしまってました。気になるのでもう少し調べてみます!追試ありがとうございます。

siokoshousiokoshou 2005/04/01 14:56 あ〜!コンストラクタでImageListにImages.Addしてたんですが、ImageListのハンドルがまだない!
もしかして、Loadイベントで読み込むのが正しい使い方なのでしょうか…。もうちょっと調べます。

2005 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 06 | 09 | 11 | 12 |
2007 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 08 | 09 | 10 | 12 |
2009 | 01 | 03 | 04 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 07 |
2011 | 04 | 07 | 10 |
2012 | 04 | 12 |
2013 | 08 |
2014 | 03 | 08 |
2017 | 09 |