MSTest.exe で Unmanaged x64 DLL をテストする

“How to: Run a Unit Test as a 64-bit Process” http://msdn.microsoft.com/en-us/library/ee782531.aspx

変更する箇所は「テスト設定の編集」である。テストプロジェクトのプロパティにおける プラットフォーム ターゲット は “Any CPU” のままでよい。ここを x64 にしても無駄だった。

(調査の途中 http://blogs.msdn.com/b/danielvl/archive/2009/03/28/run-mstest-exe-as-native-64-bit-process.aspx CorFlags.exe で MSTest.exe を書き換えてしまう強引な手法にクラクラしたけど、VS2010で改善していたようだ)

Windows Azure で OpenCvSharp を使う準備

Windows Azure は 64bit 環境なので、多分 x86 な C++ DLL は動かないであろう、と x64 な OpenCV + OpenCvSharp 環境を作成した。
(4/26 現在Windows Azure にもっていっての動作確認はしていません)

OpenCV x64 用バイナリをビルド

http://d.hatena.ne.jp/kokemono/20110419/1303227717 を参考にした。

  1. cmake をインストール
  2. cmake-gui を利用し Visual Studio 2010 向けに Configure 。ビルドフォルダとしては C:/OpenCV2.3 を指定。
  3. cmake-gui 上でインストールオプションのうち、CMAKE_CXX_FLAGS_RELEASE , CMAKE_C_FLAGS_RELEASE に含まれる /MD を /MT に変更する。(下にある画像を参照)を確認するが、今回は変更しない。(WITH_TBB を使うと速くなるらしいが、まずは最適化より動くこと優先)
  4. cmake-gui を利用し Generate
  5. ビルドフォルダ C:/OpenCV2.3 に、以下のバッチファイル buildx64.cmd を作成し、このバッチファイルを実行
    msbuild /t:Build /p :P latform="x64" /p:Configuration=Release /v:diag OpenCV.sln msbuild /t:Build /p :P latform="x64" /p:Configuration=Release /v:diag INSTALL.vcxproj msbuild /t:CLEAN /p :P latform="x64" /p:Configuration=Release /v:diag OpenCV.sln

ここで、標準のまま上記を実施した場合インストール先は、 C:/OpenCV2.3/install である。

C#プロジェクトに組み込む

今回は、参照するDLLを最小にしたいという目標の下、以下のようにした。

  1. http://code.google.com/p/opencvsharp/ より OpenCvSharp-2.3.1-x64-20120218.zip をダウンロード。適当な場所に展開する。
  2. プロジェクトへの参照として  OpenCvSharp.dll を追加する。
  3. C:/OpenCV2.3/install/bin にある opencv_core231.dll, opencv_highgui231.dll, opencv_imgproc231.dll をプロジェクトフォルダにコピーし、既存の項目として追加する。
  4. opencv_core231.dll, opencv_highgui231.dll, opencv_imgproc231.dll のプロパティで、「出力ディレクトリにコピー」を「新しい場合はコピー」にする。
  5. Cランタイムライブラリ、MFCライブラリ msvcr100.dll, msvcp100.dll, mfc100.dll, mfc100u.dll, mfcm100.dll, mfcm100u.dll を C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\redist\x64\Microsoft.VC100.* の下にあるファイルを利用して既存の項目として追加する。
  6. msvcr100.dll, msvcp100.dll, mfc100.dll, mfc100u.dll, mfcm100.dll, mfcm100u.dll のプロパティで、「出力ディレクトリにコピー」を「新しい場合はコピー」にする。

OpenCV_2.3.1_x64

その先のチュートリアルは http://d.hatena.ne.jp/Schima/20100528 を参照。

Azure 環境に VC++ 2010 Redistributable Package をインストール

パッケージのダウンロードは次のURLより行った。 http://www.microsoft.com/downloads/en/details.aspx?FamilyID=a7b7a05e-6de6-4d3a-a423-37bf0912db84

(2012/5/1 追記) Azure 環境におけるインストール方法については http://msdn.microsoft.com/ja-jp/library/windowsazure/hh694038.aspx “Add an Elevated Startup Task to your Worker or Web Role Project to Install the Native Visual C++ Libraries for Visual C++ 2010 on Worker/Web Role Instances” の章を参照して、起動時にインストールされるようにする。

この時、 Startup.cmd はBOMなしのテキスト、すなわち ShiftJIS ファイルとして作成する方がよい。BOM付きUTF-8 テキストファイルとして作成した場合には、バッチファイルの実行に失敗した。

補足

あまり考えずになるべく標準状態で、cmake の出力先を C:\OpenCV2.3 としたところ、最終的に利用するバイナリの出力先が C:\OpenCV2.3\install になった。

これは cmake のインストールオプションのうち CMAKE_INSTALL_PREFIX で指定したフォルダが相当する。最初 この仕組みを理解するのに結構戸惑った。cmake は「ビルド環境を出力するもの」なので、cmake の出力先フォルダはビルドのためのフォルダにする方がよかった。例えば C:/work/OpenCV2.3 など。その上で CMAKE_INSTALL_PREFIX を C:/OpenCV2.3 にする方が通常利用する状況での階層としては美しくなる。

このブログ記事の一番のお役立ちは、多分バッチファイルでの msbuild オプション指定でしょう。CruiseControl.NET でのOpenCV 自動ビルドへの布石です。

注意点

Web プロジェクトで直接実行して確認する場合、Visual Studio 開発サーバー だと x86 になってしまうので動作しない。Azure プロジェクト または Web プロジェクトでデバッグしたいのであれば IIS Web サーバーの使用を指定する。(VS11 の 開発サーバーは x64 化しているのかしら?)

Omni Focus For iPad

GTD の伴として利用を開始した。

「処理の時点で、結果をはっきりさせる」という作業がかなり大変。終了条件の設定はあらゆるプロジェクトの鍵だなあ、といつも思うのだけれど。

ツール特有の話題としては、プロジェクトの種類

  • 並列進行 : タスクが単に複数存在する状態
  • 順次進行 : タスクを順番に進めていく状態
  • 単独アクション : プロジェクトというほどでもない関連の薄いタスクに対するフォルダとして扱う。

単独アクションになると何が起こるかというと、「次のアクション=各プロジェクトで最初の項目」で内部のタスクが絞り込まれず、すべて表示されるようになる。通常はプロジェクトに属さない 「アクションのリマインダ」 に対して付与することになる。

この単独アクションに設定したプロジェクトを 「なんでも次のアクション」 という名称にしてみた。

Bouncy Castle C#

http://www.bouncycastle.org/csharp/ 暗号ライブラリ。元は Java 向けだったものが C# にもポーティングされている。

.NET Framework 標準の System.Security.Cryptography では機能が不足していて P/Invoke みたいな事態がままあるのですが、Bounty Castle はとても素敵。

見付けた経緯は iPhone 構成ユーティリティ を眺めていて。

iPad / iPhone に対する自動証明書発行

参考: http://pubsub.com/Blog-Post-iPad-iPhone-Certificate-Issuance_Data-Centre-avPsbaSkWIb,jGeUFOrwyIrE

iPhone / iPad における SCEP (Simple Certificate Enrollment Protocol) は、Windows Server において NDES (Network Device Enrollment Service) として実装されている。

単に NDES を有効にするだけではうまくいかず、いくつかのはまりポイントが解説してある。(もしかしたら Windows Server 2008 R2 の最新状態では解決しているかもしれない。)

しかし、まず証明書を使いたい場所は、社内にアクセスするための無線LAN認証のためであり、そのための証明書を外部から取得可能にする、のをセキュリティを保ちつつ実現するにはそれなりの体制が必要。例えば毎週変更される共通パスワードの VPN + 各個人のアカウントパスワード とか?共通パスワードは申請があったら、上司など他の人の確認の上、通知する。などのような。

そうではなく、ユルく管理された個人証明書の運用では役に立つかもしれないが、そこに Windows Server のCALが適用されるのはコスト的に見合わないので、何かオープンソースの SCEP サーバーは無いだろうか。

iPad または iPhone からドコモ公衆無線LANサービス (docomo Wi-Fi) に自動接続する

最も参考になった記事: docomoでiPhone 4S!(ドコモでiPhone 4S!) 【暫定接続方法】iOS5ではドコモ公衆無線LANサービス(docomo Wi-Fi、Mzone)のIEEE 802.1X接続ができない・・・のかも? (続報3)

自動接続を実現する手順

  • Apple より iPhone構成ユーティリティをダウンロードし、インストールする
  • iPhone構成ユーティリティを起動し、「新規構成プロファイル」(Ctrl-N) で構成プロファイルを作成
  • 作成した構成プロファイルを書きだす
  • 構成プロファイルを添付したメールを iPhone または iPad に送る
  • iPhone または iPad でメールを開き、添付された構成プロファイルをインストールする

プロファイルの作成方法

項目は上記の記事より引用です。

  • SSID:ドコモから指定されているSSID
  • 自動接続:チェック
  • 非公開ネットワーク:チェック(非公開としているアクセスポイントが一部あるため)
  • プロキシ設定:なし
  • セキュリティの種類:WEPエンタープライズ
  • 受け入れたEAPの種類:TTLS、PEAP
  • 内部認証:MSCHAPv2
  • ユーザー名: [moperaU で指定されたユーザID]-mopera@docomo
  • 接続ごとにパスワードを使用:チェックしない
  • パスワード:パスワード

設定の様子のキャプチャは以下の通り。

Wi-Fi 設定
docomoWiFi自動設定01docomoWiFi自動設定02docomoWiFi自動設定02-2

ここから先は必須ではないのですが、個人的な興味で Verisign Class 3 Public Primary Certification Authority を追加しています。(後の調査で、有効期限が 2028年8月2日 までのもの、シリアル番号 70 BA E4 1D 10 D9 29 34 B6 38 CA 7B 03 CC BA BF)が正しいことが判明しました。有効期限 2028年8月3日までのものは不要です。)
docomoWiFi自動設定03docomoWiFi自動設定05docomoWiFi自動設定06
書き出しとメール送信の様子
docomoWiFi自動設定07docomoWiFi自動設定08docomoWiFi自動設定09

