Quantcast
Channel: デバイスとITの架け橋
Viewing all 167 articles
Browse latest View live

Direct X SDK(June 2010)をインストールする時に - S1023

0
0

小ネタを一つ。

既にVisual StudioをインストールしたWindowsにDirect X SDK(June 2010)  - http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=6812 - をインストールする際、S1023のエラーコードで失敗したときは、以下を試してみてください。

  1. コントロールパネル → プログラムのアンインストールと更新 を選択
  2. Microsoft Visual C++ 2010 x64 Redistributableを削除
  3. Microsoft Visual C++ 2010 x64 Redistributableを削除
  4. 再度 Direct X SDKをインストール

元ネタはこちら。http://answers.microsoft.com/en-us/windows/forum/windows_7-windows_programs/error-code-s1023-when-trying-to-install-directx/0aadf7ec-e004-42eb-8a1a-2865ff5b3a37

それから、Direct Xを使って、Windows 8 ストアアプリを作りたい場合は、http://msdn.microsoft.com/ja-jp/library/windows/apps/hh452744.aspxに新しい資料が公開されているので、ご参照くださいまし。

 


Unite Japanで講演しました

0
0

マルチプラットフォーム対応のゲーム開発環境で有名なUnity。以前からChannel9などでも情報が公開されていますが、Windows 8 ストアアプリへの対応が進んでいます。従来からWindows Desktop向けには当然対応していましたが、Intel系向けのデスクトップアプリが動作しないARM版のWindows RTタブレットでも動作するストアアプリを開発できるようになります。

やってみたいという方は、Unityさんのサイト

http://blogs.unity3d.com/2013/03/07/unity-4-early-access-for-windows-store-apps/

からベータ版を先行して使うためのプログラムに申し込んでください。

そんな関係で、今週月火に開催されたUnite Japanの火曜の16:30-17:15の枠で講演をさせていただきました。資料は、以下からダウンロードできるようにしましたので、是非ご参照くださいまし。

http://sdrv.ms/17qiUkB

今後、Unityで作成しているアプリからWinRT APIを使う方法や、ストアに登録するまでのTipsなどを投稿していく予定なので、ヨロシクね。

 

 

Kinect for Windows SDK + XNA Studio on Windows 8

0
0

今日はQConTokyo 2013でKinectに関する講演を行うわけですが、Kinect for Windows SDKに関する小ネタを一つ。

SDKに含まれるサンプルでXNAを使う、マッチョマンアバターのデモがありますが、あれは、単にSDKをインストールしただけだと、動かすことができません。

このデモを動かしたい場合、XNA Studioのインストールが必要になります。Windows 8の場合は、以下の手順でXNA Studioをインストールしてみてください。

1.Games for Windows マーケットプレイスクライアントをインストール
まず、http://www.xbox.com/ja-jp/LIVE/PC/DownloadClientからソフトをダウンロードしてインストールしてください。これを入れないと、XNA Studioのインストールが失敗します。

2.XNA Studio 4.0 Refleshのインストール
Refleshの方をインストールしてください。ダウンロードは http://www.microsoft.com/en-us/download/details.aspx?id=27599から。

残念ながら、このサンプルはデフォルトではVisual Studio 2010でしか動きません。勿論他のサンプルはVisual Studio 2012でも動きますので、そこのところ間違いなきよう。

以上。

Team Foundation ServiceをVS2012、VS2010、VS2008の混在環境で使う

0
0

皆さん、Team Foundation Serviceをご存じ?Team Foundation Serverのクラウド版、サービスです。5ユーザーまでなら無料で使えるサービスです。Visual Studio + Team Foundation Serverできちんとプロジェクトを管理しつつチーム開発するのってどうやるの?と思っている方是非試しに使ってみてください。

Team Foundation Serviceは、Microsoft アカウント(旧Live ID)をお持ちの方なら、http://tfs.visualstudio.com/にアクセスして、Sign Upすればすぐに使えます。このサービス、Visual Studio 2012からなら、特に何もせずに、チームメニューの”Team Foundation Serverへの接続”から、Sign Upして取得した各自のHomeのURLを入力すればすぐに接続できます。

