Cortanaからアプリをフォアグラウンド起動する – VoiceCommandDefinitionManager

Cortanaからアプリの操作 UWPではCortanaに事前に音声コマンド定義ファイル(VoiceCommandDefinition)を登録しておくことによってCortanaに特定の言葉を発話させたときにアプリを起動させることができます。 CortanaからUWP起動はフォアグラウンド起動とバックグラウンド起動の2つのパターンがありますが今回はフォアグラウンド起動のパターンです。 VoiceCommandDefinitionファイルを作る VoiceCommandDefinitionファイルはここ https://msdn.microsoft.com/ja-jp/library/windows/apps/xaml/dn706593.aspx の定義に従って作ります。 CommandSet – 言語(ja-JP)単位で作ります。多言語対応する場合は複数作成 CommandPrefix – 認識したい言葉の前に必ずつけます Example – 発話例 Command – 認識したいコマンドを定義。複数定義可 Example – 発話例 ListenFor – 認識したいコマンドを書きます。[]であってもなくてもよい、{}はPhraseListの中から選択することになります Feedback – 認識完了したときCortanaに言わせる言葉 Navigate – アプリをフォアグラウンド起動します。   <?xml version=”1.0″ encoding=”utf-8″ ?> <VoiceCommands xmlns=”http://schemas.microsoft.com/voicecommands/1.2″> <CommandSet xml:lang=”ja-JP”> <CommandPrefix>サンプル</CommandPrefix> <Example>サンプル ウインドウ起動</Example> <Command Name=”Command1″> <Example>サンプル ウインドウ起動</Example> <ListenFor>ウインドウ[起動]{number}</ListenFor> <Feedback>認識しました</Feedback> <Navigate /> </Command> <PhraseList Label=”number”> <Item> 1 </Item>…

Component Object Model(COM)とは何か まとめる

はじめに 12月19日、中部のCLR系勉強会であるCenterCLRの番外編?的な企画であるCenter CLR ChanlkTalkにて、ありがたいことに私のリクエストに応えていただいて、COMの概念を解説していただきました。 本記事ではそこで学んだことと、私の考えをまとめ、整理しておきたいと思います。。 とはいえ私はCOM全盛期?にお仕事をしていたわけではなく、数時間COMの勉強をしただけなので必ず間違ったことを書いていることがあるかもしれません。間違いを見つけた場合は@garicchiまでお知らせいただけるとありがたいです。 もしかしなくても私より良いまとめをされている主催のkekyo先生のページを見たほうがいいかもです .NetアプリケーションはCPUに関係なく動く まず、COMというものは現在の.NetFrameworkのランタイム環境であるCLRが生まれる前の概念であるということを理解する必要があります。 現在の.NetFramework上ではC#やVisualBasic、C++などの異なるプログラミング言語で記述したプログラムがx86 CPUだろうが、x64だろうが、ARMだろうが異なるCPUであっても共通の動作をします。 例えばWPFなどでアプリケーションで作ったアプリケーション(exe)が64bitのWindowsだろうが、32bitのWindowsだろうが関係なく共通の動作をするあたりなどがそうです。 僕みたいな初めて作ったWindowsのプログラミング環境が.Netアプリケーションで、CPUアーキテクチャをあまり理解していない場合、これらのことは一見普通のことに見えますが実際にCPUのアーキテクチャを考えるとものすごく不思議なことでもあります。 CPUの基本的なアーキテクチャ 室蘭工業大学さんのサイトからCPUアーキテクチャの図をお借りすると、計算機は基本的にこのような構造になっています。 http://par.mcr.muroran-it.ac.jp/~ohkama/2010comp2/lec2/lec2/node50.html 大学の授業などでCPUアーキテクチャを学んだ方はこの図でどのようにデータが流れ、どのように計算が行われるかが理解できるはずです。 ではCPUごとに違う動作をするのはどこかというと、バスを流れるデータのbit数が一番顕著だと私は考えます。 例えば32bitCPUの場合メモリ上には32桁のデータが並び、CPU1クロックでバスを通って処理されるデータのbit数は32bitです。 対して64bitCPUの場合はメモリ上には64桁のデータが並び、CPU1クロックで64bitのデータがバスを通ります。 1クロックで処理されるデータが違うということはデータ内であらわされるデータの意味も変わります。例えば計算する命令をあらわすOPコードなどはCPUによって変わります。*1 ではプログラムのコンパイル結果であるバイナリデータはどのようになっているかというと、2bitデータの羅列となっているため、これを異なるCPU間で統一することはできません。 なので基本的には、32bitCPUなら32bit用、64bitCPUなら64bitCPU用にバイナリデータをコンパイルし、別々のプログラムとして存在させます。 Common Language Runtime ではなぜ現在の.Netアプリケーションは異なるCPU上でも共通の動作をするかというとそれはCLRのおかげであると言えます。 .Net上のアプリケーションはC#やVB、C++などの異なるプログラミング言語で記述されたプログラムを、バイナリではなく中間言語(IL)と呼ばれるものに一旦コンパイルします。 なので.Netで作られたexeはこの中間言語が記述されていて、中間言語はILSpyなどのアプリケーションで見ることができます。 そしてコンパイルされたexe(中身はIL)は、ダブルクリックなどで実行されたとき、CPU上でプログラムとして動いている仮想的なCPUの上で動作します。 この仮想CPUは32bit CPUや64bit CPUなど、異なるCPUの上に共通に乗っているCPUであり、それぞれのCPUの命令に合わせた動きをします。 つまりこのように中間言語と仮想CPUを用いることによってプログラミング言語間の差異と、CPU間の差異を吸収したものをランタイムといい、.NetFramework上で実現されるランタイムをCLR(Common Language Runtime)と呼びます。 このような基盤があるおかげで、C++で書いた.Netなライブラリ(dll)がC#から利用できたりなどが実現できています。 CLR上で実現されるアプリケーションは中間言語を実行時に変換しながら仮想CPUで動かすため、一般的にネイティブコンパイル(中間言語ではなくバイナリにコンパイル)されたアプリケーションより動作が遅いとされています。 CLR登場前のCPU差異吸収方法 さて、ではこのようなCPUやプログラミング言語の差異を吸収してくれるランタイムが登場する以前ではどのようにしてプログラムの共通化を行っていたのでしょうか。 その答えとして、MicrosoftはComponent Object Modelというアーキテクチャを提案していたわけです。 COMとはCPUなどから独立したプログラム部品といえますが、このように足し算を行うプログラムという部品を異なるCPUやコンパイラから使えるようにした部品という感じです。 とにかくこのころは、ソフトウエアの再利用を目的として、異なる実行環境でも依存せずに動くコンポーネント(部品)をつくることで共通化を行っていたようです。 このような仕組みをしっかりとつくったおかげで、いまだに.NetなアプリケーションからCOMでできたオブジェクトを参照できるというわけですね。 ではどのようにして異なるCPUにおいても共通の動作をする部品をつくるかというと、COMではこのように共通のインターフェースを提供することでCPUごとの差異を吸収しています。 COMはCPUの差異以外にも、コンパイラの違いによる差異(gccとvc++など)、プログラミング言語による差異(CとC++)などもインターフェースを提供することで共通化することができます。*2   しかしただ単にインターフェースを提供するだけで差異を吸収できるかと言ったらそんなうまい話はなく、そこにはさまざまな問題が存在します。   メソッド呼び出しの問題 – メソッド特定方法 例えば先ほどの例で、足し算を行うメソッドを共通化しようと思うと、さまざまな問題が生じます。…

