0

VS2008で単体テスト

VisualStudio2008 professionalからIDE標準で単体テスト機能(ブラックボックステスト)が付いているので使ってみた。
俺は今まで単体テストはRSpecぐらいしかやったことがなかったし、何かライブラリを作った時はそれを使うGUI付きサンプルアプリケーションを作ることでしか動作確認してこなかったけど、これは次回からどんどん使っていく事にした。

この種のテストをブラックボックステストと呼ぶらしい。テスト対象のクラスの関数1つずつをブラックボックスと見るテストで、入出力の値に注目する。ある値を関数に入れてみて、予想した値が返ってくるかチェックすることで、関数が仕様を満たしているかチェックする。

今回はBenchmarkCounter.NETの中の処理時間を計るためのOrg.Shokai.Util.Benchmark.Counterクラスのテストを作った。Startメソッドで計測開始し、Stopメソッドで停止、その間の処理時間をミリ秒で保存できる。Start/Stopを複数回行った場合、その間の平均処理時間も求める事が出来る。

テストでは、出力値が正しい値になっているかどうかチェックする。このBenchmarkCounterのテストでは

  • 処理時間を取得するメソッドの場合
    → 時間の値が0以上でなければエラー
  • 計測回数を取得するメソッドの場合
    → 何回か計測してみて、計測回数が合わなければエラー
  • 計測中かどうか?フラグの場合
    → Startメソッドにfalseだったらエラー
    → Stopメソッド後にtrueだったらエラー
という感じ。

Read more

4

C# – FeliCaリーダでIDを読む

felicalibとC#用ラッパーを使ってFelicaのIDを読んだ。
参考:felicalib C#での利用方法

Reading felica ID
MNPして使わなくなった(財布機能1回も使ってない)auのお財布ケータイW51Sを乗せたところ。

普段使ってるSuicaを読むと違うIDが出てきた。