組込み系の場合、Windows Embedded Compact 7のOS、アプリ開発はVisual Studio 2008だったり、.NET GadgeteerはVisual Studio 2010だったり、Windows Embedded Standard 8やWindows 8、クラウドサービスのWindows AzureはVisual Studio 2012と旧バージョンのVisual Studioも開発環境として使わざるを得ません。大きなプロジェクトであればあるほど、「きちんとしたチーム開発管理がしたい」訳ですが、Visual Studio 2012だけでなく、Visual Studio 2010やVisual Studio 2008でも、Team Foundation Serviceで一貫した管理をする必要があります。

しかし、Visual Studio 2008やVisual Studio 2010の場合、チームメニューの”Team Foundation Serverへの接続”にTeam Foundation Serviceの各自のHomeのURLを入れてもデフォルトでは接続できません。これらをつなぐには、

Visual Studio 2010の場合:http://www.microsoft.com/ja-jp/download/details.aspx?id=29082

Visual Studio 2008の場合:http://www.microsoft.com/ja-jp/download/details.aspx?id=29983

から、追加のソフトCompatibility GDR for Visual Studio 2012をインストールしてください。これで、同じサイト、同じチームプロジェクトで管理が可能になります。

え、AndroidやLinuxのOSも構成要素なんだよね…ですって?大丈夫そんな場合は、http://tfs.visualstudio.com/en-us/learn/code/connect-eclipse/に書いてある方法でつないでくださいね。

 

 

 

QConTokyo 2013のKINECTセッション資料

0
0

QConTokyo 2013で私のKINECTセッションに参加された方、ありがとうございました。

当日の資料は、http://sdrv.ms/ZQpR9Zから公開します。KINECT for Windows Sensorを組込み系で使ってみたい方、ご一読を。

※KINECTセンサーでアプリを組んでいいのは、Windows 7、Windows 8、またはそれらをベースにしたWindows Embedded OS、と KINECT for Windows SDKの組合せだけです。LinuxやMac OS、Open NIなど、それ以外の組合せでは使えないので、ご注意くださいね。

 

.NET GadgeteerがVisual Studio 2012に対応

0
0

.NET Micro Frameworkと.NET Gadgeteer ファンの皆さん

GHI Electronics社から、.NET GadgeteerのVisual Studio 2012対応版 .NET Gadgeteer SDKがリリースされました。ご存じのとおり、.NET Micro Frameworkそのものは、既にSDK 4.3が出ていて、Visual Studio 2012に対応済みだったので、これで、Visual Studio 2012で.NET Gadgeteerの開発ができるようになったわけです。
※Visual Studio 2010を継続して使いたいという方向けにもちゃんと対応するバージョンが公開されているので、引き続きVS2010でも開発が行えます。

早速使ってみたいという方、http://www.ghielectronics.com/community/forum/topic?id=11849を参考にアップデートをしてください。

このアップデートに伴い、.NET Gadgeteerの.NET Micro Frameworkが4.3にアップデートされています。実は、GHI ElectronicsのSDKのアップデートのちょっと前に、.NET Gadgeteer自身もバージョンアップが行われました。この変更に伴い、.NET GadgeteerのプロジェクトテンプレートのWizardが

こんな絵になって、より直感的にボードを選択できるようになっています。

更に、.NET Gadgeteerの共通部分の開発サイト、https://gadgeteer.codeplex.com/からは、.NET Gadgeteer TemplateというSDKもリリースされました。これは、GHI Electronics社が作成しているような、各HWセット毎の Gadgeteer SDKを作成するためのプロジェクトテンプレートの様です。このSDKをインストールすると、プロジェクトテンプレートに、

と、.

  • .NET Gadgeteer Kit
  • .NET Gadgeteer Mainboard
  • .NET Gadgeteer Module

の3つのテンプレートが追加されます。私もまだ全てを試しているわけではないのですが、どうやら、HW Kit一式、既存のSDKセットへのCPUボードや周辺ボードの追加ができるようです。ファンのどなたか、実際に試してみませんか?

 

Visual Studio 2012でDSL(Domain Specific Langage)を実践