mopera U における ID,パスワード取得方法

モバイルWi-Fi ルーター購入後 mopera U の基本ID、パスワードを知るには契約した回線を利用しつつ「moperaU 初期設定サイト」http://www.mopera.net/manual/pcpda/option/quickstart/pc.html にアクセス。ネットワーク暗証番号を入力する。ネットワーク暗証番号は契約時の書類に記載されている。

docomo に記述されている Windows 7 向け設定手順

Windows 7 : ネットワークの設定方法(自動ログイン機能) よりパラメータのまとめ

ネットワークID(SSID) docomo
セキュリティの種類 802.1x
非公開ネットワークへの接続 許可
暗号化の種類 WEP
認証方法 PEAP
サーバーの証明書を検証する証明機関 Class 3 Public Primary Certification Authority
認証方法 EAP-MSCHAP v2
資格情報 ユーザー名 [moperaU で指定されたユーザID]-mopera@docomo
(例: “abcd1234-mopera@docomo”)
資格情報 パスワード [moperaU で指定されたパスワード]

PEAP については次の情報が参考になる: Microsoft TechNet の PEAP の説明

実際の接続

Wi-Fiスポットにおいて実際の接続を試みてもうまく接続できない場合がある。おそらくWEPによる接続を含め複数の方式が並列になっている状況で、どれを選択するのかの優先度の設定ができないので、タイミングに依存する部分があるようだ。

