Proximity APIでタグへのデータ読み書き

Proximity APIによるNFC関連ネタ第二弾です。 Windows 8 ストアアプリでは、Proximity APIを使って非接触タグに対するデータの読み書きが可能です。 タグに記憶されているデータをNFCリーダーで読込んで、以下のことができます。 テキストデータならText Editor、JPEGデータならPhotoアプリというように、読込んだデータフォーマットに合わせてそのデータを扱うアプリを起動 読込んだURLを基にブラウザで表示 Windowsストアアプリを引数付きで起動(インストールされていない場合は、Windowsストアのアプリページを表示) 上の3つができるためには、タグにデータが書き込まれていなければなりません。Proximity APIを使えば、タグにデータを書き込むことができます。 さぁ始めよう…でも非接触タグなんてないよ~って方。例えば、https://www.facebook.com/RealTouchShop とかで買えます。東京駅の八重洲中央口を出て少し行ったところで実物見て買えます。あ、それから、NFCリーダー付のWindows 8 PCをご用意ください。 先ずは、書き込みです。テキストデータの書き込みは、     var device = ProximityDevice.GetDefault();    if (device == null)    {        tbStatus.Text = “This Device doesn’t support NFC!”;        return;    }    var kindSelect = “Spade”;    var numberSelect = “Ace”;    string messageType = “WindowsMime:WriteTag.text/plain”;    string message = string.Format(“mark={0},number={1}”, kindSelect, numberSelect);   …

1

NFCをWindows 8 ストアアプリで活用する

さぁWindows 8 ストアアプリでNFCです。 Win RT APIには、近接通信(NFC)するためのProximity APIが用意されています。NFC付のPCであれば、この機能を使ったアプリケーションを動かすことができます。NFCはNear Field Communicationの略で、ベンダー非依存の近距離無線通信規格です。Bluetooth LEやWi-Fi Direct、非接触タグリーダー/ライター等を使って近距離にあるデバイスやタグの間でデータを交換可能です。 Windows 8 ストアアプリでは、Windows.Networking.Proximity名前空間に用意されたクラスライブラリを使って、NFCを活用したアプリを開発できます。 Proximity APIを使って出来ることは、以下の3種類です。 非接触タグの読込/書込み タップによるPC間のデータ送受信(Bluetooth LE) ブラウズによる発見とPC間のデータ送受信(Wi-Fi Direct) 最初の機能は非接触型のプリペイドに対するデータ読み書きです。皆さんよくお使いの非接触型のプリペイドカードが代表選手です。非接触型のタグにデータを書き込んだり、タグからデータを読み込んだりできます。単にデータを読み込むだけでなく、データの形式(テキスト、JPEG、WAVなど)に紐づいたアプリケーションの起動も可能です。URLを指定してブラウザでWebのページを表示させることもできます。他にも、特定のWindowsストアアプリを起動(インストールされていない場合はWindowsストアの該当アプリのページを表示)させることも可能です。タグをリーダー部分に近づけた時、スタート画面にトースト通知が出て、ユーザーに許可を求めるので、勝手に変なデータを送りこまれることはありません。 次の機能は、PCのNFCデバイスがある場所を4㎝以内に近づけ(タップ)てペアリングを行い、データを送受信する機能です。従来のBluetoothの様にパスコードを入力するなどの手間は必要ありません。タップするとスタート画面の右上に、ユーザーの承諾を得るためのトースト通知が表示されます。ユーザーの承認後、2台のPC間でデータのやり取りが可能になります。 最後の機能は、Wi-Fi Directを用いた通信です。通常のWi-Fiがアクセスポイントに接続してネットワークにつながり、ネットワークを介して通信するのに対し、Wi-Fi Directは、ルーターを介さずに、各PCのWi-Fiデバイスが直接Peer To Peerで接続してデータ通信を行える機能です。アクセスポイントが無くても、Wi-Fi Direct対応のデバイス間でなら、ネットワーク通信ができるというとても便利なものです。ただし同時に接続できるのは1対1ですが。 WinRT APIでは、ProximityDeviceとPeerFinderという二つのクラスが用意されています。1.の機能はProximityDeviceクラスを使って、2.と3.の機能はPeerFinderクラスを使って実装可能です。これらの機能の詳しい説明は、 http://msdn.microsoft.com/ja-jp/library/windows/apps/xaml/hh465221.aspx に書かれているので参考にしてください。今後、各機能について、このブログでも、実際にProximity APIを使うときの注意点などを書いていきますので、こうご期待。残念ながら、NFCは現在販売されている全てのWindows 8 PCに装備されているものではありません。ARM版のWindows RT PC(タブレット)の場合は、ついている場合が多いです。SONYのVAIOは大概ついています。PCを購入する場合は、カタログに、NFC、Bluetooth LE等の言葉があるか確認してみてください。もしくは、量販店などで実際に触って試せる場合には、コントロールパネル→デバイスマネージャを開き、 Bluetoothの下位にBluetooth LEがあるか            2の機能が使える ネットワークアダプターの下位にWi-Fi Directがあるか      3の機能が使える 近接通信デバイスがあるか                     1の機能が使える の三点を確認してみてください。NFC、はっきり言って面白いです。ストアで公開されているアプリもNFC対応は今のところあまりありません。NFC自体新しい機能なので利用シナリオもアイデア次第で色々出てきそうです。NFCを使った良いアプリが沢山出てくれば、NFC対応のWin8 PCも種類が増えるでしょう。 NFC機能を使うアプリは、Package.appxmanifestで、機能タブの”近接”にチェックを入れてください。 皆さん、NFCを活用したアプリを開発して、Windowsストアで公開しませんか? 次回は、タグの読み書きに関するTipsを投稿の予定  


