Windows Bridge for iOS (Project Islandwood) を使ってみた
Windows Bridge for iOS を使ってみた
Windows Bridge for iOS とは
Project Islandwood という呼び名で build 2015 の中で発表された、Objective-C のコードから Windows アプリケーションをビルドするというもの。
準備
- windows 10 の PC
Visual Studio 2015
- ダウンロード | Visual Studio
- インストール時に選択必須のコンポーネントは下記のとおり
- Programming Languages -> Visual C++
- Universal Windows App Development Tools (all)
- Windows 8.1 and Windows Phone 8.0/8.1 Tools (all)
-
- Releases · Microsoft/WinObjC · GitHub
- 上記から winobjc.zip の最新版(本記事執筆時0.1 Preview (September 17, 2015) )をダウンロード
- 特にインストール等は不要で、zip ファイルを解凍すれば OK
- Releases · Microsoft/WinObjC · GitHub
サンプルコードのビルド
では実際に iOS アプリケーションのプロジェクトを Windows 向けにビルドしてみましょう。
手順
- winobjc.zip を解凍
- winobjc/samples/WOCCatalog 以下にある WOCCatalog-WinStore10.sln をダブルクリックし、Visual Studio 2015 で開く
- Security Warning とか表示されますが、信頼できるものなのでそのまま OK をクリックします。
- 右側の Solution Explorer から WOCCatalog (Universal Windows) を右クリックし、Set as StartUp project を選択
- Ctrl-F5 でビルドが走り、実行されます。
ハマりポイント
'WOCStdlib.h' file not found
というエラーが出てしばらくハマりました。
どうやら winobjc.zip を解凍した時にできるフォルダ名をデフォルトの winobjc から別のものに変更しているとこのエラーになるようです。
フォルダ名を winobjc にすることで無事にビルドが通りました。
触ってみる
UI カタログということで、いろいろなUIパーツの操作感を試すことができる。
確かに一通りのパーツは使えそうな気がしてくる。
Xcode プロジェクトのインポート
サンプルは動かせたので、次は実際に Xcode で作成した iOS アプリプロジェクトを持ってきてビルドしてみる予定。
手順はこちら
現状未サポートのもの
- Autolayout
- Storyboard support
- MapKit
- AssetsLibrary
- AddressBook
- Ads
- Objective-C annotations
- Media Capture and Playback
- ARM support (x86 only today)
- Compiler optimizations will not work and will likely crash clang, debug builds only
感想
実用に耐えられるかどうかはさておき、取り組みとしてはかなり面白いです。
今後のサポートの広がりに注目していきたいと思います。
Windows 10 IoT Core を Raspberry Pi 2 にインストールする
Raspberry Pi 2 で Windows アプリを動かす
Build 2015 は面白そうな発表が盛りだくさんでした。
Android, iOS アプリ開発者の方々も興奮し切りではないかと思います。
さて、その中でも私が特に惹かれたのが Raspberry Pi 2 向け Windows の公開です。
何を隠そう Raspberry Pi B+ の購入から間もない内に発表された Raspberry Pi 2を完全に買い渋っていた私の背中を押したのがマイクロソフトによる「Raspberry Pi 2 向け Windows 10 出しちゃうよ」発言だったのですから。
Windows 10 TP インストール
下記を使えば Windows 10 がなくてもRaspberry Pi 向け Windows はインストール可能だそうです。
https://msdn.microsoft.com/ja-jp/windows/hardware/dn913721.aspx
そんなこととはつゆ知らず、Raspberry Pi 2 に Windows をインストール(SDカードへの焼きこみ)には Windows 10 TP が必要だと思い込みまずインストール。
VM, 手持ちの Windows マシンとのデュアルブートどちらでもSDカードへの焼きこみは可能です。
Windows 10 TP のディスクイメージは下記から取得できます。
http://windows.microsoft.com/ja-jp/windows/preview-iso
VirtualBox 使用
下記なんかを参考に、特にはまりポイントはなかったはず。
http://www.lancork.net/2014/10/windows-10-technical-preview-oracle-vm-virtualbox/
VirtualBox の設定で USB 機器を設定する。
http://qiita.com/civic/items/684c4b82428feb0c4ae1
SD カード(リーダーライター)がゲストの Windows 10 から見えれば OK。
デュアルブート
私は Windows 7 PC をデュアルブートにしました。
Windows 7 のパーティション縮小は「ディスクの管理」からではサイズ制限があってうまくいかないとか、8 の時にはまったやつをすっかり忘れていました。
下記を使用して Windows 10 用のディスク領域を確保。
http://gigazine.net/news/20101118_Easeus_Partition_Manager/
Windows 10 インストール用 USB フラッシュメモリ作成
Windows マシンをお持ちなら WUDT が簡単です。
http://www.atmarkit.co.jp/ait/articles/0912/18/news110.html
あとは BIOS から起動順序を変更し、作成した USB フラッシュメモリから起動してください。
インストール先には先ほど確保したディスク領域を選ぶのを忘れないように。
Raspberry Pi 2 への Windows インストール
基本、下記に沿って進めます。
http://ms-iot.github.io/content/GetStarted.htm
しっかりしたドキュメントで安心感があります。
Windows 10 IoT Core Insider Preview の入手
下記からダウンロードします。
https://connect.microsoft.com/windowsembeddedIoT/Downloads/DownloadDetails.aspx?DownloadID=57782
諸々の登録やらアンケート、規約への同意を必要に応じて行ってください。
micro SD カードへの焼きこみ
下記の通りで問題なかったです。
http://ms-iot.github.io/content/win10/SetupRPI.htm
特にはまることもなく無事に起動できました。
マウスは認識してくれたけどキーボードはダメみたい。
設定アイコンからネットワークの設定とかができて、電源アイコンから電源がきれます。
そ、それだけ。。?
Visual Studio 2015 RC インストール
気を取り直して、Windows_IoT_Core_RPI2_BUILD.zip を解凍すると、中に WindowsDeveloperProgramForIoT.msi が入っています。
これを Windows 10 TP 側にインストールすると、Windows 入り Raspberry Pi を操作できるらしいのでインストール、と思ったら Visual Studio が無いとあきまへんだそうです。
どうせなら Build で発表のあった新機能も使ってみたいので 2015 RC をインストール。
https://www.visualstudio.com/en-us/downloads/visual-studio-2015-downloads-vs.aspx
インストール時に、ユニバーサルWindowsアプリ開発ツールの選択がいるとかいらないとか(インストール後でも、インストーラをもう一度起動して「変更」を選べば追加可能ぽいです)。
WindowsIoTCoreWatcher のインストール
これでやっと watcher アプリがインストールできます。
WindowsDeveloperProgramForIoT.msi を選択すれば普通にインストールできますが、そのままでは起動できません(64bit環境だけ?)。
https://connect.microsoft.com/windowsembeddedIoT/Feedback/Details/1295993
ということで Developer Command Prompt for VS2015(日本語環境の場合は「開発者コマンド プロンプト for VS2015」) を管理者権限で起動し、下記を実行。
sn -Vr "C:\Program Files (x86)\Microsoft IoT\WindowsIoTCoreWatcher.exe" corflags "C:\Program Files (x86)\Microsoft IoT\WindowsIoTCoreWatcher.exe" /32BIT+ /FORCE
これで watcher なるものが起動できます。
Raspberry Pi 2 + Windows 10 IoT Core のマシン名や IP アドレスが見れます。
こ、これだけ。。。?
対象の Raspberry Pi を右クリックで「Web Browser Here」でステータスやら確認できます。
が、ブラウザから Raspberry Pi の IP アドレスを指定してやれば同じ画面が見れます。
watcher、無理に使わなくてもいいかもしれませんね。
Raspberry Pi 2 への PowerShell でのリモート接続
これは下記の通り。
http://ms-iot.github.io/content/win10/samples/PowerShell.htm
はまりポイントなしです。
Raspberry Pi 2 上でのデバッグ実行
下記に沿って進めていくと、Raspberry Pi 2 上でアプリが実行できます。
http://ms-iot.github.io/content/win10/samples/HelloWorld.htm
Windows アプリ初心者だもので、以下のコードを足せとか言われても「え、どこに?」状態でした。
変更後のコードを貼っておきます。
MainPage.xaml
<Page x:Class="App1.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:App1" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center"> <TextBox x:Name="HelloMessage" Text="Hello, World!" Margin="10" IsReadOnly="True"/> <Button x:Name="ClickMe" Content="Click Me!" Margin="10" HorizontalAlignment="Center" Click="ClickMe_Click"/> </StackPanel> </Grid> </Page>
MainPage.xaml.cs
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Runtime.InteropServices.WindowsRuntime; using Windows.Foundation; using Windows.Foundation.Collections; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Controls.Primitives; using Windows.UI.Xaml.Data; using Windows.UI.Xaml.Input; using Windows.UI.Xaml.Media; using Windows.UI.Xaml.Navigation; // The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409 namespace App1 { /// <summary> /// An empty page that can be used on its own or navigated to within a Frame. /// </summary> public sealed partial class MainPage : Page { public MainPage() { this.InitializeComponent(); } private void ClickMe_Click(object sender, RoutedEventArgs e) { this.HelloMessage.Text = "Hello, Windows IoT Core!"; } } }
Default Language 云々で警告がでますが(私の環境だけ?)、マニフェストデザイナーが起動できず修正不可(xml 直接いじれよ)。
実行は可能なので放置。
ソリューション(?)のプロパティから 構成プロパティ→構成 と辿り、プラットフォームを ARM に変更する必要がありました。
それ以外は上記リンク先の通りに進めれば Raspberry Pi の HDMI 出力先モニタ上にアプリのラベルとボタンが表示されます。
雑感
長い道のりでしたが、まぁそのあれです、Raspbian とかで慣れちゃってたのでてっきりデスクトップ的なの動くと思ってたのは私だけではないはず。。
ともあれこれで環境は整いました。IoT × Windows、その未来や如何に。
お次は Visual Studio への iOS アプリ移植でも試してみようかな。(まだハードル高そう)
IRKit と HomeKit と
IRKit がやってきた
IRKit をお借りすることができたのでお触り。
IRKitは、 公式のリモコンアプリ IRKitシンプルリモコン から操作できるほか、 IRKit iOS-SDK を使えば、 任意のタイミングで赤外線信号を送ることのできるiOSアプリを簡単につくることができます。
IRKit - Open Source WiFi Connected Infrared Remote Controller
ということで、赤外線で制御できる機器ならなんでも操作できる。
どうせなら "Hey Siri!" で操作したくなるのが人情(?)。
とりあえず IRKit 単体の動作確認
IRKit 本体に赤外線受信部があり、最後に照射された赤外線パターンは本体にストアされている。
最後にストアした赤外線パターンを取得する API が実装されているのでそこから取得。
赤外線信号送信のための API も用意されているので、そちらに先ほどの方法で取得したパターンを POST する。
先程も紹介した下記サイトの通りに実行していけば難なく家電操作ができた。 特にハマリポイントは無い。
IRKit - Open Source WiFi Connected Infrared Remote Controller
HomeKit 環境構築
対応機器は持っていないので下記を使用させてもらった。
HAP-NodeJS is a Node.js implementation of HomeKit Accessory Server.
ということで、Node.js が動く環境ならどこででも動くぜ、だそう。
Edison 欲しいな。。
とりあえず Mac 上で実行する。
$ git clone https://github.com/KhaosT/HAP-NodeJS.git
$ cd HAP-NodeJS/
$ node Core.js
これで Mac が HomeKit 対応機器として見えるようになる。
HomeKit 対応機器を iPhone に登録するには The HomeKit Framework を使用して機器検索、登録を行う iOS アプリが必要になる。
今回は以前適当に作成していたものを流用したが、同じく Github 上に公開されているものもあるらしい。
使ってないけど。
HAP-Node.JS を実行し、iPhone アプリ側から機器登録を実施。
Siri に向かって「扇風機をつけて」等と話しかけてみて、Siri が機器操作に成功した旨をしゃべり、サーバー側に下記のようなログが流れていれば成功。
Change: true
executed accessory: Fan, and characteristic: Fan Power, with value: true.
IRKit + HomeKit
ここまでくれば、あとは HAP-Node.JS をちょちょいといじって Siri からのパケット受信時に IRKit へのコマンド送信スクリプトを実行する。
IRKit + HomeKit(HAP-Node.JS) from Kazuhiro Furue on Vimeo.
動いた動いた。