以下の作業をいくつか試したところ接続できるようになった。確実な手順としては確立できていない。

  • ネットワーク設定のリセットを実行する
  • プロファイルを削除し、その直後にwifiの設定を開始する
  • 証明書選択ダイアログの画面でボタンを押しても反応しなくなることがある。この場合、設定アプリケーション内の wifi 以外の項目に移動し、もう一度 wifi 接続に戻ってくる
  • wifi をオフにし、再度オンに戻す

接続時には証明書を承認するよう求められる。詳細を見ると次のような画面であった。写真

懸念点

構成ファイルの書き出し(エクスポート)時に、プロファイルを暗号化することができる。一方上記の手順では暗号化していないため、パスワードがそのまま埋まっている。moperaU のメールは利用していないし、接続に対して時間課金でもないので、このパスワードが漏洩することは許容することとした。これが許容できない場合は、USBケーブル接続を利用し iTunes 経由で直接インポートして下さい。

構成ファイルの中身をテキストエディタで見た様子: docomoWiFi自動設定10

今後の展開

N-02C:ネットワークの設定方法(自動ログイン機能) から推察すると、 docomo Wi-Fi は EAP-TTLS/PAP にも対応している。iOS5 が EAP-TTLS/PAP に対応しないのは、プロバイダ内部で PAP により生パスワードが流れることを懸念したからであろうか?あるいは WPA2 エンタープライズの具体的な仕様に、PAP が含まれていないというような制約があるのかもしれない。要調査。