0
0

つい先頃、DSLに関する話題が某コミュニティで出たので、2013年6月時点での最新ツール群を使った、DSLを実践する取っ掛りを紹介しておきます。

DSL(Domain Specific Language)とは何ぞや…を本来ならちゃんと説明しなければならないのですが、この投稿に興味あるのは、DSLという高尚なネタに興味のあるハイレベルな技術者だけだろうということで省きます。ある特定領域のある目的に特化した専用モデル(図じゃなくてもいいのですが)エディター&ツールです。.NET Gadgeteerのボードエディタ、Entity Frameworkのグラフィカルエディターを思い浮かべてください。

で、Visual Studio 2012を使って独自のDSLを実践する環境が作れます。Visual StudioのEditionはUltimateが必要です。このEditionにVisualization & Modeling SDKをインストールします。このSDKは、Visual Studioの”ツール”→”拡張機能と追加プログラム”で、名前で検索するか、

http://www.microsoft.com/en-us/download/details.aspx?id=30680

を直接ブラウザで開いて、必要なSDKのインストーラーをダウンロード&実行します。

準備はそれでおしまい。

SDKをインストールすると、プロジェクトテンプレートに、

”その他のプロジェクトの種類”→”Domain Specific Language Designer”というプロジェクトテンプレートが追加されます。DSLの環境を開発するには、このテンプレートを起点にします。まぁ取敢えず、サクサクと作ると、

こんな感じのプロジェクト一式が現れます。DSLは奥が深く、とても数行では語れないので、このポストでは深くは語りませんが、図の部分の左側がDSLのメタモデル、右側がDSLの見た目のEditorです。加えて、Editor上のコンテキストメニューや、各種機能、モデルからの自動生成機能などを入れ込んでいくことが可能です。自動生成ではT4 Templateという技術要素が利用可能です。

先ずは、サンプルを一個作って、F5実行してみてください。DSL環境がビルトインされたVisual Studio IDEがもう一個立ち上がり、その時点でのDSL Editor環境を実際に動作させることができます。

ご要望があれば、更に詳しく、このVisualization & Modeling SDKの使い方など、説明しようかなと思っておりますです。

 

 

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

0
0

前に投稿した、WinRT APIでJSONフォーマットをでシリアライズする方法の続編です。

 

シリアライズしたいJSONのフォーマットが、

{"__type":"UserTypeA:#UserTypeNS","Properties":{"PropertyX":"ValueX", "PropertyY":"ValueY"},"DataPackets":[{"__type":"UserTypeB:#UserTypeNS","PropertyA":"ValueA","PropertyB":"ValueB"}],"Values":["1","2","5"]}

といったような形式をとる場合のデシリアライズロジックを紹介します。

先ず、JSONのデータを表現するクラスを定義します。

namespace UserTypeNS
{

    [DataContract]
    public class UserTypeA
    {
        [DataMember]
        public List<UserTypeB> DataPacketA;
        [DataMember]
        public List<int> Values;
    }

    [DataContract]
    public class UserTypeB
    {
        [DataMember]
        public string PropertyA;
        [DataMember]
        public string PropertyB;
    }

    [DataContract]
    public class PropertiesType
    {
        [DataMember]
        public string PropertyX;
        [DataMember]
        public string PropertyY;
    }
}

JSONの中の、"__type":"XXX:#NS"の項目は、何らかの標準で規定されたデータ型であり、その情報なので、データクラスの中でプロパティで定義する必要はありません。
デシリアライズするコードは、

    List<Type> types = new List<Type>();
    types.Add(typeof(UserTypeNS.UserTypeA));
    types.Add(typeof(UserTypeNS.UserTypeB));
    types.Add(typeof(UserTypeNS.PropertiesType));

    var dcjs = new DataContractJsonSerializer(typeof(UserTypeNS.UserTypeA), types);
            
    var data= dcjs.ReadObject(stream) as UserTypeNS.UserTypeA;

となります。デシリアライザーを作成するときに、デシリアライザーに対して型の定義を教えてあげるために、JSONの中で使われている方を、リストかして教えるわけです。

