2017/10/29に東北大学キャンパスで開催された仙台IT文化祭の登壇資料を公開しました。
.NET Conf FUKUOKAでLTしてきました。
直前のDockerハンズオンで、Hyper-V有効化にして再起動せずにDockerいれてから再起動したらブートできなくなるという罠にはまったりもしましたが、なんとかLTしてきました。
帰りは機材故障で予約していた便がキャンセルになりましたが、懇親会申し込みし忘れて寂しく早めに空港に行ったので無事に1つ前の便に座席を確保できて帰ってこれるという「世の中の幸せと不幸せはバランスがとれている」説を支持したいような1日でした。
音声認識の仕組みやこれから進んでほしい未来についてお話します。
Visual Studio + Unity + MixedRealityToolkit 2017年10月15日現在のベストマッチ
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)の
組み合わせでもうまく動いてくれるようになりました。
本日時点での動作確認できた最新の組み合わせは以下の通り。
- Visual Studio 2017 15.3.5
- Unity 2017.1.2f1
- MRTK-Unity for Unity 2017.1.2f1
ご参考まで。
HoloLensとPCのWindows 10のバージョン
2017/10/13現在のHoloLensとPCのWindows 10のバージョンのメモとなります。
HoloLens
Windows 10 version 1607 build 10.0.14393 (Windows 10 Anniversary Edition)
PC
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
Windows 10 SDK 10586 (November Update)
System.Net.WebSocketsはWindows 7では動かない
時々忘れがちになるのでまとめておきますね。
System.Net.WebSocketsはWindows 7では動かない
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に対応していないからです。
Windwos 7のメインストリームサポートは終了しています
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 8以降かどうかをチェックする
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で判断しますので、その点だけ注意しましょう。