WinRT APIによるファイル保存時の注意

WinRT APIを使ってテキスト情報などをファイルに保存する場合のちょっとした注意です。 テキストのファイル保存は、Windows.Storage名前空間のStorageFile、TextWriterクラス等を使います。具体的には、     List<string> statements = …;    StorageFile file = …;    using (var fo = await file.OpenAsync(FileAccessMode.ReadWrite))    {        TextWriter writer = new StreamWriter(fo.AsStreamForWrite());        foreach (var s in statements)        {            await writer.WriteLineAsync(s);        }        writer.Flush();    } こんな感じのコードになります。fileは、FilePickerによるファイル選択やアプリストアから作成してください。注意点として、赤字で書いたステートメントを入れてください。TextWriterはある一定のサイズごとに書き込むようで、Writerに対して書き込んだ情報を物理ストレージに吐き出させるFlushメソッドをコールしないと書き込んだつもりのテキスト情報が全て保存されない場合があります。ファイルに書き込んだはずのデータ量と実際に保存されたファイルのサイズが異なる場合は、この点をチェックしてみてください。


WinRT APIでJSONフォーマットをデシリアライズする方法

現在、Twitterのフォロー/フォロワー状況を分析するWindowsストアアプリを作っています。Twitter APIは現在V1.1に移行することを推奨されているので、さぁ使おうとしたら、XML形式でのデータダウンロードはなくなっているんですね。 JSONか…ってことで、このポストではネットなどからダウンロードしたJSONフォーマットのテキストをWinRT APIを使ってC#でデシリアライズする方法を紹介します。 実はとっても簡単、DataContractJsonSerializerクラスを使います。namespaceは、System.Runtime.Serialization.Jsonです。例えばTwitterのFollowerを取得するAPIを使うと、フォローしているユーザーのIDのリストと、2000項目以上のフォロワーがいる場合に、更に情報を取得するためのカーサー情報がJSON形式で受信されます。これを解析するには、     [DataContract]    public class TwitterRelationships    {        [DataMember]        public List<string> ids;        [DataMember]        public int next_cursor;        [DataMember]        public string next_cursor_str;        [DataMember]        public int previous_cursor;        [DataMember]        public string previous_cursor_str;    } という、受信テキストデータに合わせたクラスを定義して、以下を実行します。streamは、例えば、HttpWebResponseのGetResponseStream()メソッドで取得したJSONデータを取り出すストリームです。     var ser = new DataContractJsonSerializer(typeof(TwitterRelationships ));    TwitterRelationships tr = (TwitterRelationships )ser.ReadObject(stream); これでお仕舞。簡単ですね。ちなみにユーザー情報をIDから取得したJSONをデシリアライズするには、     [DataContract]    public class TwitterUserProfile    {        [DataMember]        public string…


WinRT APIを使って画像ファイルの位置情報を編集する

