2010年6月30日水曜日

[.NET]結果的にネットワークドライブから.NETアプリを起動していた

先日、マシンの変更がありました。そのマシンにはDドライブがありませんでした。
でDドライブ想定で環境設定されたシステムの開発を実施してたため、適当なディレクトリに対してネットワークドライブを設定してその場をしのいでいました。

そしてコンパイルしていざ実行してみるとセキュリティーがらみのエラーが。。。
ローカルのドライブでもネットワークドライブはネットワークドライブなので、セキュリティーの制約に引っかかることがわかりました。コマンドのsubstでドライブを設定すればよかったんだろうか?

デバッグはできていたので不思議に感じていたのですが、デバッグの際はCドライブからのパスで動作していることに気づきました。あぁがっかり。

2010年6月28日月曜日

[SQL]16進数でデータを表現する

先日、とあるシステムのテストをしました。DBはSQLServeを使っています。
そのシステムで採用されている開発言語では、varcharフィールドにSQLでデータを登録・更新する際、正しいレングスを設定しないと問題が発生します。

結果的に言うと、短めに設定された場合文字列が切れてしまい、長めに設定すると文字列の後ろに0x00が設定されるというものでした。
それを知らずに、後者のような障害があったとき、最初varcharなのに後ろにスペースがつくなんて。。。
と思って16進数で表示してみると0x00であることがわかりました。コードはこんな感じ。

declare @hoge varchar(10)  
set @hoge = '123abc'

print convert(varbinary, @hoge)

2010年6月22日火曜日

[他]100,000アクセス

このblogを書き始めて2年半が過ぎました。
アクセスカウンタを置いたのが、2008/4。それから2年3ヶ月。今日で10万件のユニークユーザの訪問になりました。

ほとんどが検索エンジンからのアクセスだと思いますが、少しは社会のお役に立てたかのかなぁと思います。
これからも、社会に何かしら還元できますよう、がんばりたいと思います。

2010年6月20日日曜日

[.NET]C#の文字列に@をつける

C#で、文字列定数に@をつけることにより\(円マーク)などのエスケープをエスケープ?することができます。
まぁその程度だと思っていたんですが、なんと、改行コードなどもそのまま取り込めるというのを最近知りました。コレを「逐語的リテラル文字列」というらしいです。詳しくは2.4.4.5 リテラル文字列を参照。

2010年6月17日木曜日

[他]SQLServerでテーブル単位のディスク使用量を得る

無茶な見積もりを要求されることは多々あります。先日前の席に座っている人が「テーブル単位でどれくらいのディスク容量を使っているか教えてくれ!」って偉そうな人に言われていました。
周りの人は目を合わせないようにしていました。えぇまぁ私もその一人です。「そんなの無理無理」って思っていたんですが、SQLServerでは、sp_spaceusedっていう関数が用意されており、なんとテーブル単位でデータの使用量、インデックスの使用量がわかるみたいなんです。

見積もりを依頼された場合、それだけデータを突っ込んで実測したほうが、見積もりするより楽かもしれませんね。

2010年6月12日土曜日

[他]プロセス起動したあと、しばらくすると処理がとまってしまう?

先日、隣の人が、VBSでプロセスを起動していました。
開発は順調に進み、単体テスト、結合テストと順調に進みました。で、性能試験を実施していると、アプリケーションから応答が無くなってしま現象が発生していました。

で、話を聞いてみると一定の件数になるととまってしまう。というものでした。そしてCPUに負荷がかかっていない。
過去に同じような経験が。。。で、よくよく調べてみると、そのプロセスは標準出力に結果を出していることがわかりました。とりえず、標準出力を読み捨ててみては?とアドバイスすると、ビンゴでした。

起動したプロセスは、標準出力をクリアしないと、バッファの出力待ちをしてしまいます。結果アプリケーションがハングしているように見えるという悲しい現象があるんです。ということを思い出しました。

2010年6月7日月曜日

[他]SQLServerでキャッシュをクリアする

SQLの性能評価をしていると、1発目は遅いけど、2度3度と実行していると結果がキャッシュに乗ってしまい、実測するのにSQLServerを再起動。みたいな事をやっていました。
厳密になら、OS再起動なのかも知れませんが、キャッシュにあるかどうかが問題の場合、以下のT-SQLでキャッシュをクリアすることができます。

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE


DBCC (Transact-SQL)の「メンテナンス ステートメント 」に説明がありますねぇ。
ほかにも魅力的なステートメントが。。。今度しらべてみよーっと。

2010年6月4日金曜日

[.NET]想定外の例外の集約処理

想定できる例外(たとえば、型変換の例外/SQL発行時の例外)に関しては、できるだけ狭いスコープで例外処理をすると思いますが、メモリ不足など、想定外のエラーが発生した場合、個別で例外処理というわけには行きません。そういうときに、例外を集約処理します。で、WindowsFormの場合、Application_ThreadExceptionを使います。コードはこんな感じ。

private void Form1_Load(object sender, EventArgs e)
{
    Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
}

void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
    System.Diagnostics.Debug.WriteLine(e.Exception.Message);
}

2010年6月1日火曜日

[他]VS2010のインテリセンスが英語に!!

先日、VB6コンバータを使いたいため、VB.NET2008を入れなおしました。
で、まぁそれはそれで、事なきを得ました。

で、今日、ツールの修正をしようと思ってC#2010ExpressEditionで開発を始めると、インテリセンスが英語になってるじゃないですか。こんな現象が2008でもありましねぇそういえば。
とりあえず、C#2010ExpressEditionをインストールしなおすと、インテリセンスは日本語に戻りました。

2008のように、SP待ちにならずで、よかった。