■作ったもの
080811_Felica.zip (VisualStudio2008 / C#3.0)
.NET Framework3.5が必要


■準備
RC-S320を使った。付属のCDからドライバだけインストールしておく。

SONY RC-S320 非接触ICカードリーダ/ライタ PaSoRi 「パソリ」
ソニー
売り上げランキング: 99
おすすめ度の平均: 4.5
4 あれば便利かもしれないが、無くても困らない製品
5 便利アイテムです
5 便利です。
5 飛行機に乗れなくてもマイルが貯まる
4 edyを常用してる人ならお勧め


felicalibをダウンロードしてくる。中にC#用ラッパー(FelicaLib.cs)も入っているので自分のプロジェクトに追加。
felicalib.dllは「参照の追加」から使うのではなく、bin/Debug, bin/Releaseなどにファイルを直接コピペして置く。実行時にFelicaLib.csからP/Invokeで読み込まれる。

■コード
ラッパーを読み込んで

using FelicaLib;


IDmを読むとbyte配列が来るので、Stringに直す。

try
{
  using (Felica felica = new Felica())
  {
    felica.Polling(0xFFFF);
    byte[] data = felica.IDm();
    String id = "";
    for (int i = 0; i < data.Length; i++)
    {
      id += data[i].ToString("X2");
    }
    Console.WriteLine(id); // ID出力
  }
}
catch (Exception ex)
{
  Console.Error.WriteLine(ex.Message);
}

0

C#3.0 – DirectShow.NET2.0でwebcam撮影、JPEG保存する

Windowsでカメラからの画像入力を使うには、Flash(Air)Processing、Max/MSPを除くとDirectXかVideo for Windowsを使わなければならないんだけど、これらをC#から直接使うのはとてもめんどい。

で、DirectX自体はラッパーを介して使えるので問題ないんだけど、DirectShow(カメラの入力に使う)だけはなぜかC#用のラッパーが無いのでDirectShow.NETの出番になる。このライブラリはs.h.log DirectShow.NETで静止画キャプチャでも使ったんだけど、去年ぐらいからDirectShow.NETがver 2.0になってさらに良くなっていた。

ちょっといじってみたが、C++が苦手な馬鹿には便利すぎて感動したので、

webcam撮影→JPEG画像に保存のサンプルを作って置いておきます

■作ったもの

Download (VisualStudio 2008 + C#3.0)

昨日の朝にDirectShow.NET2.0でwebcamキャプチャ、JPEG保存 – 橋本詳解で書いたのとほぼ同じだが、デバイスの選択ができるようになった。

select capture devices

あと、DirectShow.NETを使えば、インストールすると1GBぐらいになるDirectX SDKを入れなくても済むのも嬉しい。

■プログラムの準備

まず準備としてDirectShow.NETのサイトからDirectShowLib-2005.dll本体と、サンプルを手に入れる。

DirectShowLib-2005.dllにパスを通し、sampleに入っているCapture.csもpublic domainなのでコピーしてありがたく使わせていただく。

そして、いくつか使うnamespaceを通す

usingDirectShowLib;

usingSnapShot;

usingSystem.Runtime.InteropServices;

usingSystem.Drawing.Imaging;

■カメラデバイスを取得してプレビュー表示する

なんでもいいが、System.Windows.Forms.Controlを継承しているPanelやPictureBoxやFormなどを、カメラのプレビュー用に用意しなければならない。プレビューを画面に出したくなければVisible = falseしておけばいい。

そのコントロールをCaptureクラスのコンストラクタに渡してやると、cameraのプレビュー表示がリアルタイムに表示されるようになる。

PanelpanelPreview=newPanel();

this.Controls.Add(panelPreview);

Capturecam=newCapture(0,640,480,24,panelPreview);//device,x,y,24FPS,preview


Capture()の第一引数は画像入力デバイスのindexで、0からはじまる。存在しないデバイスindexを選んでしまうとエラーになるので注意。FPSやカメラのXYサイズも指定できる。

■現在のカメラ表示を保存する

別のコントロールを用意して、そっちに保存する。今回のサンプルアプリの場合は、左の動画が右に静止画としてキャプチャされる。

PictureBoxにキャプチャするなら

PictureBoxpicBox=newPictureBox();

this.Controls.Add(picBox);

IntPtrm_ip=cam.Click();

Bitmapb=newBitmap(cam.Width,cam.Height,cam.Stride,PixelFormat.Format24bppRgb,m_ip);

b.RotateFlip(RotateFlipType.RotateNoneFlipY);//上下反転しているので直す

picBox.Image=b;

Image型で静止画をコピーできたので、JpegファイルやPNGファイルなどに書き出すのも簡単。

picBox.Image.Save("captured.jpg",ImageFormat.Jpeg);

もちろんPictureBoxを経由しないで、直接保存もできる

b.Image.Save("captured.jpg",ImageFormat.Png);

カメラを閉じるのを忘れずに。

FormのFormClosedイベント内などでDispose()を呼べば良い

cam.Dispose();

ちなみに、現在接続してあるデバイスの一覧はDsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice)の中に入っている。

今回のサンプルでコンボボックスの中にデバイス名一覧を突っ込んだのはこんな感じでやった

comboBoxDevices.Items.Clear();

foreach(DsDevicedsinDsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice))

{

comboBoxDevices.Items.Add(ds.Name);

}

comboBoxDevices.SelectedIndex=0;

ComboBox.SelectedIndexで現在選ばれたデバイス名のindexがわかって、それをCaptureのコンストラクタのデバイスindexとして使えば良い。

0

C# – Flickr.NETでFlickrアップローダ

前の記事に続き、Flickr.NETを使う。

今度はFlickr Uploaderを作ってみた。Flickr.NETには

・Flickr APIへの認証(read/write/delete権限の取得)

・ファイル名を指定してアップロード

などの機能が揃っているのでさくっと作れた。

できたもの => Archive

ドラッグアンドドロップした写真1枚をアップロードする

uploader

tagやtitleなどが適当に付いている

using Flickr.NET

■oAuthでの認証のためのtoken発行

今回はAPI keyに加えて、secretも使ってfrobを作ってtokenの発行を行わないといけない。

