Windows Bridge for iOS (Project Islandwood) を使ってみた

Windows Bridge for iOS を使ってみた

Windows Bridge for iOS とは

Project Islandwood という呼び名で build 2015 の中で発表された、Objective-C のコードから Windows アプリケーションをビルドするというもの。

準備

サンプルコードのビルド

では実際に 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プリプロジェクトを持ってきてビルドしてみる予定。

手順はこちら

現状未サポートのもの

  1. Autolayout
  2. Storyboard support
  3. MapKit
  4. AssetsLibrary
  5. AddressBook
  6. Ads
  7. Objective-C annotations
  8. Media Capture and Playback
  9. ARM support (x86 only today)
  10. 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

特にはまることもなく無事に起動できました。

マウスは認識してくれたけどキーボードはダメみたい。

f:id:kfurue:20150502100609j:plain

設定アイコンからネットワークの設定とかができて、電源アイコンから電源がきれます。

そ、それだけ。。?

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アプリ開発ツールの選択がいるとかいらないとか(インストール後でも、インストーラをもう一度起動して「変更」を選べば追加可能ぽいです)。

f:id:kfurue:20150506223906p:plain

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」でステータスやら確認できます。

f:id:kfurue:20150506223859p:plain

が、ブラウザから 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 に変更する必要がありました。

f:id:kfurue:20150506223902p:plain

それ以外は上記リンク先の通りに進めれば 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 環境構築

対応機器は持っていないので下記を使用させてもらった。

KhaosT/HAP-NodeJS · GitHub

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 上に公開されているものもあるらしい。

KhaosT/HomeKit-Demo · 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.

動いた動いた。