ぷろじぇくと、みすじら。

まどすた

Created at:

まどすた #1 ~ //build/ 2016 振り返りというイベントが5月21日にありまして、
Microsoft Edgeのセッションをさせていただきました。

元々Windows Insider MeetupというイベントのLT(15分)の資料を元に、
30分という枠に向けて加筆修正を加えデモを中心としていくつか機能を紹介しました。

特にEdge上でのWindows HelloのデモはWindows Insider Meetupの際にも、
MSの方も初めて見たといっていたので多分日本でデモしたのはそれと今回ぐらいだと思います(エヘン。Edgeで体験できるデモサイトも公開しているので興味のある方はお試しください。

Cutting Edge! - Speaker Deck

ASP.NET CoreをBash on Windowsで起動する

ところでEdgeと関係なく、デモサイトはASP.NET Coreで実装したのですが、折角なのでLinuxで動かしてみよう→
とはいえLinuxでサーバー立ち上げるのめんどくさい…→ここにBash on Windowsがあるじゃろ?ということで”ASP.NET Core for Linux on Bash on Windows”でデモしました(ちなみに使っていたのはbashではなくzshです)。

さすがにそのままでは動かないのですがほどほど簡単に動かせます。動かすための手順はデモの時には触れなかったので少し書いておきます。

まず普通にBash on Windows上で.NET CoreのLinux、Ubuntuでのインストール手順を参考にそのままコピペしてインストールします。

するとdotnetコマンドを実行できるようになりますが、そのままではまだ動作しません。どうも何かのシステムコールでサポートしていないフラグを使っているようです(詳しいことは忘れました)。
そこで以下のコマンドを実行します。

apt-get install execstack # 入ってなければ
execstack -c /usr/share/dotnet/shared/Microsoft.NETCore.App/1.0.0-rc2-3002702/libcoreclr.so

さてこれでdotnetコマンドが動くようになります。試しに dotnet init と dotnet restore 、dotnet run を実行するとちゃんと動くことに驚くかもしれません。

ではASP.NET Coreのアプリケーションも?と思い、dotnet restore と dotnet run を実行するとサーバー(Kestrel)が起動しますが、LISTENはしているものの接続できない状態になります。
ネットワーク周りなのかlibuv周りなのかそのあたりがうまく動作しないようです。

そこで Program.cs を開いて WebHostBuilder で UseKestrel にオプションを渡すよう以下のように修正します。

var host = new WebHostBuilder() 
.UseKestrel(options =>
{
options.ThreadCount = 1; // この設定を足す
})
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.Build();

これで dotnet run を実行するとアプリケーションを起動できます。キセキっぽさがありますけど…。

ちょっと手を加える必要がありますがUbuntu向けのCoreCLR、ASP.NET Coreが動作してしまうというのはかなり驚きです。
手軽にLinux環境を用意して色々なものを実行できるBash on Windowsは現状でもすごいのでもっと実装が良くなってくるのが期待できます。

XamarinでもAndroid TVアプリが作りたい

Created at:

XamarinがついにVisual Studioの一部となって、Visual Studio利用者であれば追加コストなしで使えるようになりました。Starterではなくてサイズ制限のないフル機能を使えるのでまともな開発ができます。

Xamarinの良し悪しや意義とかは置いておくとして、Androidアプリの開発ができるということはAndroid TVのアプリも作れるということなのでデバッグ実行するまでの流れを試してみました。SonyのBRAVIA(2015)での手順ですがBRAVIA以外のAndroid TV(Nexus Playerなど)でも大体同じ流れだと思います。

動かすアプリはXamarinのデフォルトテンプレートで出来るもの(ボタンを押すとカウントが増えるもの)をそのまま使うことにします。

テレビ(Android TV)側の設定と接続

まずはテレビ側でデバッグをできるように設定します。と言ってもほぼ普通のAndroidと同じです。

  1. 設定から端末情報→ビルドの項目を連打して開発者向けオプションを有効にする
  2. システム機能設定カテゴリの開発者向けオプション→デバッグ→ADBデバッグを「入」

Get started | Sony Developer Worldにも詳しく書いてあります。

つぎにコンピューターからadbコマンドからテレビに接続します。
なお、adbコマンドはXamarin.Androidとともにインストールされたものは%LOCALAPPDATA%\Android\android-sdk\platform-toolsにあります。

adb kill-server
adb start-server
adb connect <IPアドレス>

この adb connect に指定するIPアドレスはテレビのIPアドレスです。ネットワーク設定あたりから確認できます。

C:\Users\Tomoyo\AppData\Local\Android\android-sdk\platform-tools>adb connect 192.168.1.100
connected to 192.168.1.100:5555

コマンドが成功するとコンピューター側には何も出ませんが、テレビ側にUSBデバッグの許可を求めるダイアログが出るのでOKを押してください。

テレビ側で許可をして adb devices で接続したIPのデバイスが出てくれば完了です。

C:\Users\Tomoyo\AppData\Local\Android\android-sdk\platform-tools>adb devices
List of devices attached
192.168.1.100:5555 device
emulator-5554 device

後はVisual Studioのデバッグ実行ボタンにターゲットとしてテレビが出てくるのでクリックするとテレビにアプリがデプロイされてデバッグ実行されます。なお、初回時は共有ライブラリをインストールするのでちょっと時間がかかります。

スクリーンショット: Visual Studio 2015のツールバーから起動

アプリケーションをAndroid TV対応にする

アプリケーションをテンプレートから作ったままだと、Android TV感のない単なるAndroidアプリになる上にホーム画面にも出てこない状態ですので少々対応が必要です。

スクリーンショット: アプリ画面

まず、Android TVの機能を含むライブラリ(v17 Leanback Library)やテーマを使えるように、Xamarin Components StoreからAndroid Support Library V17 Leanbackをインストールします。このコンポーネントをダウンロードするにはXamarinアカウントが必要です。

ちなみにAPI中でLeanbackという言葉が出てきたらそれはAndroid TV的なものを指しています。

そして次にアクティビティにテーマを設定します。
アプリケーションに一括でAndroid TV向けテーマを適用する場合にはAndroidManifest.xmlのapplication要素にtheme属性を追加します。

<application android:label="App17" android:theme="@style/Theme.Leanback"></application>

もしアクティビティ単位で適用したいのであれば、アクティビティのクラスについているActivityカスタム属性のThemeプロパティを設定します。

[Activity(Label = "App17", MainLauncher = true, Icon = "@drawable/icon", Theme = "@style/Theme.Leanback")]

これでタイトルバーが消えたり、ボタンがフラットになったりと見た目がAndroid TV向けっぽくなります。

スクリーンショット: アプリ画面

次にホームにアプリケーションを起動するアイコンというかタイルというかを表示するためのコードを追加します。Android TV向けのアプリケーションはホームから起動できるということを明示的に設定する必要があり、何も指定しないと表示されません。

設定は起動対象としたいアクティビティ、大抵はActivityカスタム属性のMainLauncherプロパティがtrueになっているアクティビティにIntentFilterカスタム属性を追加します。

[Activity(Label = "App17", MainLauncher = true, Icon = "@drawable/icon")]
[IntentFilter(new[] { Intent.ActionMain }, Categories = new[] { Intent.CategoryLeanbackLauncher })]
public class MainActivity : Activity
{
...
}

IntentFilterでカテゴリがCategoryLeanbackLauncherのActionMainを捕まえられるようにするという感じです。

これでホームにアイコンが出てくるようになります。

スクリーンショット: ホーム

ということで準備はできたのであとは頑張ってアプリを作るだけです。

Visual StudioでF5を押すとテレビにアプリを転送、起動してブレークポイントでブレークできるというのはなかなか面白い体験です。そもそもテレビにadbで接続してshellを叩けるという時点で不思議体験でもあります。

ぜひ皆さま、Android TVを買ってC#で開発しましょうということでたまにはアフィリエイトおいておきますね。

ソニー 地上・BS・110度CSデジタルハイビジョン液晶テレビ BRAVIA X8500C 55V型 KJ-55X8500C