[C#] Windowsのシャットダウンや再起動を行う

システム関係のWindows APIを呼ぶ方法もあるが、shutdown.exeを使うと楽。shutdown.exeはWindows XP以降に含まれているらしい。

Shutdown
http://technet.microsoft.com/en-us/library/bb491003.aspx

[C#] オブジェクトを比較する

基本的にC#ではポインタは使えない。unsafeコードとして記述すればポインタも使えるが、バグを生む危険性が高まるのでよほど必要でない限りはポインタは使わないほうが望ましい。しかしC++の癖で、2つのインスタンスが同じかどうかの判断を if (a == b) と書いてハマったので、オブジェクトの等価比較について整理しておきたい。

値が同じかどうか判断する

たとえば整数ならば if (a == b) で比較できる。しかし、あるクラスのインスタンスなど、複雑なオブジェクトを比較するとなると簡単にいかない。その場合には Object.Equals(Object) メソッドを実装してやればよい。

参照先が同じかどうか判断する

これはC/C++で言うところのポインタ比較に相当する。すなわち、2つのポインタが同じオブジェクトを指しているかどうかを比較するわけだ。その場合には System.Object.ReferenceEquals(objA, objB) メソッドを利用する。

参考サイト

等価比較 (C# プログラミング ガイド)
http://msdn.microsoft.com/ja-jp/library/vstudio/dd183752.aspx

Object.Equals メソッド (System)
http://msdn.microsoft.com/ja-jp/library/system.object.equals.aspx

Object.ReferenceEquals メソッド (System)
http://msdn.microsoft.com/ja-jp/library/system.object.referenceequals.aspx

[C#] 多次元配列を確保する

多次元配列の確保する方法。

配列の確保

配列の初期化

多次元配列 (C# プログラミング ガイド)
http://msdn.microsoft.com/ja-jp/library/2yd9wwz4.aspx

[C#] 配列を初期化する

C#だと配列よりもListやDirectoryなどのコレクションクラスを使うことが圧倒的に多いけど、それでもいまだ配列を使いたいシチュエーションは少なからずある。

というわけで、配列を初期化する方法を覚え書き。

コード : 配列の初期化 (Visual C#)
http://msdn.microsoft.com/ja-jp/library/aa287601(v=vs.71).aspx

[C#] 時間が掛かる処理で進行状況を表示する

時間が掛かる処理では進行況を表示して、かつ、処理を中断できるようにしたほうがいい。

以下、進行状況ダイアログを表示するサンプル。これをたたき台にして、ダイアログに進行状況を示すメッセージやプログレスバーなどを追加しよう。

progress_dialog

[C#] 連想配列を使う (Dictionaryクラス)

連想配列を使って英文中の単語の出現回数をカウントするサンプル。

参考サイト

Dictionary(TKey, TValue) クラス (System.Collections.Generic)
http://msdn.microsoft.com/ja-jp/library/xfhwa508(v=vs.110).aspx

[C#] 文字列を区切り文字で分割する

テキストファイルから英文を読み込んで単語に分割するサンプル。

参考サイト

方法 : 文字列を分割する (C# プログラミング ガイド)
http://msdn.microsoft.com/ja-jp/library/ms228388.aspx

[C#] 文字列を数値に変換する

フォームに配置したテキストボックスに入力された文字列を数値に変換するような場合を想定。

以下に2つの方法を示す。何れの場合も変換できなければ例外が投げられるので、例外をキャッチしたらメッセージを表示してユーザに再入力を促せば良い。

<型>.Parse()メソッドを使う

Int16.Parse メソッド (System)
http://msdn.microsoft.com/ja-jp/library/system.int16.parse(v=vs.110).aspx

Decimal.Parse メソッド (System)
http://msdn.microsoft.com/ja-jp/library/system.decimal.parse(v=vs.110).aspx

Single.Parse メソッド (System)
http://msdn.microsoft.com/ja-jp/library/system.single.parse(v=vs.110).aspx

System.Convertクラスを使う

Convert クラス (System)
http://msdn.microsoft.com/ja-jp/library/system.convert(v=vs.110).aspx

[C#] 画像を矩形で切り取る (Bitmap.Clone)

以前にも同じ処理について書いたけど、MSDNを眺めていたら別の方法を見つけたので試してみる。

Bitmap.Clone メソッド (Rectangle, PixelFormat) (System.Drawing)
http://msdn.microsoft.com/ja-jp/library/ms141944(v=vs.110).aspx

コードはたった2行。ちなみに以前に書いたGraphicsオブジェクトを使う処理だと

コードは6行になる。単純計算でコーディング量は3倍。まあ、2行でも6行でも大した量じゃないけど。

処理速度の比較 – Bitmap.Cloneメソッド vs Graphicsオブジェクト

パフォーマンスが同じならコーディング量は少ないほうがいい。処理速度を検証しよう。

特定ディレクトリ中の70個のJPEGファイルをスキャンして、1つずつ読み込んで固定サイズに切り取り、別フォルダに保存し直すだけのプログラムを書いた。それぞれの方法で10回ずつ処理して所要時間を計測してみる。

テスト結果 (処理時間)

結果はBitmap.Cloneを使った切り取り処理のほうが倍近く遅かった。

Bitmap.Cloneメソッドは簡単だけど処理は遅いという結論。

[C#] あちこちでいろんな使われ方をしているので、自分なりにJPEGやEXIFの用語定義を再確認してみた

C#のプログラミングとは直接関係無い話だけど、EXIFデータを使った画像処理の必要がありネットでいろいろ調べてみたところ、記事によってJPEGだのEXIFだの用語の使い方がいい加減なので、自分なりに整理してみた。

JPEGは圧縮方式、あるいはファイル形式のこと

もともとJPEGは「Joint Photographic Experts Group]という団体の略称。その団体が立案したデジタル画像の圧縮方式が、団体の略称をそのまま使ってJPEGと呼ばれている。JPEG方式で圧縮したデジタル画像を格納するファイル形式の規格は存在しなかったので、C-Cube Microsystems社が「JPEG File Interchange Format (JFIF)」というファイル形式を立案した。そのファイルが広く使われるようになってJPEGファイル形式と呼ばれるようになった。というわけで、一口にJPEGと言っても、デジタル画像の圧縮形式を指す場合と、デジタル画像のファイル形式を指す場合があるわけだ。JPEG圧縮されたデジタル画像は必ずJPEGファイル形式で保存されるとは限らない。TIFFファイル形式に保存されることだって普通にある。

JPEG – Wikipedia
http://ja.wikipedia.org/wiki/JPEG

JPEG homepage
http://www.jpeg.org/jpeg/

EXIFは画像ファイル形式の「規格」である

EXIFは「Exchangeable image file format」の略称。参考サイトの説明には、「デジタルカメラで撮影した画像データに、撮影条件に関する情報(メタデータ)を追加して保存できる、画像ファイル形式の規格のことである」とある。解りにくい表現だな。僕は「メタデータの仕様とそれを画像データにどのように付加して保存するかのルールを定めているのがEXIF」と認識している。ネットの記事などで「EXIFはファイル形式」という説明を良く見かけるけど、ファイルの物理構造を定義するものをファイル形式と呼ぶならば、それは正しいとは言いがたい。EXIFデータ付きの画像データは「JPEGファイル形式(圧縮の場合)」または「TIFFファイル形式(非圧縮の場合)」に保存されるから。

Exifとは (Exchangeable image file format) エグジフ: – IT用語辞典バイナリ
http://www.sophia-it.com/content/Exif

Exchangeable image file format – Wikipedia
http://ja.wikipedia.org/wiki/Exchangeable_image_file_format

JPEGファイル構造の基礎知識

以下のサイトの説明がわかりやすい。

JpegAnalyzer Plusオンラインヘルプ
http://hp.vector.co.jp/authors/VA032610/

JPEGファイルの構造
http://hp.vector.co.jp/authors/VA032610/JPEGFormat/StructureOfJPEG.htm

Exifについて
http://hp.vector.co.jp/authors/VA032610/JPEGFormat/AboutExif.htm

JPEGファイルには、セグメントと呼ばれるブロック分けされたデータ群とJPEG方式で圧縮された画像データが格納されている。セグメント先頭に「マーカー」と呼ばれる識別子があって、マーカー「APP1」がEXIFデータのセグメントを指す。アプリは自分が理解できないセグメントを読み飛ばすことにより、カメラやソフトのメーカーが独自定義した未知のセグメントが含まれていようと、アプリ間での画像データの受け渡しが可能となる。