WinRT APIには、画像ファイルの位置情報を取り出すAPIが用意されています。 位置情報を取り出すのはとても簡単で、imageFileをStorageFile型のオブジェクトとすると、         var imageProps = await imageFile.Properties.GetImagePropertiesAsync(); で、imagePropsのLatitude、Longitudeから緯度、経度を取得可能です。この二つのプロパティの型は、double?で、Nulable型になっています。画像ファイルに位置情報が付与されていない場合には、この二つの値はnullです。加えて、この二つのプロパティは、Readonlyで書き換えができません。Windows Phoneデバイスのカメラでは、位置情報を付与してJPEGファイルとして保存することができますが、多分、位置情報付きの画像ファイルはそれほど多くはないのではないかと思われます。位置情報が付与されているのであれば、既にストアから公開(http://apps.microsoft.com/windows/app/f7f0662c-ba9d-4bb3-a6d5-a1559c970aeb )されている、”どこの写真”アプリの様に、 と、写真を地図上に撮った位置にマップして表示する事ができたりするので、色々と便利なんですね。画像ファイルのデータをバイナリレベルで色々と弄れば位置情報を編集するのは可能なのですが、WinRT APIで変更する方法はないかな…と探していたところ、やり方がForum上で公開されているのを見つけました。情報元はこちら。 http://social.msdn.microsoft.com/Forums/nl/winappswithcsharp/thread/aaf0b373-b0e0-4d91-84d8-69e768a374d8 LatitudeとLongitudeを、そのまま保持しているのではなく、別の形式のデータから計算して取得しているので直接はかえられないみたいですね。内部の形式は、上のURLからたどって調べてもらうとして、以下に画像ファイルの位置情報を編集するコードの例を挙げておきますね。     class LocationHelper    {        public static async Task<ImageProperties> AddLocation(StorageFile imageFile, double latitude, double longitude)        {            int[] denomitor = new int[3] { 1, 1, 1000 };            string latitudeRef = “N”;            if (latitude < 0)            {                latitudeRef = “S”;                latitude *= -1;           …


Windows 8ストアアプリ開発用 Entertainment PhotoテンプレートのUpdate

皆様 http://msdn.microsoft.com/ja-jp/jj556277 から公開しているEntertainment Photoテンプレートを更新しました。更新前のテンプレートには色々と不具合があって、既に使われている皆様にはご迷惑をおかけして申し訳ありませんでした。年末から年初にかけて、このテンプレートをベースにアプリを一本開発してWindows ストアの審査を通す過程で、いくつか不具合を見つけたので、テンプレートの修正を行い、V2として公開中です。修正したバグは、 固定グループを埋め込んだ状態で、2回目以降起動時にException発生 グループに追加されている画像を削除すると直後にException発生 の2う項目。 ちなみに、審査を通して公開されたアプリは、http://apps.microsoft.com/windows/app/827922dc-497c-48ae-aeb4-b826d209fe9c で公開されている”夕焼け倶楽部”というアプリです。このアプリ自体は、夕焼けの写真をコメントを付与しながらアルバム化していくという単純なアプリです。 Entertainment Photoテンプレートでは、Visual Studio 2012が提供するグリッドアプリテンプレートを基に、グループ、及び、グループに所属のアイテムの追加・削除、および、アイテムへの付帯情報付与・編集機能を追加しています。グループ、及び、アイテムは、アプリに埋め込まれて削除や追加ができないグループ・アイテムを用意することもできます。画像や手順などを固定で埋め込んで、関連する情報をユーザーが追加していく様なアプリを開発する際にお使いください。トップ画面のセマンティックズーム、各ページのスナップ表示、検索、共有、プライバシーポリシーなど一通り入っています。 追加したグループやアイテムの情報は、アプリストレージに格納しているので、アプリストレージのサンプルとして見るのも良いでしょう。  


2012年12月18日時点での公開中テンプレート使用に関する注意

http://msdn.microsoft.com/ja-jp/jj556277 から公開中のEntertainment Photo、Basic Photoテンプレートにちょっとした不具合があるので、ご注意。アプリパッケージを作成する前に、Package.appxmanifestを開いて、下図の エントリポイントを変更してください。”.App”の前の文字をプロジェクト名に置き換えてください。例えば、プロジェクト名が、”FavoritMusic”なら、 ”FavoritMusic.App” です。お手数をおかけして申し訳ないです。    


Windows 8 Store アプリをリモートからデバッグ

Windows 8 Storeアプリでは、加速度センサー、ジャイロセンサー、コンパス、GPS、オリエンテーションなど色々なセンサーを使ったアプリ開発が可能です。モーション系のセンサーを使ったアプリを開発する場合、デバッグするには、当然端末を傾けたり、振り回してみたり、叩きつけ…(いや、叩き付けるのはやらないでね)しないと、計測したセンサー値を基に正しくアプリが動作するかチェックができません。で、端末を動かしていると「変な人がいる」…とか言われたりするのですが、それはさておき、同じPC上でVisual Studioを使ってデバッグするのは無理です。 そんな時に便利なのがリモートデバッグ機能です。このポストではリモートデバッグの使い方を説明します。 2012/12/3現在、Visual Studio 2012のUpdate 1が既に公開されているので、先ずはVisual StudioをUpdateしましょう。Updateは、 http://www.microsoft.com/visualstudio/jpn/downloads のVisual Studio 2012 Update 1タイルをタッチして、今すぐインストールをタッチして更新可能です。 更に、このタイルの下の方に、”Remote Tools for Visual Studio 2012”というタイルがあるのでそれもタッチして、リモートデバッグしたいターゲットPCのCPUに対応するソフトをタッチしていインストールします。(この作業はリモートデバッグのターゲットデバイス上で行うことに注意) Remote Toolsのインストールがすむと、ターゲットPCのスタート画面にRemote Debuggerというタイルが追加されます。 リモートデバッグするには、 開発用PC(VS2012がインストールされていて、プログラミング&デバッグを行うPC) ターゲットPC(Remote Debuggerがインストールされていて、プログラムを実行させるPC) を2台とも同じネットワークに接続しておきます。 まず、ターゲットPC上でRemote Debuggerのタイルをタッチして、Remote Debuggerを起動します。認証や、Windows Firewallに関する設定が出てきますが、それはデフォルトでOKです。起動が完了すると と、Windowが表示されます。 開発用PCでVS2012を立ち上げ、ストアアプリを作ります。C#の場合はプロジェクトのプロパティを表示し、”デバッグ”タブを選択します。 ターゲットデバイスのコンボボックスから、”リモート コンピューター”を選択し、”検索(I)…”ボタンをクリックします。 ターゲットPCできちんとRemote Debuggerが動いていて、ネットワークにきちんと2台ともつながっていれば上のようなダイアログでターゲットPCが表示されます。接続したいターゲットPCの選択ボタンをクリックします。ユーザー名とパスワードを聞いてくるので、ターゲットPC側でサインインしているマイクロソフトアカウント(メールアドレス:@hotmail.comとか@live.jp、@hotmail.co.jpなど)をユーザー名のボックスに、パスワードにはサインインするときのパスワードを、それぞれ入力し、”OK”をクリックします。 これで準備万端です。 デバッグ対象のコンボボックスから、リモートコンピューターを選択して、デバッグを開始すれば、ターゲットPC上で開発中のアプリをターゲットPC上でデバッグ実行できます。    


Welcome Back to C++

今日札幌で話したC++に関する情報です。Visual Studio 2012では、昨年標準化されたC++11への対応や、Windows 8 ストアアプリ開発に対応するためのC++/CXなど、新たな機能が追加されています。 新機能(Modern C++)のC++11対応に関する情報ソースは、 http://msdn.microsoft.com/en-us/library/vstudio/hh279654.aspx ※日本語自動翻訳版は、http://msdn.microsoft.com/ja-jp/library/vstudio/hh279654.aspx から公開されています。 スマートポインタやラムダ式、新しいテンプレートなどに関する説明はこちらをご覧ください。 C++/CXは、 http://msdn.microsoft.com/en-us/library/windows/apps/br212455.aspx から公開されています。CXで新たに追加されたキーワード、property、delegate、eventなどに関する説明はこちらをご覧ください。 また、10月末にマイクロソフト本社で開催されたBuildのコンテンツアプリが、Windowsストアから公開されていて、 http://apps.microsoft.com/webpdp/ja-JP/app/build-2012/0c51433d-4d6b-4e51-a274-86611f732fca で公開されています。 このアプリにはセッション情報、動画、PPTなどダウンロード可能なので、Windows 8ユーザーは是非インストールしてみてください。C++に関するドキュメントも結構あります。            


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++に関する話題を、これから何回かに分けて話をしようかな…などと思っております。はい。