以上です。簡単ですね~。


 


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

0
0

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上でデバッグ実行できます。

 

 

.NET Micro Frameworkでネットワークプログラミングする時に便利なクラス達

0
0

今、.NET GadgeteerでWindows Azure Storageのテーブルに接続するコードを書いているところですが、よく使うクラスと使用上の注意点をメモっときます。

RESTでWebサービスに接続するには、当然

  • HttpWebRequest
  • HttpWebResponse

の二つのクラスが必要です。そして当然の様に用意されています。若干の細かい違いはあるものの、フルの.NET Frameworkのライブラリとほぼ同じ。デスクトップアプリやWebアプリでのコーディングそのままの勢いで書いちゃってください。名前空間は同じく、System.Netです。使うときには、プロジェクトの参照にSystem.Http アセンブリを加えてください。

XMLデータを受信して解析するには、

  • XmlReader

を使います。このクラスはフルの.NET Frameworkとはかなりメソッド構成が違います。このクラスの使い方はまた別の機会で。名前空間はSystem.Xmlで、使うにはSystem.Xml アセンブリーを参照に追加してください。System.Xml.Legacy アセンブリーは必要ありません。XmlReaderがあるならXmlWriterを使いたい…そんなあなたへ。一応System.Ext.Xml空間にありますが、このクラスは、DPWS(Device Profile For Web Service)ライブラリ用に用意されているクラスで、MFDpwsExtentions というアセンブリーで提供されています。このアセンブリーは比較的サイズが大きく、フルの.NET FrameworkのXmlWriterとは使い勝手も違い、更に、XML文を組み立てるなら、文字列の足し算で十分じゃない?ということで、DPWSを使う場合以外は使わなくてもよいでしょう。小型の組込み機器制御だし。

文字列を組み立てるとなると、

  • StringBuilder

も欲しいところです。このクラス、.NET Micro Frameworkの過去のバージョンでは、名前空間が違うところにあったりしたのですが、4.xではSystem.Textにちゃんと用意されています。

で、URL文を組み立てる段になると、UriクラスのEscapeDataString()メソッドが欲しくなります。これは、.NET Micro FrameworkのUriクラスには用意されていません。困ったな。現在調査中ですが、

  • Regex

クラスのEscape()メソッドがどうやら使えそう。このクラスは、System.Text.RegularExpressions 名前空間にあります。使う場合は、名前空間と同じ名前のアセンブリーを参照に追加してください。

さて。HttpWebRequestクラスを使い、GetRequestStream()メソッドでストリームを取り出して、データをWebサーバーに送る場合、UTF8でエンコードされたバイト列に文字列を変換します。これは、

  • Encoding.UTF8.GetBytes(body)

でエンコード可能です。System.Text名前空間にEncodingクラスがあります。

更に、暗号化など行う場合は、私のブログの前に投稿した記事を見てもらう必要があります。SHA1、HMACなどで暗号化したバイト列を今度はBase64エンコーディングした文字列への変換が必要になります。

  • Convert.ToBase64String(buf)

というようにConvertクラスのToBase64String()メソッドで一発変換。

といったように、一通りWebプログラミングに必要なクラス、メソッドが用意されているので、.NET Gadgeteer/Micro Frameworkで、ネットワーク連携プログラミングをお楽しみください。

 

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

0
0

http://msdn.microsoft.com/ja-jp/jj556277

から公開中のEntertainment Photo、Basic Photoテンプレートにちょっとした不具合があるので、ご注意。アプリパッケージを作成する前に、Package.appxmanifestを開いて、下図の

エントリポイントを変更してください。”.App”の前の文字をプロジェクト名に置き換えてください。例えば、プロジェクト名が、”FavoritMusic”なら、

”FavoritMusic.App”

です。お手数をおかけして申し訳ないです。

 

 

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

0
0

皆様

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が提供するグリッドアプリテンプレートを基に、グループ、及び、グループに所属のアイテムの追加・削除、および、アイテムへの付帯情報付与・編集機能を追加しています。グループ、及び、アイテムは、アプリに埋め込まれて削除や追加ができないグループ・アイテムを用意することもできます。画像や手順などを固定で埋め込んで、関連する情報をユーザーが追加していく様なアプリを開発する際にお使いください。トップ画面のセマンティックズーム、各ページのスナップ表示、検索、共有、プライバシーポリシーなど一通り入っています。

