2017/11/20(月)に品川で音声認識についてお話します。
平日夜ですが、GoogleさんやGateBoxさんもきます(現状、日本展開がまだなAmazon関連はないのですが)。ぜひ、ご参加ください。
HoloLensで動作するMRアプリを作成するときは、Visual StudioとUnityを使いますが、さらにMixedRealityToolkit-Unity (旧HoloToolkit-Unity)も使うとアプリがつくりやすいです。
しかし、現在、いろいろなものが過渡期で安定する環境というのが日々新しくなっています。
この前までは、Visual Studio 2015 Update 3 + Unity 5.6とかでしたが、最近やっと、Visual Studio 2017 + Unity 2017 + MixedRealityTooklit-Unity(以下、MRTK)の
組み合わせでもうまく動いてくれるようになりました。
本日時点での動作確認できた最新の組み合わせは以下の通り。
ご参考まで。
2017/10/13現在のHoloLensとPCのWindows 10のバージョンのメモとなります。
Windows 10 version 1607 build 10.0.14393 (Windows 10 Anniversary Edition)
Windows 10 version 1709 build 10.0.16299 (Insider Preview : Fall Creators Update)
Windows 10 version 1703 build 10.0.15063 (Windows 10 Creators Update)
Windows 10 version 1607 build 10.0.14393 (Windows 10 Anniversary Edition)
Windows 10 SDK 10586 (November Update)
時々忘れがちになるのでまとめておきますね。
System.Net.WebSocketsを使ってWebSocketクライアントを作成したとき、Windows 8/8.1やWindows 10では問題なく稼働しますがWindows 7では実行時エラーで異常終了します。
これは
https://msdn.microsoft.com/ja-jp/library/system.net.websockets.websocket.aspx
-------引用開始
一部のクラスで、 System.Net.WebSockets 名前空間は、Windows 7、Windows Vista SP2、および Windows Server 2008 でサポートされます。 ただし、クライアントとサーバー Websocket の唯一のパブリックの実装では、Windows 8 および Windows Server 2012となります。
-------引用終了
と注意書きがあるように、定義はあるけれどWindows 8以降じゃないと実装が伴っていないところがあるからです。
なぜ、こんなことがあるかといえば、Windowsのカーネルモードドライバであるhttp.sysを直接利用することでHTTP周りのオーバーヘッドを少なくしているのですが、Windows 7のhttp.sysがWebSocketに対応していないからです。
https://www.microsoft.com/ja-jp/atlife/article/windows10-portal/eos.aspx
みんな大好きWindows 7は2009年10月22日にライフサイクルがスタートして2015年1月13日にメインストリームサポートが終了しています。延長サポートの終了こそ2020年1月14日ということでまだ先ですが、延長サポート期間である現在はセキュリティ更新はおこなわれますが、仕様変更や新機能のリクエストはサポート対象外となり、これからWindows 7のHTTP.sysにWebSocket実装が追加されることはほぼないと考えてよいでしょう。
一つの解決策としては、HTTP.sysを使わないWebSocket実装のコードを書く、もしくは、HTTP.sysを使っていないライブラリをNuGetで探してくるというものがあります。
https://github.com/kerryjiang/WebSocket4Net
https://github.com/sta/websocket-sharp
NuGetでライブラリを探すときは、企業ユースを考えるならばSystem.Net.WebSocketsならば対応している認証PROXYがサポートされているかなどのチェックを十分に行う必要があるでしょう。なお、残念ながら上記2つについてもまだきっちり調べ終わっていません。
しかし、System.Net.WebSocketsであればHTTP.sysを使って「オーバーヘッドが少ない」=「性能がよいことが期待される」なのにWindwos 7をサポートすることでその利点を得られないという問題が生じてしまいます。
対象となる機能がWindows 7でも使えないといけないのか、もしくは、対象となる利用者がWindows 7をどれくらい使っているのかを見極めて判断するといいでしょう。
企業でもWindows 7からWindows 8.1やWindows 10への置き換え(少なくとも新規導入は8.1か10がデフォルト)が始まっている時期なので悩ましいところですね。
Windows 7のときにはWebSocketを使った機能をdisableしたいときなどは、OSのバージョンチェックが必要になってきます。
対象はWPFとかWindowsフォームのときで、UWPやXamarin.Android、Xamarin.iOSのときは対象環境で動かないということはないのでチェックは不要です。
ですので実装時は
#if WPF
#endif
のようにifディレクティブを定義してその中でOSバージョンのメジャーバージョンとマイナーバージョンを取得してチェックします。
var searcher = new System.Management.ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem"); var os = searcher.Get().Cast().FirstOrDefault(); var major = 6; var minor = 1; if ((os != null) && (os["OsType"] != null) && (os["Version"] != null)) { if (os["OsType"].ToString() == "18") { major = new System.Version(os["Version"].ToString()).Major; minor = new System.Version(os["Version"].ToString()).Minor; } }
Windows 10以上はmajor >= 10でよいのですが、Windows 8.xは、major == 6 && minor >= 2で判断しますので、その点だけ注意しましょう。
一般の方にはもしかしたらなじみがなく、また、仕事道具を動かすプラットフォームとしてWindowsを使っている人にも縁がないものに、Insider Previewがあります。
あくまでも「いまつくっている最中のバージョンを様々な環境でまずはつかってもらおう」というものです。
一般公開前ですから品質的に問題があったり致命的なバグがあったりも覚悟しつつ、アプリ開発していたり、OSそのものの新しい機能をいち早くためしたいという人がちょっとだけ未来に一般公開されるバージョンを試せるものということです。
Insider Previewのリリース間隔がみじかくなってくると、秋に公開されるというFall Creators updateもそろそろなの?みたいな感覚が味わえるのもいい点ですね。
もちろん、品質や日本語訳の変な点をどんどんフィードバックするのもInsider Preview参加者の役目の1つだったりします。
16294でなにがかわったかといえば以下のような点。変わったというよりもほぼバグフィックス。
これをみて思うのは新機能の追加というよりも特定条件下で発生する問題の解決が多く、チューニングと汎用化の最終的な匙加減にはいてきたのかなって点。
よく「これくらいのバグをみつけられずにだしてくるのか?」なんて感想がブログで見受けられるけど、これ、なかなか面倒ですよね。対象ハードを絞れるといいだろうけれど。
あと、どうしてInsider Previewなのに「マイクロソフトも」みたいな感じで人格攻撃しちゃう人がいるのかはいつも不思議だったりします。問題点をかばう必要はないけど。きっと身近な人が失敗すると「だからお前はダメなんだ!」みたいな怒り方をしてそうですよね。
ソースコードを公開せずに多人数でHoloLensアプリを作るときは、「Visual Studio Team Services」などで非公開でやっていくとよいと感じです。
ちょっとしたサンプルコードならば、gistなどもいいでしょう。
サンプルプロジェクトを公開するならgithubがやっぱり一番よさそうです。
HoloLensアプリを公開するときはUnityプロジェクトとUWPプロジェクトでそれぞれ別の.gitignoreファイルを置けると便利です。
そこで次のようなフォルダ構造を作成し、UnityプロジェクトフォルダとVisualStudioソリューションフォルダにそれぞれに適した.gitignoreファイルを置きましょう。
[アプリ名フォルダ]
+[Unityプロジェクトフォルダ]
+assets
|unityファイル
+UWP
|VisualStudioソリューションファイル
+[プロジェクトフォルダ]
このフォルダの作り方やその他の詳細はHoloLensアプリ作成時の共通作業(2017年9月編)を参照してください。
新規にリポジトリを作るときに下の方に[.gitignore]ドロップダウンリストがあるので、そこで「Unity」を選択して「アプリ名フォルダ」と同じ名前でリポジトリを作成します。
Unityを指定したときの.gitignoreファイルの内容は次のようになります。
--
/[Ll]ibrary/
/[Tt]emp/
/[Oo]bj/
/[Bb]uild/
/[Bb]uilds/
/Assets/AssetStoreTools*
# Visual Studio 2015 cache directory
/.vs/
# Autogenerated VS/MD/Consulo solution and project files
ExportedObj/
.consulo/
*.csproj
*.unityproj
*.sln
*.suo
*.tmp
*.user
*.userprefs
*.pidb
*.booproj
*.svd
*.pdb
# Unity3D generated meta files
*.pidb.meta
# Unity3D Generated File On Crash Reports
sysinfo.txt
# Builds
*.apk
*.unitypackage
--
リポジトリができたならば、ローカル(自分のPC)にリポジトリをクローンします。
このとき、すでにサンプルプロジェクトを作ってしまっていたならば、作成済のサンプルプロジェクトのアプリ名フォルダをリネームしておきます。そして、その場所を指定してクローンします。
ローカルドライブにフォルダが作成できならば、このフォルダを「アプリ名フォルダ」としてHoloLensアプリのプロジェクトを作成します。
あらかじめ作成してありリネームしてあるならば、そのフォルダの中身を移動してきます。
クローン下フォルダに移動するだけでローカル側の変更として検知されます。ここで、.gitignoreファイルをUnityプロジェクトフォルダに移動します。
今回はUWP側はUnityから自動生成すればいいのでUWPフォルダを丸ごと削除します。
UWP側でも独自のコードを書いているのであれば、UWPファイルだには次のような.gitigoneファイルを配置します。
--
#ignore thumbnails created by windows
Thumbs.db
#Ignore files build by Visual Studio
*.obj
*.exe
*.pdb
*.user
*.aps
*.pch
*.vspscc
*_i.c
*_p.c
*.ncb
*.suo
*.tlb
*.tlh
*.bak
*.cache
*.ilk
*.log
*.dll
*.lib
*.sbr
*.msi
*.appx
obj/
bin/
TestResults/
AppPackages/
BundleArtifacts/
packages/
UpgradeLog*.*
--
公開するコードがすべて格納出来たら、コミットを行い、プッシュします。
github上のUnityプロジェクトフォルダを見てみる次のようになります。
これでコードを公開できました。