まずkeyとsecretを取りに行く→Flickr Services

その辺の仕組みは1つ前の記事と、

Flickr API の認証 – まちゅダイアリー (2005-11-01)

s.h.log: Flickr::Uploadで写真をアップロード

を参考に。

■プログラムを書く

まずfrobを作る。あとで使うのでとっておく(2回作ると違う値ができてしまうので)

Flickr flickr = new Flickr();

flickr.ApiKey = “your-api-key”;

flickr.ApiSecret = “your-api-secret”;

String flickr_frob = flickr.AuthGetFrob(); // frobの作成

で、認証画面をwebブラウザで開いて「OK」ボタンを押してもらう

System.Diagnostics.Process.Start(flickr.AuthCalcUrl(flickr_frob, AuthLevel.Write)); // 認証画面をブラウザで開く

OK押してもらってから、さっき作ったfrobを使ってtokenを取りに行く。

try{

Auth auth = flickr.AuthGetToken(flickr_frob);

flickr.AuthToken = auth.Token; // token取得

}

catch (FlickrApiException ex)

{

Console.WriteLine(ex.Message);

}

無事tokenを取って、Flickrオブジェクトにセットできたら、ファイル名を指定すればアップロードできる。tagやtitleやdescriptionを適当に付けてみた。

Photo p = new Photo();

p.PhotoId = flickr.UploadPicture(“PhotoFileName”, “test photo”, “これはてすとです”, “test,uploadertest”);

p.UserId = auth.User.UserId;

System.Diagnostics.Process.Start(p.WebUrl);

uploadされた写真のphotoIdが返ってくるので、それを使ってWeb上でのURLを求めることも出来る。今回はまたブラウザで開いてみた。

UploadPictureメソッドはどうやら内部でThread.Sleep()を呼んでいるみたいなので、そのままThreadで実行すればマルチスレッド化できる。

uploadを途中で止めるメソッドが無いみたいだけど、途中で止めたい時はスレッドで実行してAbort()してしまえば止まった。

詳しくは今回作ったアプリのソース参照

Read more

0

C# – Flickr.NETでtag検索

Flickr.NETという.NET Framework用のライブラリを使って、Flickr APIからタグ検索してみた。2年ぐらい前に使った時より、dllのファイルサイズが1.5倍に増えててた。

できたもの => Archive

using Flickr.NET

■dllを手に入れる

FlickrNet API Library – Home

[Release]から2.1.5をダウンロードしてきた。

んで、[参照の追加]でリンクして、

using FlickrNet;

する。

■API keyを手に入れる

Flickr ServicesからAPI keyを手に入れないといけない。メールアドレスを登録してすぐ発行してもらえる。

今回は「デスクトップアプリ用」を選択。

(検索だけなら、secretとtokenを使ってoAuthで認証する必要は無い)

■プログラムを書く

Flickr APIのラッパーなので、基本的な仕様はFlickr APIの方を見た方が良い。

今回はflickr.photos.searchを叩いてみた。

まずFlickrというクラスが全ての根になっている

using FlickrNet;

Flickr flickr = new Flickr(“your-api-key”);

flickr.photos.searchでは色々なパラメータを渡すが、Flickr.NETではPhotoSearchOptionsクラスで集約されている。今回はタグだけでeveryoneから検索するのでこれだけだけど、もっと色々パラメータが指定できる。

PhotoSearchOptions opt = new PhotoSearchOptions();

opt.Tags = “food, sfc”;

opt.TagMode = TagMode.AllTags;

Photos photos = flickr.PhotosSearch(opt); // 検索

Photosクラスで返ってきた結果からURLを取り出して、表示する。

PictureBox.Imageにストリームから読み込ませるための関数 DownloadPicture(“URL”) を利用してダウンロードする。

Photo p = photos.PhotoCollection[0]; // 1枚目

pictureBox.Image = Image.FromStream(flickr.DownloadPicture(p.MediumUrl));

textBoxPhotoUri.Text = p.WebUrl;

Read more