追加したグループやアイテムの情報は、アプリストレージに格納しているので、アプリストレージのサンプルとして見るのも良いでしょう。

 

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

0
0

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
    {
        publicstaticasyncTask<ImageProperties> AddLocation(StorageFile imageFile, double latitude, double longitude)
        {
            int[] denomitor = newint[3] { 1, 1, 1000 };
            string latitudeRef = "N";
            if (latitude < 0)
            {
                latitudeRef = "S";
                latitude *= -1;
            }
            string longitudeRef = "E";
            if (longitude < 0)
            {
                longitudeRef = "W";
                longitude *= -1;
            }

            int[] latitudeNumerator = newint[3] { 0, 0, 0 };
            int[] longitudeNumerator = newint[3] { 0, 0, System.GPS.LatitudeNumerator0 };

            Calcurate(latitude, denomitor, ref latitudeNumerator);
            Calcurate(longitude, denomitor, ref longitudeNumerator);

            var props = newList<KeyValuePair<string, object>>();
            props.Add(newKeyValuePair<string, object>("System.GPS.LongitudeNumerator", longitudeNumerator));
            props.Add(newKeyValuePair<string, object>("System.GPS.LongitudeDenominator", denomitor));
            props.Add(newKeyValuePair<string, object>("System.GPS.LongitudeRef", longitudeRef));
            props.Add(newKeyValuePair<string, object>("System.GPS.LatitudeNumerator", latitudeNumerator));
            props.Add(newKeyValuePair<string, object>("System.GPS.LatitudeDenominator", denomitor));
            props.Add(newKeyValuePair<string, object>("System.GPS.LatitudeRef", latitudeRef));

            await imageFile.Properties.SavePropertiesAsync(props);
            var imageProps = await imageFile.Properties.GetImagePropertiesAsync();
            return imageProps;
        }

        privatestaticvoid Calcurate(double val, int[] denomitor, refint[] numerator)
        {
            numerator[0] = (int)System.Math.Floor(val);
            val -= numerator[0];
            if (val >= 0)
            {
                val *= 60;
                numerator[1] = (int)System.Math.Floor(val);
                val -= numerator[1];
                if (val >= 0)
                {
                    val *= 60;
                    numerator[2] = (int)(System.Math.Round(val * denomitor[2]));
                }
                else
                {
                    numerator[2] = 0;
                }
            }
            else
            {
                numerator[1] = 0;
                numerator[2] = 0;
            }
        }
    }

内部形式は、方位と度、分、秒を基本としたデータ構造ってわけです。更新の際に使われているキーワードは、

http://msdn.microsoft.com/en-us/library/windows/desktop/ff514245(v=vs.85).aspx

に載っているものが使われています。

以上、画像ファイルの位置情報に関するTipsでした。

 

 

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

0
0

現在、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]
        publicList<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 = newDataContractJsonSerializer(typeof(TwitterRelationships ));
    TwitterRelationships tr = (TwitterRelationships )ser.ReadObject(stream);

これでお仕舞。簡単ですね。ちなみにユーザー情報をIDから取得したJSONをデシリアライズするには、

    [DataContract]
    public class TwitterUserProfile
    {
        [DataMember]
        public string id;
        [DataMember]
        public string screen_name;
        [DataMember]
        public string profile_image_url_https;
        [DataMember]
        public int followers_count;
        [DataMember]
        public bool Protected;
        [DataMember]
        public string description;
        [DataMember]
        public int friends_count;
        [DataMember]
        public string name;
    }

というようなクラスを定義して、

    var ser = newDataContractJsonSerializer(typeof(TwitterUserProfile));
    TwitterUserProfile tr = (TwitterUserProfile)ser.ReadObject(stream);

で、デシリアライズできます。クラスの定義の時は、JSONで記述されている全ての項目をプロパティとして定義する必要はなく、必要な項目だけ定義すればそれでOKです。

 

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

