Windows 8 ストアアプリ - サンプルコード Tips

今更のポストの気もしますが、皆さん、 http://code.msdn.microsoft.com/windowsapps/Windows-8-Modern-Style-App-Samples ここから、Windows 8 ストアアプリのサンプルプロジェクトが沢山含まれたZIPアーカイブをダウンロードできるのご存知ですよね。アプリ開発を始める際、一通りざっと目を通しておくことをお勧めします。このZIPに含まれるプロジェクト(それぞれ個別にWebからダウンロード可能ですが)のうち、DirectX系のサンプルプロジェクトをビルド&実行するときには、以下のことに気を付けてください。 例えば、XAML DirectX  3D shooting game sampleやDirectX marble maze game sampleは、slnファイルが格納されているフォルダーをVisual Studio 2012のProjectsフォルダー直下に置かないと、ビルドできません。別の場所に置いて「あれ動かないぞぉ」とお困りの方、試してみてください。(サンプルのQ&Aに書いてありました)   DirectXやC++に関する話題を、これから何回かに分けて話をしようかな…などと思っております。はい。    


KINECT for Windows SDKをVC++ Nativeで使う(基礎)

先日公開されたKINECT for Windows SDKは、マネージコード(C#など)だけでなく、VC++ Native用のAPIも提供されています。 ちょっと試してみたい場合にはC#でサンプルを書くのが圧倒的に簡単なのですが、中には「C++は知っているけどVisual Studioは使ったことはないし、C#はしらない。でも試したい。」という方もいらっしゃるでしょう。そんな場合は、Visual Studio C++ 2010 Expressでお試しください。Visual Studio 2010 C++ Expressは、http://www.microsoft.com/japan/msdn/vstudio/express/ の真ん中あたりから、無償でインストールして使うことが出来ます。 VC++ Nativeによるプログラミング方法の基本は、http://research.microsoft.com/en-us/um/redmond/projects/kinectsdk/docs/ProgrammingGuide_KinectSDK.docx や http://research.microsoft.com/en-us/um/redmond/projects/kinectsdk/docs/SkeletalViewer_Walkthrough.docx (どちらも英語でごめんなさい)あたりを見ていただくこととして、(おいおいもっと詳しく取り上げます)、ここではVisual Studio 2010になじみの無い方向けに、コードを書く以外で引っかかりそうなところを説明しておきます。 インクルードファイルディレクトリ: VC++ NativeでKINECTのAPIを使うには、MSR_NuiApi.hのインクルードが必要です。 #include <MSR_NuiApi.h> と、まぁ、コードではこう書くわけですが、予めこのファイルが格納されているディレクトリを設定しておく必要があります。Visual StudioでVC++ Nativeプログラム用のプロジェクトを作成し、ソリューションエクスプローラで、プロジェクトを右クリックしてプロパティを開きます。 左側のパンで”VC++ディレクトリ”を選択し、右側のパンの”インクルードディレクトリ”の入力欄の一番右側を左クリックして、”<編集…>”を選択してください。 右上のフォルダーチックなアイコンをクリックして、KINECT SDKがインストールされているディレクトリを設定します。32Bit OSの場合は、C:\Program Files\Microsoft Research KinectSDK\inc、64Bit OSの場合は、C:\Program Files (x86)\Microsoft Research KinectSDK\inc です。この設定をしておけば、コードで#include <まで入力すると、インテリセンスで、MSR_NuiApi.hが候補として出てきます。 リンクファイル: 更に、ビルドして実行ファイルを作成するには、”MSR_KinectNUI.lib”のリンクが必要です。このファイルは、前出のディレクトリのincをlibに変えたディレクトリに格納されています。プロパティダイアログの、インクルードディレクトリの二つ下に”ライブラリーディレクトリ”という項目があるので、こちらの追加しておきます。そして、プロパティダイアログの、左のパンの”リンカー→入力”の項目を選択すると、 右側のパンの”追加の依存ファイル”の項目に”MSRKinectNUI.lib”を追加します。 以上で、準備OKです。後は、コードを書いて、ビルドすれば、プログラムを実行させることが出来ます。この設定は、VC++ Nativeで、例えばサードパーティ製のライブラリを使う時などは、絶対に必要な設定なので、覚えておいてください。

1

VC++デベロッパーセンター更新しました。

MSDN Flashでもお知らせしましたが、VC++デベロッパーセンターを更新しました。http://msdn.microsoft.com/visualc今回は、各種アンケートや利用されているユーザーの皆さんのご意見を下に、VC++に関する技術情報へのアクセスを、目的や用途に応じてより早く効率的に辿り着けるよう、構成を大幅に整理・変更し、入門レベルの方へのVC++の紹介や、既にお使いの開発者が再度知識を確認できるような情報も付け加えました。ページの上から下まで、情報満載なので、このページをブラウザで開いたら、上から下まで、左端から右端まで眺めて、興味のある情報は即座にクリックしてみてくださいね。 真ん中のメインストリートの見所を幾つか紹介すると、 「連載!とことんVC++」ここをクリックすると、VC++のネイティブ開発で必ず使うCOMやATLに関する基本技術情報を再確認するコンテンツが用意されています。COMを初めとする基礎ライブラリー・フレームワークに関する書籍は昔は沢山あったのですが、今は入手が困難になってしまっています。中級以上の技術者、昔使ってたなという技術者の皆さんがもう一度振り返って見たい、初学者の入門としてご活用ください。単なる解説だけでなく、各回で説明された内容を直ぐに動かして確認できるよう、CodeRecipeのサンプルコードも用意されています。 「アプリケーション別」カテゴリVC++を使った開発の多くは、Windows上のアプリケーション開発か、様々な組込みデバイス向けソフトウェア開発です。これらの開発では、単にVC++の文法を知っているだけでは不十分なのはお判りですね。このカテゴリーの2つのリンクから「Windowsデベロッパーセンター」と「組込み開発者向け技術情報」のページにダイレクトに飛ぶ事が出来ます。加えて「Windowsデベロッパーセンター」には新たにWin32 APIとCOMライブラリのAPIリスト http://msdn.microsoft.com/ja-jp/windows/hh240557 も新たに用意しました。「関数名なんだっけ」、とか、「あのインターフェイス名なんだっけ」という時には是非ご活用ください。 「テクノロジ別」カテゴリここでは、VC++でソフトウェアを開発するときに必須のWin32、COM、MFC、ATLといったライブラリ・フレームワーク、VC++マネージのプログラミングで必要なVC++/CLIに関する技術情報へのリンクが用意されています。これらのテクノロジを詳しく知りたい場合はこちらをクリック!! 「目的別」カテゴリこのカテゴリでは、開発活動の様々な局面で必要になるリンクを用意しました。これまでも使用頻度の高いダウンロードへのリンク、学習リソースやサンプルコードへのリンク、プロフェッショナルが集うフォーラムへのリンク、Visual Studio IDEを更に便利に使いやすくする様々な拡張が用意されています。他にも、「そもそもVC++っていう技術体系って何?」という質問にお答えする「これからはじめる」というリンクも用意しています。 他にも、左側にはVisual Studio 2010に関するリンクが勢揃い。右側には、ハイライトやMSDN MagazinのVC++関連記事、VC++がサポートするC/C++の言語標準、VC++/CLIの言語標準までを用意しました。 皆さんのVC++による開発活動で是非ご活用ください!! 「こんな情報も欲しいんだよね」といったフィードバックもお待ちしています。


ETロボコン応援技術コンテンツ第一弾

ETロボコンに参加する皆さん(そうでない皆さんも含め) 今年の競技から、NXTロボットとホストとの連携による制御が可能になりました。きっとホスト側には色々なプラットフォームが使われるのかなと想像はしています。ホスト側でWindows PCを使う場合、NXTロボットとの通信は、Bluetoothの接続が仮想COMポートにマップされ、COMポート越しのシリアル通信で行うことになります。Windows上の制御ロジックのプログラミング方法には、2つの選択肢があります。1つめはVC++によるネイティブプログラミング、2つめはC#やVBによるマネージプログラミングです。NXTロボット側の制御ロジックはほとんどの場合、C/C++で作成されることでしょう。その流れでいくと「PC側もC++と同じ種族のVC++」を選択する方々がいるかもしれません。特にWindows上のプログラミングをあまりご存じない方に多いような気がします。しかし、同じプログラミング言語を選択する事が、常に生産性が高い事には直結しません。今時のITの世界では寧ろ、プラットフォームや目的が異なればそれぞれに応じたプログラミング言語や開発環境、ライブラリを選択するのが普通です。例えば、Windows上では、ミドルウェア系はVC++ネイティブで、アプリケーションはC#やXAMLで、とか、WebアプリケーションならPHPやRubyで、といった感じです。ETロボコンのPC側制御プログラムを考えた場合、Windowシステムを生かした使い勝手の良いGUIや、走行ログを蓄積する為のデータベースやファイルシステム、Excelとの連携などが必要になるはずです。それらは競技の本筋から見れば傍流の部分ですが、傍流の部分だからこそ、やりたい事を効率よく作りこんでいくことが必須です。VC++ネイティブは、通常のC/C++との親和性が高く、通常のC/C++でプログラミングを行える開発者には、そのまま使えますが、先ほど挙げたGUIやデータベース、ファイルシステム、Excelとのプログラミングにはあまり向いていません。これらの部分は、言語はC#で、豊富で使いやすい.NET Frameworkのライブラリを使って作成していくのが、(たとえC#やライブラリの学習コストを差し引いても)、VC++ネイティブで全てを開発するより、生産性は高いです。パフォーマンスの問題等が特になければ、PC上のプログラムは、C#/.NET Frameworkで開発していく事をおすすめします。 ということで、今回は先ず第一弾として、通信の基礎である、仮想COMポートを介したサンプルコードをCodeRecipeに掲載しました。VC++ネイティブとC#の両方のサンプルを公開しています。通信を使ってまともなプログラムを書くにはスレッドプログラミングも必須なので、そちらも合わせて紹介しています。VC++ネイティブとC#のプログラムの比較も出来るので、言語選択の前に、先ずは一度比較してみてくださいね。 [VC++ ネイティブ]仮想COMポートアクセス: http://code.msdn.microsoft.com/COM-howto-4b79a479/マルチスレッドプログラミング: http://code.msdn.microsoft.com/COM-howto-b6fada2c/ [C#マネージ]仮想COMポートアクセス: http://code.msdn.microsoft.com/COM-howto-6c7ff269/ ETロボコンに参加しない皆さんも、仮想COMポートにマップされてデータの送受信を行う周辺デバイスは非常に多いので、是非、このレシピを試してみてください。 次以降は、NXTとの通信サンプル、WPFを使った効率的なGUIの作り方、SQL Server(Entity Framework)を使ったデータの蓄積・活用、Excelとの連携などなど、サンプルを(多分このブログから)公開していく予定です。こんな話も聞きたい等ご要望もあれば是非。これから予定されている技術セミナーでも、こういう話をしていく予定なので、近場で開催される場合は是非、お越しくださいね。


.NET Framework 4.0のCode Contractsを組込み開発で活用する

今、ある講演向けに、再度、Visual Studio 2010、.NET Framework 4.0の新機能をじっくり見てます。昔私はオブジェクト指向とかモデル駆動型開発とか、CMMとかで組込みソフトウェア開発プロセス改善をやっていたこともあり、ソフトウェアの品質や生産性が上がりそうなトピックスを見ると、直ぐに体が反応してしまいます。 次のポストは、UMLから組込み機器向けのC/C++コードを生成する方法を紹介しようと思っていたのですが、Code Contractに惹きつけられてしまったので、そちらを紹介します。 昔々、Bertrand Meyerさんが、“Design By Contract”(以下DBCと略します)という概念を提唱しました。(所謂、「契約による設計」ってやつですな) DBCを簡単に紹介すると、コードを利用する側に対して、このコードを利用する場合、 事前条件(Pre Condition):こういう条件が整っている時に、このコードは正しく動きますよ。 事後条件(Post Condition):このコードが正しく動いたら、こういう条件になりますよ。 不変条件(Invariant):このコードが動いてもこの条件は変化しないよ。 という表明であり、逆にコードを実装する側にとっては、この3種類の条件を満たすよう実装しなければならない、というプラクティスです。こうすることによって、コードの仕様が明確になる、実装側と利用側のコミュニケーションが良くなる、バグが減って品質が上がり、生産性が上がる、というメリットを得ることができます。よく見かける(見かけないか普通?)、C++やJavaのassertを使って、実装のデバッグの利便性を高めているのは、道具は使っているけれど、DBCではないのでご注意。 そしてDBCを.NET上で積極的に活用できるように、.NET Framework 4.0に、Code Contractsという機能が追加されました。 ちょっと紹介すると、 using System;using System.Diagnostics.Contracts; class CFoo {    ….    [ContractInvariantMethod]    // Invariantを使う場合に必要    public int MethodFoo(int x)    {        Contract.Requires(x!=0&&this.Something>0); // 事前条件。引数は非ゼロ、Somethingプロパティは正        Contract.Ensures(Contract.Result<int>()!=0);// 事後条件。戻り値は、非ゼロ        Contract.Invariant(this.Something!=0);      // Somethingプロパティは非ゼロ        ….    } こんな感じになります。詳細は、http://msdn.microsoft.com/ja-jp/library/dd264808.aspxをご覧いただくとして、Code Contractsを記述すると、以下の3つのケースで、品質を上げるのに寄与することになります。 動的テスト時 静的テスト時 ドキュメンテーション これ、TDDのPracticeを廻すのに凄く便利だと思うのですが、残念ながら、Managedコードでしか使えないんですね。 で、これでこのポストを終わらせてしまうと、タイトルに対して嘘をついたことになってしまうので、これから組込みの濃い世界に踏み込んでいきます。私が思うに、Desktop向けやWeb向けのソフトウェアは、開発環境や実行環境がリッチなので、障害解析は比較的楽なのに対して、組込み機器向けソフトウェアは実行環境が何よりプアなので、DBCの様な仕組みがあれば非常に助かると思うんですよね。 さて、組込み機器開発の場合、Windows目線で分類すると、以下のケースが考えられます。 Windows Embedded…

1

Windows 7 Sensor & Location Platformを使ってみよう – その5

さて、5回目、さっそくいってみようっ 4回目までは、本質が見えにくくならないよう、Managedコードでの使い方を紹介してきました。(Sensor & Location Platformの概念や使い方はわかっていただけましたか?)しかし、やはり場合によっては、COMを使った、Nativeコード開発も必要です。ざっとVC++(Native)でプログラムを組む場合のコードを、まずは、紹介してしまいます。 センサーリストの取得: // SensorMangaerのCOMインターフェイス取り出しCComPtr<ISensorManager> pSensorManager; HRESULT hr = CoCreateInstance(  __uuidof(SensorManager),NULL,CLSCTX_INPROC_SERVER,  __uuidof(ISensorManager),(LPVOID*)&pSensorManager);// SensorCollectionインターフェイスの作成CComPtr<ISensorCollection> pSensorCollection;hr = pSensorCollection.CoCreateInstance(CLSID_SensorCollection);// センサーリスト(照度センサー)を取得hr = this->m_pSensorManager->GetSensorsByType(SENSOR_TYPE_AMBIENT_LIGHT, &pSensorCollection); まずは、こんな感じです。もちろん実際には、HRESULT型の戻り値はちゃんとチェックして(!SUCCEEDED(hr)って感じ)エラーの場合には処理が必要です。また、”Sensors.h”の#includeも必要になります。Managedのときと違って、長ったらしいですね。全てのコードを見せていくのは煩雑なので、以後、Windows API Code Packで使っているCOM Interopの紹介を通じて、読者の皆さんに使い方のあたりをつけてもらいます。 Code PackのSensorsプロジェクトのObjectModelフォルダーにある、SensorManager.csを見てください。この中で、SensorManagerクラスが定義されていて、GetAllSensorsやGetSensorsByCategory等のメソッドは、内部で、nativeISensorManagerというインスタンスを使っているのがわかります。このnativeISensorManagerをC#テキストエディタ上で選択し、右クリック→”定義へ移動”を選択すると、InteropフォルダーのISensorManager.csが開き、nativeISensorManagerに表示が変わります。そこには、 using System.Runtime.InteropService;…[ComImport, InterfaceType( ComInterfaceType.InterfaceIsIUnknown ), Guid( “BD77DB67-45A8-42DC-8D00-6DCF15F8377A” )]internal interface nativeISensorManager{….   [PreserveSig]    HRESULT GetSensorsByCategory(        [In, MarshalAs( UnmanagedType.LPStruct )] REFSENSOR_CATEGORY_ID sensorCategory,        [Out, MarshalAs( UnmanagedType.Interface )] out ISensorCollection ppSensorsFound ); という、定義がなされています。インターフェイスに付与されたComImportやPreserveSig、In,…