【Cocos2dx UWP入門】空のシーンを作る

最初に読み込まれるシーンを変える 新しく作ったCocos2dxのプロジェクトではHelloWorldSceneというシーンを読み込んでいます。 プロジェクトでは Appクラス(エントリポイント)→OpenGLESPageクラス(ページ)→Cocos2dRendererクラス→AppDelegateクラス→HelloWorldSceneクラス(シーン) という順番でHelloWorldSceneクラスが呼び出されています。   つまり、最初に読み込まれるシーンを変えるには新しくシーンクラスを作成し、AppDelegateクラスで呼び出せばいいことになります。 空のシーンを作る Classesフォルダ内に新しくファイルを追加します。 TestSceneの.hと.cppを作ります。 TestScene.hの中身をこのようにします。 #pragma once #include “cocos2d.h” using namespace cocos2d; class TestScene : public Layer { public: static Scene* createScene(); bool init(); }; TestScene.cppの中身をこのようにします。 #include “TestScene.h” Scene* TestScene::createScene() { auto scene = Scene::create(); auto layer = TestScene::create(); scene->addChild(layer); return scene; } bool TestScene::init() { if (!Layer::init()) {…

【Cocos2dx UWP入門】環境構築

Pythonインストール cocos2dxのセットアップにはpythonのインストールが必要になります。  にアクセスしてPython2.7.*をダウンロードします。 Python3.5.*では2015/12/24時点でセットアップに失敗しました。 ダウンロードしたpython-2.7.*.msiを実行します。 インストールが完了したらシステムの環境変数に C:\Python27 C:\Python27\Scripts を追加します。 powershellからpythonコマンドを実行できればOKです。 > python Cocos2dxのインストール  からCocos-2dxをダウンロードします。 ダウンロードしたcocos2d-x-*ファイルを解凍しカレントディレクトリをそのフォルダに移動します。 > cd C:\Users\garicchi\Desktop\cocos2d-x-3.9 setup.pyを実行します。 > python ./setup.py 実行中はすべてEnterを押してOK powershellを再起動してcocosコマンドが実行できればOKです。 > cocos 新しく空のプロジェクトを作る プロジェクトを作りたいディレクトリに移動します。 > cd ~/Desktop cocos new コマンドを実行します。 > cocos new {プロジェクト名} -p {プロジェクトID} -l cpp -d {プロジェクトディレクトリ} 実行例 > cocos new TestGame1 -p com.garicchi.testgame1 -l cpp -d TestGame1…

Cortanaに論文を書いてもらいたい

年末になりましたね。 みなさんそろそろ卒業研究の実験結果を集計し、論文をかいているころではないでしょうか。 しかし卒論執筆は非常にめんどくさいです。おそらくめんどくさすぎて書き始めることすらできていない方も多いのではないでしょうか。 そこでこの間リリースした俺の秘書育成計画アプリを使ってCortanaに論文執筆してもらいたいと思います。 Cortanaさんに頼んだ結果↓ なんと!!!IPSJ(情報処理学会)の論文テンプレートを落としてきてくれました!!!Cortanaありがとう!!ありがとうCortana!!     ネタバレ 俺の秘書育成計画アプリで以下のコマンドを実行するスクリプト実行状態を作ればOKです Invoke-WebRequest -Uri “https://www.gakkai-web.net/gakkai/ipsj/template/ipsjguide.doc” -OutFile “template.doc” ./template.doc