0
0

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メソッドをコールしないと書き込んだつもりのテキスト情報が全て保存されない場合があります。ファイルに書き込んだはずのデータ量と実際に保存されたファイルのサイズが異なる場合は、この点をチェックしてみてください。


.NET Micro Framework 4.3リリースされてます

0
0

実はリリースされてからちょっと経ってしまっているのですが、超小型組込み機器向けファームウェア.NET Micro Frameworkが2012年12月にリリース���れています。最新バージョンは4.3です。Visual Studio 2012で.NET Micro Frameworkのプログラミングができるようになりました。勿論、Porting Kitも同時にバージョンアップされています。本家の情報は、

http://blogs.msdn.com/b/netmfteam/archive/2012/12/04/netmf-4-3-released.aspx

から。詳しい機能アップデート情報はこちらから。

http://netmf.codeplex.com/wikipage?title=Roadmap%20for%20Next%20Version

後は、早く.NET Gadgeteerが.NET Micro Framework V4.3に対応してくれれば…

 

 

 

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

0
0

さぁ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種類です。

  1. 非接触タグの読込/書込み
  2. タップによるPC間のデータ送受信(Bluetooth LE)
  3. ブラウズによる発見と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を投稿の予定

 

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

0
0

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);
    var writer = newDataWriter();
    writer.UnicodeEncoding = UnicodeEncoding.Utf16LE;
    writer.WriteString(message);
    publishedId = device.PublishBinaryMessage(messageType , writer.DetachBuffer(), (provider, msg) =>
    {
        provider.StopPublishingMessage(msg);
    });

こんな感じでおしまい。NFCリーダー付きのPCはそんなに多くないので、��初にチェックをします。Windows.Networking.Proximity名前空間のProximityDeviceクラス、このGetDefault()メソッドのコール結果がnullでなければ、非接触タグの読み書きが可能です。

書き込みの基本は、DataWriterクラス(名前空間はWindows.Storage.Streams)で書き込むデータを組み立て、ProximityDeviceのPublishBinaryMessage()でデータのタイプを指定して書き込む、という流れです。Publishメソッドをコールすると、NFCリーダーは書き込み待ちになるので、非接触タグをNFCリーダーに近づけるとタグへの書き込みが行われます。Publishメソッドをコールしっぱなしだと、複数のタグに書き込みできます。ただ、書き込み済みのタグを誤って書き換えてしまうこともあるので、コードの最後に示すように、StopPublishingMessage()メソッドをコールして、書き込みを終了します。

上に示したコードでmessageTypeに代入している文字列は、メッセージのフォーマット指定です。上の例では、平文のテキストです。他のデータフォーマットを送りたい場合は、

http://msdn.microsoft.com/ja-jp/library/windows/apps/hh701129.aspx

を見てください。

次にブラウザで開くURLの書き込みです。上のコードで、messageTypeに"WindowsUri:WriteTag"を、messageに表示したい、URLをセットすれば、OKです。

次にWindowsストアアプリを起動するデータを書き込む方法です。messageTypeは、"LaunchApp:WriteTag"を指定してください。messageの部分は、

    string launchArgs = String.Format("mark={0},number={1}", kindSelect, numberSelect);
    string praid = "App";
    string appName = Windows.ApplicationModel.Package.Current.Id.FamilyName + "!" + praid;

    string message = launchArgs + "\tWindows\t" + appName;

で組み立てます。launchArgsは、起動するWindowsストアアプリに渡す引数です。praidの”App”は、Package.appxmanifestをコードで開いて、<Applications>の下位の<ApplicationId="..." のIdアトリビュートの値を書いてください。Package.appxmanifestのGUI表示のIdではないのでご注意。
messageのフォーマットは、

アプリ引数 + プラットフォーム + 起動するアプリ

という形式です。これで書き込んだタグを近づけると、

こんな感じでトーストノーティフィケーションが表示されます。これをタップすると、

アプリが起動します。ユーザーがOKを出さないとアプリは起動されないので、勝手に変なアプリを密かにすれ違いざまに入れられてしまうということは出来ません。安心ですね。