今後の展開としては iOS5 WPA2 エンタープライズ(構成ユーティリティではなく標準のGUI) におけるパスワード認証方式に docomo が対応してくれる、のが望ましい。

レンタルサーバでのウィルス感染時の緊急対応

.htaccess が利用可能なレンタルサーバにおいて、ウィルス感染が報告された場合の緊急対処方法 (今回私が間接的に対応した具体的なインシデントは さくらレンタルサーバ スタンダードプラン の話。 http://www.ipa.go.jp/security/topics/20091224.html ftpのアカウント情報を盗まれた事例であり、さくらインターネットの落ち度は全くありません。その上さくらインターネットの担当者の対応は素晴らしいです。)

前提条件

  • レンタルサーバは .htaccess 経由で mod_rewrite モジュールが利用可能
  • Facebookページをすでに作成済み、あるいはFacebookページを作成する予定がある

手順

  1. Facebookページに転送する .htaccess を設置する。.htaccess ファイルは末尾に掲載 (元ネタは さくらのレンタルサーバ非公式FAQ)
  2. Facebookページが未作成であれば作成し、上記の .htaccess ファイルを正しいURLに書き換えて改めて設置する

Facebook ページのありなしに関わらず、.htaccess の設置を先に行うのは、ウィルス感染の拡散を防ぐために、感染したファイルにアクセスできないようにする目的がある。

.htaccess ファイルの例

RewriteEngine on RewriteRule .* http://www.facebook.com/pages/新しく作ったFacebookページUrl [L,R=302]

ここでは mod_rewrite を利用しているが、mod_rewrite が利用できないような環境の場合RedirectMatch を代わりに使えるかもしれない。リダイレクトに使う HTTP Status として 302 (Move Temporarily) なのは、この時点では一時対応であろうから。恒久的に移転することになったら 301 (Move Permanently) に変更する。

2´ mod_rewrite, mod_alias どちらも使えない場合には、ファイルの権限を利用し外部からのアクセスを停止する。

2´´ わからない場合には、レンタルサーバ上のファイルのアクセス権をオーナー以外読み出せないようにする。

2´´´ どうにもわからない場合には、レンタルサーバ上のファイルを削除する。

最初から .htaccess での対処を思いついていれば、少なくとも最低限の告知までWebの停止時間を短くできたなと。インシデントとしては緊急対応が必要な事象でもあるので記事にしました。まめにPCをアップデートして感染しないのがモチ第一。

Windows Azure PowerShell Cmdlets と証明書

http://wappowershell.codeplex.com/ Windows Azure PowerShell Cmdlets の使用例として分かりやすかったのは http://d.hatena.ne.jp/hogege/20100225/1267095103 この日記だった。特に「 Get-OperationStatus –WaitToComplete で実行完了を待つ」ところ。

ところで、世の中の開発者向けの解説やサンプルは、ほとんどが自己署名証明書を基本にしており、その影響がここにも表れている。この日記の人は悪くなく、おそらく最初に出てきたMSのドキュメントからそうなのであろう。

アップロードをする際に証明したいのは、「アップロードする権限があるか」であり、それを証明するための証明書は「個人」証明書として登録されているものである。一方サンプルでは Root 、ルート証明機関にある証明書を利用しようとしている。自己署名の場合は確かにそうなってしまうのだが、ルート証明機関は「ここを起点にしたあらゆる証明書を信頼する」というとても強い信頼を与えてしまうため、滅多なことでは追加してはいけない。

ルート証明機関として証明書を気軽に登録するような文書はなるべく減って欲しい。

具体的には以下の3つの作業を行う

  1. 個人証明書を発行する。自分専用の証明書であれば種類は問わない。
  2. 個人証明書を秘密鍵なしでエクスポートし、Azureの管理証明書として登録する。
  3. スクリプト内の証明書の取得は “My” を利用する。

Azureアップロード用証明書

スクリプトの証明書を取得している行は以下のようになる。

$cert = Get-Item cert:\CurrentUser\My577EFFB2203......

個人証明書については、ActiveDirectory 証明書サービスを用いて証明書は自動発行されるようにしておき、自動発行された証明書を Azure の管理証明書として登録するという開発インフラを整えるのが望ましい。なぜならその証明書が誰の証明書かがはっきりするから。(そうでなければ Visual Studio が作成する自己署名証明書を利用する。チュートリアルをやると大概出来上がっている)

一方で、現在Webを含めインターネット上のあらゆるデータ通信を SSL 化する方向に進んでいると感じており、X.509 証明書の扱いについては開発者であっても、ある程度慣れておくべきと思っている。

(4/12 追記)

http://kamiyn.wordpress.com/2008/03/23/任意のサブジェクトを持つクライアント証明書発/ 4年前からあんまり進歩してませんね…普及させるための方策をちゃんと作らないと!

Windows Update 適用状況の一覧を得る

windowsupdatelist.vbs

Set objSession = CreateObject("Microsoft.Update.Session") Set objSearcher = objSession.CreateUpdateSearcher Set objResults = objSearcher.Search("Type='Software'") Set colUpdates = objResults.Updates For i = 0 to colUpdates.Count - 1 If colUpdates.Item(i).IsInstalled <> 0 Then Wscript.Echo "[Installed]: " & colUpdates.Item(i).Title Else Wscript.Echo "[Not Installed]: " & colUpdates.Item(i).Title End If Next

windowsupdatelist.cmd

REM ECHO OFF setlocal set drv=%cd:~0,1% set dt=%date% set tm=%time::=% set tm=%tm: =0% set tm=%tm:~0,6% set FName=WindowsUpdateList-%dt:~-10,4%%dt:~-5,2%%dt:~-2,2%%tm%-%COMPUTERNAME%.txt cscript windowsupdatelist.vbs //Nologo > %FName% endlocal

上記の2つのファイルを同一のフォルダに置いて、windowsupdatelist.cmd を管理者として実行すると、「WindowsUpdateList-時刻-マシン名.txt」というファイルが出来上がるようになっている。頻繁に利用するのであれば、ショートカットを作成して管理者として実行すると便利。

WSUSで管理するのが筋なんだろうけど、開発用マシンはなかなかそうもいかず。トラブル発生した時に個別に環境を比較する場合がそこそこある。C#でアプリケーション作ってしまう方が楽なんだけど、人によっては得体のしれないexeの実行を嫌がるので、あえて VBScript と バッチファイルで構成しました。

参考にしたサイト: http://blogs.technet.com/b/junichia/archive/2007/09/01/sce-wsus-2.aspx

Trace 出力をイベントログに出す

Web.config に以下のように書いて実験中

<configuration> ...(中略) <system.diagnostics> <trace autoflush="true" indentsize="4"> <listeners> <add name="EventLog" /> </listeners> </trace> <sharedListeners> <add name="EventLog" type="System.Diagnostics.EventLogTraceListener" initializeData="ASP.NET 4.0.30319.0" /> </sharedListeners> </system.diagnostics> </configuration>

以前はイベントログのソース名に独自の名前を付けることが多かったのだが、ソース名の作成が面倒であり、また他のエラーがこのソース名で出ることから、 ASP.NET 4.0.30319.0 を利用することにした。

独自の名前、例えば initializeData=”Contoso The Answer” と指定した場合、最近のシステムでは PowerShell が標準装備なので、管理者でPowerShellコンソールを起動し、 New-EventLog コマンドレット でソース名を追加する。

ApplicationLog

追加しないで Web アプリケーションを起動すると、権限が足りず Security エラーが出る場合があった。

フォロー

Get every new post delivered to your Inbox.