URLを書き込んだタグをNFCリーダーに近づけると、

こんな表示が出ます。これをタップするとブラウザが起動します。

さて、テキストや画像の場合ですが、読込み方法は、

        var subscribedId = device.SubscribeForMessage("NDEF:MIME.text/plain", (provider, message) =>
        {
            var data = message.Data;
            byte[] buffer = newbyte[data.Length];
            var reader = DataReader.FromBuffer(data);
            reader.ReadBytes(buffer);

というコードで読込みます。ProximityDeviceクラスのSubscribeForMessage()メソッドをコールして、タグがタップされるのを待ちます。この際、第一引数に読込みたいデータのフォーマットを指定します。タグがタップされれば、var data以降のコードが実行され、bufferにタグに書き込まれていたバイナリ―データが読み込まれます。
第一引数は、http://www.nfc-forum.org/が規定しているフォーマットで指定します。書き込むときの指定と違うのでご注意ください。NDEF形式で読込まれたデータを元に戻す方法はまた別のポストで説明しますね。

タグの読み書きは以上です。是非お試しください。

 


 

 

FEZ Spider、FEZ Hydra、FEZ Cerberusがデバッグでつながらない?

0
0

昨年..NET Micro Framework4.2に対応した新しいバージョンの.NET Gadgeteerがリリースされました。.NET Gadgeteer SDKがアップデートされると、FEZ Spider、FEZ Hydra、FEZ CerberusのFirmwareをアップデートする必要があります。

アップデートの方法は、http://wiki.tinyclr.com/index.php?title=Firmware_Updateを忠実に実行すればOKです。アップデートしたのにVisual Studioのデバッグ実行でボードが反応しない!!という場合、デバイスドライバーを確認してみてください。

コントロールパネルからデバイスマネージャーを開いてください。

このように、”Debuggable .Net Micro Framework Device”→”GHI .NET Micro Framework USB Debugging Interface"という項目があるか確認してください。これが無い場合、”ユニバーサルシリアルバスコントローラー”の項目に”GHI NETMF Debug Interface”があるか確認してください。FEZボードをUSB接続して、デバイスドライバーがこの項目でインストールされてしまっている場合、Visual Studioでデプロイ&デバッグしようとしてもできません。
この項目を右クリックし、”ドライバーソフトウェアの更新”を選択、”コンピューターを参照してドライバーソフトウェアを更新します”をクリックします。さらに”コンピューター上のデバイスドライバーの一覧から選択します”をクリックして、表示されたリストの中から、”GHI .NET Micro Framework USB Debugging Interface"を選択して正しいデバイスドライバーをインストールしてください。

もし、ユニバーサルシリアルバスコントローラの下に該当するものが無ければ、COMポートの下に”GPS Camera”という項目が無いかチェックしてみてください。この項目がある場合、ボードのファームウェアの更新が中途半端で終わっていない可能性があります。ファームウェアの更新手順を最初からやり直してみてください。

 

 

Proximity APIでWi-Fi Direct通信

0
0

WinRT APIは、Proximity APIを通じてWi-Fi Direct通信を行えます。通常のWi-Fiは、アクセスポイントを通じてインターネットにつながったデバイスの間で通信が可能ですが、アクセスポイントが無ければデバイス間で通信はできません。Wi-Fi Directは、アクセスポイントが無くても、サポートしているデバイス間でP2Pで接続し、データ通信を可能にする技術です。ハードウェアは通常のWi-Fiと同じものが使えます。アクセスポイントを介さずにつなげられるので、データ漏えいの危険も減ります。考えてみれば、単にデータを交換したいだけならば、インターネットに接続する必要はないわけです。近場にいる人とのショートメッセージやイメージデータの交換ができるので、ローカルSNSや近場のマルチユーザーゲームなど、アイデア次第で様々な応用が考えられます。

http://www.wi-fi.org/discover-and-learn/wi-fi-directを見ると、Wi-Fi Directはデータ転送が250Mbpsとかなり高速、ハードウェアは従来のWi-Fiそのままが使える、通信に関するセキュリティ、アクセスポイントとの併用など、かなりいい感じです。これを活用しない手はありません。しかし、現時点ではすべてのWindows 8 PCがWi-Fi Directをサポートしているわけではないので、ご注意。ま、持ってる者同士でつながってください。

使い方を以下に説明していきます。Wi-Fi Directは、Windows.Networking.Proximity名前空間のPeerFinderクラスを使います。最初に、アプリが動作しているPCでWi-Fi Directが使えるかをチェックします。PeerFinderクラスのSupportedDiscoveryTypesプロパティをチェックします。

        if ((PeerFinder.SupportedDiscoveryTypes & PeerDiscoveryTypes.Browse) == PeerDiscoveryTypes.Browse)

このプロパティは、ビットフラグなので、上の様なチェックをします。この条件がtrueであれば、Wi-Fi Directを利用可能です。falseの場合には、「Wi-Fi Direct機能付きのPCを購入してね」といったメッセージを出しましょうw。

Wi-Fi Directで接続するためには、別のPCからブラウズできるようにしておく必要があります。

               PeerFinder.ConnectionRequested +=
                   newTypedEventHandler<object, ConnectionRequestedEventArgs>
                       (PeerFinder_ConnectionRequested);
               PeerFinder.Start();

Start()をコールすると、同じストアアプリがフロントで動いているPC上で、探すことができるようになります。ConnectionRequestedイベントは、別のPCからの接続要求を受け付けるためのものです。

同じストアアプリが動いていて、Start()メソッドをコール済みのPCを探すには、

            var peers = awaitPeerFinder.FindAllPeersAsync();
            foreach (var peer in peers)
            {

と、FindAllPeersAsync()を使います。peersは、PeerInformationというクラスのインスタンスのリストです。DisplayNameプロパティで相手のデバイスの名前が判ります。

Wi-Fi Directで接続する場合、

                var streamSocket = await PeerFinder.ConnectAsync(peer);

と、ConnectAsync()をコールします。接続が完了すると、通信するためのストリームソケットを取得できます。
ストリームソケットを取得で来たら、データの受信待ちを開始します。streamSocketからデータ送受信の為のReaderとWriterを作成します。

            peerWriter = newDataWriter(streamSocket.OutputStream);
            peerReader = newDataReader(streamSocket.InputStream);

peerWriterとpeerReaderは、別の目的でも使用するのでクラスのメンバー変数として定義しておきましょう。ストリームソケットを基にDataRearインスタンスを作成したら、あとは、LoadAsyncやReadXXXメソッドを使ってデータを受信し続けます。データの送受信については、別の投稿で詳しく解説する予定ですのでそちらを参照してください。

別のPCがFindAllPeersAsync()メソッドで発見し、ConnectAsync()メソッドをコールして接続要求をすると、先ほど紹介したようにConnectionRequestedイベントに登録したハンドラがコールされます。この要求を受け付ける場合、

            var streamSocket = await PeerFinder.ConnectAsync(e.PeerInformation);

と、ConnectAsync()メソッドをコールします。ConnectionRequestedイベントハンドラの引数のPeerInformationプロパティに接続要求を出したPeerの情報が入っています。ConnectAsync()メソッドをコールして得られたストリームソケットを使ってデータの送受信を行うわけです。AcceptAsync()メソッドをコールしなかった場合はWi-Fi Direct接続要求は無視され、タイムアウト処理されます。Start、FindAllPeersAsync、ConnectAsync、AcceptAsyncのすべてのメソッドコールで、try、catchで例外を捕捉して適切な処理をすることを忘れずに。

以上の流れを図に示しておきますね。

DataReaderインスタンスの作成、LoadAsync、ReadXXXメソッドによるデータ受信で一つ注意をしておきます。この一連の流れの中で通信にかかわる以外のawaitをつけたコール(メッセージダイアログやUIの表示を直接更新するようなDispatcherへ委譲など)は実行しないでください。これをやると、折角接続できたPeerとの通信が切断されてしまうという現象が起こるようです。

次のポストでは、データの送受信について解説します。お楽しみに。

 

Viewing all 167 articles
Browse latest View live




Latest Images