macOS high sierra Inkscape 起動しない

inkscape fails to start on macos 10.13. うーん困った。
インクスケープが起動しません。インストール直後の1回だけは起動するのですが、その後起動しなくなります・・・トホホ。
In this case,
そのような場合は、アプリケーション、の「その他」にある「ターミナル」を起動し、
 

/Applications/Inkscape.app/Contents/MacOS/Inkscape

と打ってやると起動するそうです。

inkscape fails to start on macos 10.13 (high sierra) from Inkscape


毎回打ち込むのは面倒なんでオートメーションを使います。

シェルスクリプトに先程のコマンドを打ち込み、デスクトップに保存します。

Cmd+Iで情報を表示します。/Application/Incscape.appを選択し同じようにCmd+Iで情報を表示します。

アイコンをコピーします。

 
これで、デスクトップのIncsapeをクリックすると起動するようになりました。

 
 
以上、macOS High SierraでIncscapeが起動しない時の対処法でした。

Stack Overflowのロゴがかわってる!

いつもお世話になっているStack Overflow。日本語版のStack Overflowも出来ているようですが、利用したことはありません。
いつものように解決方向検索してると、なんか見慣れない感じのロゴが!
http://cdn.sstatic.net/stackoverflow/img/logo-10m.svg?v=fc0904eba1b1
スクリーンショット 2015-09-03 16.35.58
 
あれ、stackoverflowのロゴ変わってるよね
 
 

flooooooow

ってなってるww
よく見るとこんなページが。
スクリーンショット 2015-09-03 16.38.36
1千万を超えたお祝いの特別ロゴだったんですね。よく見るとエルとオーのところに桁区切りのカンマが!
 
 
 

MOVERIO BT-200でhulu見れるようになりました!

BT-200AVにはワイヤレスミラーリングアダプターがついています。これを使えばTVやブルーレイなどHDMI接続対応機器と接続して映画などを楽しむことが出来ます。
これはこれで便利なのですが私はもっぱらhuluでドラマや映画を楽しんでいます。BT-200AVでhuluが見れないか試してみました!
スクリーンショット 2015-09-03 21.37.47
まず、huluのapkをゴニョゴニョして入手しBT-200にインストール。この方法はダメでした。huluアプリのほうで制限がかかっているようです。
ではブラウザ経由はどうか?・・・いけました!その手順です。
まず。Flashをインストールします。Flashは下記URLから取得します。BT-200 はAndroid4.0なのでFlash Player for Android 4.0 archivesを探してインストールします。
https://helpx.adobe.com/flash-player/kb/archived-flash-player-versions.html
次にドルフィンブラウザーのapkをゴニョゴニョして入手しBT-200にインストールします。
ドルフィンブラウザーを起動したら、忘れず「デスクトップモード」に設定して下さい。
これで hulu.jpにアクセスすると・・・はい!ちゃんと視聴できました!
よしよし、明日の出張で新幹線の中でゆっくり見るとしましょう!
 

EPSON MOVERIO BT-200 で最先端のARを試す!

EPSON MOVERIO BT-200でVuforiaが使える様になったとの情報を得たので早速試してみました。
Vuforiaとはスマートフォンなどのチップで有名なQualcomm社によるAR プラットフォームです。
ビューフォリアが何かわからない方は、まずは、こちらをどうぞ。

どうですか?なかなか面白そうでしょう!本日はBT-200でVuforiaを動かしてみます!
まずは、MOVERIOで開発ができるようにしておかなければなりません。MOVERIO Developer Siteに行き、開発者登録しておきます。
次に、下記のページの情報を一通り目を通します。
https://tech.moverio.epson.biz/ja/bt-200/tools.html
開発者用システムソフトウェア適用手順書の手順に従い、BT-200に開発者用システムソフトウェアを導入します。
当方macなのですが、adbでBT-200が認識できていない様子。あきたじゅんさんのブログ
http://nextsphere-blog.blogspot.jp/2014/04/moverio-bt-200-adb.html
の手順通り設定すれば、macでBT-200が認識できる様になりました。ありがとうあきたさん!
次にQualcomm Vuforiaへ行きこちらも開発者登録を行います。
ログイン後、Downloads > Tools より、Vuforia Object Scannerをダウンロードします。ダウンロードしたvuforiaobjectscanner-4-0-103.zipを展開し、PDF「A4-ObjectScanningTarget.pdf」を印刷しておきます。vuforiaobjectscanner-4-0-103.apkをAndroid4.2以上の端末に転送し、インストールして起動します。とここでインストールに失敗。残念ながらBT-200はAndroid4.0と古めのバージョンなのでVuforia Object Scanner使えません。BT-200のカメラでスキャン出来たら格好良かったのですが。
さて、Vuforia Object Scannerは諦め、次にBT-200に対応しているVuforiaのbeta版を試してみましょう。まずはカメラのキャリブレーションから。
方法はhttps://developer.vuforia.com/library/articles/Training/Vuforia-Calibration-App に記載されている通りです。
まずベータ版のページからcalibration-4-1-3-public-beta.zipをダウンロードします。展開してapkをadbでBT-200にインストールします。
キャリブレーションターゲットhttps://developer.vuforia.com/sites/default/files/sample-apps/targets/stones.pdf をダウンロードし、印刷して壁に貼り付けます。
あとはBT-200を装着し、イントールしたCalibrationアプリを起動するとキャリブレーションが始まります。画面の指示に従いキャリブレーションを行います。
次にサンプルの実行方法です。まずVuforia SDK 4.1 Betaよりvuforia-sdk-eyewear-android-4-1-3-beta.zipとvuforia-samples-eyewear-android-4-1-3-beta.zipをダウンロード、展開します。
Android Studioを開き、 File – > Import Project … VuforiaサイトよりダウンロードしてきたサンプルDigitalEyewearVirtualButtons-4-1-3のフォルダを指定してインポートします。
展開したvuforia-sdk-eyewear-android-4-1-3-beta内にあるlibVuforia.soとVuforia.jaをサンプル内にコピーします。
それぞれ下記の様に配置します。
DigitalEyewearVirtualButtons-4-1-3

app
  + libs
    + Vuforia.jar
src
  + jniLibs
    + armeabi-v7a
      + libVuforia.so

 
Vuforia.jarを右クリックしAdd As Libraryを選択して表示されるダイアログでOKを押すと、build.gradelに下記が追加されます。手作業でbuild.gradleに追記しても同じです。

apply plugin: 'com.android.application'
android {
    compileSdkVersion 19
    buildToolsVersion "21.1.2"
    defaultConfig {
        applicationId "com.qualcomm.vuforia.samples.DigitalEyewearVirtualButtons"
        minSdkVersion 14
        targetSdkVersion 18
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }
}
dependencies {
    compile files('libs/Vuforia.jar')
}

これでビルド可能になります。早速実行してみると、ライセンス関係のエラーメッセジが。
Vuforia App key is missing. Please get a vaild key. by logging into your account at developer.vuforia.com and createing a new project.
Screenshot_2015-04-29-18-06-11
ライセンスが必要みたいですね。
https://developer.vuforia.com/library/articles/Training/Vuforia-License-Manager
を参考にライセンスを作成します。
https://developer.vuforia.com/target-manager
にアクセスし「Add License Key」をクリックします。
Application Nameを入力、SDKにDigital Eyewear[BETA]を選択、Next
チェックボックスにチェックを入れConfirmをクリック。
作成されたライセンスキー名をクリックすると、ライセンスキーが表示されます。これをサンプルアプリケーションのSampleApplicationSession.javaの345行目付近、setInitParametersにセットします。

Vuforia.setInitParameters(mActivity, mVuforiaFlags, " your_license_key ");

では実行してみましょう。おっとその前に、ターゲットとなる画像を印刷しておかなければなりません。
https://developer.vuforia.com/sites/default/files/sample-apps/targets/wood.pdf
を印刷しておきます。
では、BT-200でサンプルを実行してください。印刷した木の画像をBT-200でみると、やかんが表示されます。
Red、Blue、Yellow、Greenのボタンを押すと、ケトルの色がかわります!
この感動をお伝えするために、頑張って撮影しました。BT-200にWebカメラを固定し撮影しました。結構大変な撮影でしたが、うまく撮れたかとおもいます。実際には両眼で見る訳ですが、ちゃんと3D映像となっており、ケトルがそこにあるかのようにとても立体的に見えますよ。

いかがでしょうか。VuforiaのARライブラリを使えば、簡単にBT-200でARアプリが作れそうです。VuforiaはAndroidの他にもUnityにも対応しているので、手軽にARを使ったゲーム開発も出来そうです。
次回以降、サンプルソースを解析しながら、オリジナルアプリの作成に挑戦したいと思います。

Glance及び通知

Glance

Glanceの概要

Glanceは重要な情報を表示するための補助的な方法です。全てのアプリがGlanceを必要とするわけではありません。Glanceはタイムリーにすぐに関連する情報を提供します。航空会社のアプリでフライトの搭乗口の情報がGlanceで表示されたり、カレンダーアプリのGlanceは次の会議の情報を表示するかもしれません。次の図はサンンプルアプリ「Lister」のGlanceは、Todoリスト内の完了した項目や残っている項目を表示しています。
サンプルアプリ「Lister」のGlanceインタフェース

glance_lister_2x
出典 https://developer.apple.com/

 
 
GlanceはWatchKitアプリとWatchKit Extensionの一部として提供されます。GlanceのインタフェースはWatchKitアプリのストーリーボードファイル内に存在し、そのインタフェースはカスタムWKInterfaceControllerオブジェクトによって管理されいます。ただし、Glanceのインタフェース・コントローラの唯一の仕事はGlanceのコンテンツをセットすることだけです。Glanceはユーザとの対話インタフェースをサポートせず、Glanceをタップすると自動的にWatcKitアプリを起動するだけです。

Glanceのライフサイクル

Glance インタフェース・コントローラのライフサイクルは、Glanceがすばやく表示されるためにGlance インタフェース・コントローラが早期に初期化されることを除いては、他のインタフェース・コントローラと同じです。初期化からGlanceが表示されるまでの間にどれだけ時間が経過するかは分からないので、表示されている情報が最新であるか確かめるためのチェック処理をwillActivateメソッドに含めることができる。
インタフェース・コントローラ のライフサイクルについては、WatchKit Extension Life Cycleを参照してください。

Glance Interfaceガイドライン

XcodeはGlanceのコンテンツを配置するための固定レイアウトを提供します。コンテンツのためのレイアウトを選択し、次のガイドラインに従いコンテンツを作成してください。

  • すばやく情報を伝えられるようにGlanceを設計する。画面全体にテキストを敷き詰めてはいけません。情報を伝えるために、グラフィック、色、およびアニメーションを適切に使用してください。
  • もっとも重要なデータにフォーカスする。GlanceはWatchKitアプリに変わるものではありません。WatchKitアプリがそれを含むiOSアプリの機能限定版であるのと同様に、GlanceはWatchKtアプリをさらに機能限定版にしたものです。
  • Glanceインタフェースには対話型のコントロールを含めない。対話型のコントロールとしてはボタン、スイッチ、スライダー、メニューを含みます。
  • Glanceインタフェースにはテーブルや地図を避ける。禁止されていないが限られたスペースにはテーブル・地図はあまり有用でない。
  • 表示する情報はタイムリーであるべき。利用者にとって重要な情報を提供するために、時間と場所を含む全ての利用可能なリソースを使用してください。インタフェース・コントローラが初期化されてからユーザーに表示されるまでの間に発生した変更についてGlanceを更新しなければならないことを覚えておいてください。
  • 全てのテキストでシステムフォントを使用すること。Glanceでカスタムフォントを使うためには、画像にテキストを描画してその画像を表示する必要があります。

アプリは1つのGlance インタフェース・コントローラしか持たないので、1つのコントローラーで必要なデータを表示することができなければなりません。

Glanceインタフェースの管理

Xcodeプロジェクトに WatchKitアプリのターゲットを追加する場合、Glanceインタフェースを追加するか選択することができます。最初に追加するのを忘れた場合でも、後からプロジェクトにGlanceを追加することができます。Glanceインタフェースコントローラはアプリケーションのストーリーボードと外観が少し異なります。具体的にはGlanceエントリポイントオブジェクトが接続されており、デフォルトでは次図のように表示されています。

glance_interface_2x
出典 https://developer.apple.com/

 
実行時にGlanceの内容を設定するには、カスタムWKInterfaceControllerサブクラスを使用します。WatchKitアプリで他のインタフェース・コントローラークラスを実装するのと同じ方法でこのサブクラスを実装することができます。

アプリにGlanceインタフェースを追加する

Glanceインタフェースを実装するために必要な関連ファイルを作成するためには、WatchKitアプリのターゲットを作成するときにGlanceシーンオプションを含める必要があります。XcodeはGlanceストーリーボードシーンやカスタムGlanceインタフェース・コントローラークラスを提供します。ターゲットを作成しなかった場合は、手動でプロジェクトを設定してください。
手動でGlanceインタフェースを追加するには

  1. WKInterfaceControllerのサブクラスを作成します。
    新しいソースファイルを作成し、WatchKit エクステンションのターゲットに追加します。サブクラスには「GlanceInterfaceController」のような適切な名前をつけます。
  2. ストーリーボードで、Glanceインタフェース・コントローラーをストーリーボードにドラッグします。
    新しい Glanceインタフェース・コントローラーのシーンは、前の図で示したようなGlanceエントリポイントオブジェクトを持ちます。
  3. Identity Inspectorを開きGlanceインタフェース・コントローラーを選択します。
  4. 手順1で作成したクラスをGlanceインタフェース・コントローラーに設定します。

WatchKitアプリは1つのGlanceインタフェースを持ちます。アプリのストーリーボードに複数のGlanceインタフェース・コントローラーを追加してはいけません。

Glanceインタフェース・コントローラーの実装および更新

Glanceの唯一の仕事はラベルや画像の内容を設定することであるため、Glanceインタフェース・コントローラーの実装は比較的簡単です。

  • ラベルや画像の初期値を設定してGlanceインタフェースを初期化するためにinitとawakeWithContext:を使用します。
  • 画面上に表示される前に必要であればGlanceインタフェースを更新するには、willActivateを使用します。

画面上に表示された後でGlanceのコンテンツを更新するには、NSTimerオブジェクトで定期的な更新の実行を行います。 自動的に更新されるのでWKInterfaceDateとWKInterfaceTimerを更新する必要なありません。

Glanceからのアプリ起動をカスタマイズする

ユーザがGlanceをタップすると対応するWatchKitアプリを起動します。通常はアプリを起動するとメイン・インタフェース・コントローラーを表示します。Glanceからアプリの起動をカスタマイズするには以下の操作を行います。

  • Glanceインタフェース・コントローラー内で
    • initとawakeWithContext:メソッドで普通にGlanceを設定します。
    • ある時点でupdateUserActivity:userInfo:webpageURL:メソッドを呼び出し、アプリにGlanceの状態についての情報を伝えるためにuserInfパラメータを使います。起動時には、アプリは、違ったインタフェース・コントローラを表示するためにそのコンテキストデータを使用することができます。
  • アプリのメイン・インタフェース・コントローラでは
    • handleUserActivity:メソッドを実装します。提供されたuserInfoディクショナリを使用してUIを適切に設定します。

updateUserActivity:userInfo:webpageURL:メソッドの呼び出しはWatchKitアプリに起動時に、メイン・インタフェース・コントローラーの handleUserActivity:メソッドを呼び出すよう指示します。handleUserActivity:の実装では、UIを適切に構成するために提供されたコンテキストデータを使用してください。例えば、ページベースのインタフェースを備えたアプリでは、最初に表示するページを選択するために提供されたデータを使用します。

通知

通知の概要

Apple WatchはiOS上の既存のインタラクティブ・ノーティフィケーション・サポートを最大限に活用します。あなたのiOSアプリが通知をサポートしている場合は、Apple  Wathcは適切なタイミングでこれらの通知を表示します。アプリのローカルまたはリモート通知がユーザーのiPhoneに到着すると、iOSはiPhoneまたはApple Watchにその通知を表示するかどうか決定します。Apple Watchに送られた通知の場合、システムはノーティフィケーションが利用可能であることをさりげなくユーザーに知らせます。ユーザが通知を表示することを選択した場合、システムはまず省略バージョンのノーティフィケーションを表示し、続いてより詳細ばバージョンを表示します。ユーザーは詳細ノーティフィケーションを非表示にするかWatchKitアプリを起動するか、ノーティフィケーションの提供されたアクションボタンをタップして操作することができます。
アプリは、通知をサポートするために何かをする必要はありません。システムはノーティフィケーションのアラート・メッセージを表示するデフォルトのノーティフィケーション・インタフェースを提供します。しかしアプリはノーティフィケーション・インタフェースをカスタマイズして、カスタムグラフィック、コンテンツ、ブランディングを含めることができます。

注意
Apple WatchはiOSがそれらをサポートする場合にのみローカル及びリモートのノーティフィケーションを表示します。iOSアプリでローカル及びリモートのノーティフィケーションをサポートする方法についてはLocal および Push Notificationプログラミングガイドを参照してください。

ショートルック・インタフェース

ユーザーが最初にノーティフィケーションを見るとき、次の図のようなシステムはショートルック・インタフェースを表示します。ショートルック・インターフェースはカスタマイズできない非スクロール画面です。システムはテンプレートを使用し、アプリ名とアイコンを表示すると共に、ローカル通知またはリモート通知のペイロードに格納されているタイトル文字列を表示します。ユーザーが継続して通知を見たい場合、システムはショートルック・インタフェースからロングルック・インタフェースに素早く移行します。
 

shortlook_calendar_2x
出典 https://developer.apple.com/

ショートルックで使われるタイトルは、通知の趣旨の短い内容を提供します。ローカル通知の場合、UILocalNotificationオブジェクトのalertTitleプロパティを使ってこの文字列を設定します。リモート通知の場合、ペイロード内のalertディクショナリのtitleキーを追加します。通知のタイトル文字列を追加する方法についてはLocal および Push Notification プログラミングガイドを参照してください。
 

ロングルック・インタフェース

ロングルック・インタフェースは通知の内容及び関連するアクションボタンを表示するスクロール可能な画面です。カスタム通知インタフェースを提供しな場合は、Apple Watchはアプリのアイコン、通知のタイトル文字列及びアラートメッセージが含まれたデフォルトのインターフェースで表示します。カスタム通知インターフェースを提供した場合、Apple Watchは代わりにカスタマイズインターフェースを使用して表示します。
ロングルック・インタフェースは3つの領域に分かれています。

  • 帯の部分はアプリのアイコンとアプリ名をオーバーレイ表示します。帯の色は変更可能です。
  • コンテンツ領域には、到着した通知についての詳細な情報が含まれます。コンテンツ領域のカスタマイズ方法については、カスタム通知インターフェースを参照してください。

次にいくつかのアクションボタンを含むロングルック通知の例を示します。

longlook_calendar_2x
出典 https://developer.apple.com/

アプリのアイコンをタップするとWatchKitアプリを起動します。アプリで定義したボタンをタップすると選択したアクションをiOSアプリや WatchKitアプリに送信します。フォアグラウンドアクションはWatchKitアプリとWatchKit エクステンションに送信し、バックグラウンドアクションはiOSアプリに送信します。Dismissボタンをタップスするとどのような機能のアクションも行わずにノーティフィケーション・インタフェースを閉じます。それ以外の場所をタップしても何も起きません。

通知にアクションボタンを追加する

アクションボタンは通知のための幾つかの標準的な応答を提供することで、ユーザーの時間を節約します。Apple Watchはアクションボタンを表示する際にiOSアプリが登録したインタラクティブ通知を利用します。iOS8以降では、UIUserNotificationSettingsオブジェクトを使い生成された通知の表示時のタイプを登録することが必要です。その情報を登録する際に、アプリはそのカテゴリのために実行できるアクションを含むカスタム通知カテゴリのセットを登録することができます。Apple Watchはロングルック・インタフェースに対応するアクションボタンを追加する際に、このカテゴリ情報を使用しています。
次のリストはサンプルiOSアプリの設定とカテゴリを登録するメソッドです。このメソッドは、WatchKitエクステンションではなく、iOSアプリの方に実装され、起動時にiOSのApp Delegateによって呼ばれます。実装はSwiftで書かれており会議参加への了承もしくは辞退のアクションを含んだ「招待」カテゴリの生成と登録を示しています。

func registerSettingsAndCategories() {
    var categories = NSMutableSet()
    var acceptAction = UIMutableUserNotificationAction()
    acceptAction.title = NSLocalizedString("Accept", comment: "Accept invitation")
    acceptAction.identifier = "accept"
    acceptAction.activationMode = UIUserNotificationActivationMode.Background
    acceptAction.authenticationRequired = false
    var declineAction = UIMutableUserNotificationAction()
    declineAction.title = NSLocalizedString("Decline", comment: "Decline invitation")
    declineAction.identifier = "decline"
    declineAction.activationMode = UIUserNotificationActivationMode.Background
    declineAction.authenticationRequired = false
    var inviteCategory = UIMutableUserNotificationCategory()
    inviteCategory.setActions([acceptAction, declineAction],
                  forContext: UIUserNotificationActionContext.Default)
    inviteCategory.identifier = "invitation"
    categories.addObject(inviteCategory)
    // Configure other actions and categories and add them to the set...
    var settings = UIUserNotificationSettings(forTypes: (.Alert | .Badge | .Sound),
                          categories: categories)
    UIApplication.sharedApplication().registerUserNotificationSettings(settings)
}

iOSアプリのカテゴリとアクションを設定する方法の詳細についてはLocal および Push Notification プログラミングガイドを参照してください。

アクションボタンのタップに反応する

ユーザーが通知のアクションボタンをタップすると、システムはUIUserNotificationActionオブジェクトに登録された情報をどのようにアクションを処理するか決定するために使用します。アクションはユーザーの認証とともにまたは認証なしで、フォアグラウンドまたはバックグラウンドで処理されます。フォアグラウンドとバックグラウンドのアクションの処理は異なります。

  • フォアグラウンド・アクションはWatchKitアプリを起動し、メイン・インタフェース・コントローラーのhandleActionWithIdentifier:forRemoteNotification:メソッドまたはhandleActionWithIdentifier:forLocalNotification:メソッドにタップしたボタンのIDを提供します。
  • アクションを処理するため、バックグラウンドアクションはiOSアプリをバックグラウンドで起動します。選択したアクションの情報はApp Delegateのapplication:handleActionWithIdentifier:forRemoteNotification:completionHandler:メソッドまたはapplication:handleActionWithIdentifier:forLocalNotification:completionHandler: メソッドに提供されます。

フォアグラウンドアクションでは、 WKUserNotificationInterfaceControllerサブクラスがアクションを処理しない事に注意することが重要です。フォアグラウンドアクションを選択するとアプリを起動しアプリのメイン・エントリ・ポイントのインタフェース・コントローラーをロードします。このイニシャル・インタフェース・コントローラは任意のアクションを処理する責務を負っています。インタフェース・コントローラはアクションを処理するためhandleActionWithIdentifier:forRemoteNotification:メソッドとhandleActionWithIdentifier:forLocalNotification: メソッド(必要に応じて)を実装する必要があります。

カスタム・ロングルック・インタフェースの管理

アプリにカスタム通知インタフェースを追加する

カスタム・インタフェースのカテゴリーを設定する

静的通知インタフェースを設定する

動的通知インタフェースを設定する

動的インタフェースを設計する

実行時に動的インタフェースを設定する

カスタムインタフェースのテスト

raspberry pi 2 model bにいろいろ繋いでみる

raspberry pi 2 model b が到着!
早速いろんなセンサー類を繋いでみました。
まずはLチカから。トランジスタをスイッチとして使用します。ベースへ電圧をかけるとLEDが光り、Lowにすると消えます。
IMG_0652
 
単純にLチカじゃなくてLピカするなら1番ピン(3.3V)と6番ピン(GND)をつなぐだけです。
IMG_0643
 
次は、温度センサーADT7410の値を読み取ります。シリアルインタフェースのI2Cを使ってデータを読み取ります。
最近のraspberry piではI2Cを有効にする方法が変わっていてraspi-configから有効にできます。
IMG_0650
 
次に、モータードライーバーを使ってDCモーターを駆動します。モーターの正転と逆転を試します。
IMG_0656
 
電圧スピーカーでビープ音を鳴らします。昔、学研の科学の付録で聞いた、懐かしい音がなります。
IMG_0655
 
7セグLEDです。要はLEDがたくさんあるってだけです。
IMG_0653
最後にカメラの動作テスト。画質はまずまず。
IMG_0658
一通り動かして、以外と簡単にセンサー類を繋げられるのにびっくり!
あとはアイディア次第ですね。
 
 
 
 
 
 

Apple Watch WatchKitまとめ

Apple Watch待ち遠しいですね!iPhoneをメインに使っているけれど、Android Wareが使いたいという理由でAndroidとiPhone両方とも持ち歩いている筆者にとってはApple Watchが早く発売されて欲しいと切望しているわけです。そうすればAndroid Wareを投げ捨てすぐさまWatchに乗り換えるよ。
さてさて今日はAppleWatchです。AppleのデベロッパーサイトでNDA無しに閲覧出来る情報を元に解説したいと思います。
WatchKitに関する情報は下記のサイトから得られます。当然英語ですが。
https://developer.apple.com/watchkit/
では内容を見ていきましょう! “Apple Watch WatchKitまとめ” の続きを読む

macでautomatorでzip圧縮しつつpasswordを設定する

単純に、passwdというpasswdでzipファイルを作成するスクリプトです。Automatorにファイルをドラッグ&ドロップで決まったパスワードで圧縮するために使っています。
 
[shell]
for f in “$@”
do
FILEPATH=$f
FILENAME=${FILEPATH##*/}
NAMEONL=${FILENAME%.*}
DIRNAME=${FILEPATH%/*}
cd ${DIRNAME}
zip -vP passwd ${NAMEONL}.zip ${FILENAME}
done
[/shell]

nest開発環境構築

nestって「ねぐら」って意味なんですね。心地よいねぐらを作ってくれるって事か。
先日のnestお勉強編にて、アメリカのサーモスタットの必要性と、しかし文化の違い?からかnestは日本において出番が少ないという状態なのはよくわかりました。そもそも、日本で24VoltageACのサーモスタットなんて代物は存在しない??少なくとも我が家にはない。Googleが買収する前から、「自分の家ではつかえねぇなぁ・・・」てことでスルーしてたんですよね。でもなぜか今nestが会社にあってですね、ほんのちょっと触る機会がありまして、再びワクワクしております。数年ぶりに「自宅スマートホーム化計画」が自分の中で再燃中、是非とも使えるようにしてみたいわけですよ。
で、最終的にやりたいのは、「ベンツのように車が自宅に近づいたら暖房or冷房ON」をしてみたいという、それだけなのです。まあ、nestに対応した冷暖房があるわけではないので、実際に実現はできませんが。実際は我が家であれば「IRKit」のほうがやりたいことを実現できるのだけれど。
というわけでnestは持っていないし買っても設置出来ないわけですから、ここは実機無しで開発環境を構築して、サンプルアプリでも動かしてることとしましょう。
まずは、クロームのプラグインを導入します。
nest_developer_tool
nest_add_extension
https://home.nest.com/を開きます。
クロームのメニューより その他ツール>デベロッパーツール を開きます。
nest_from_menu
タブのNestを選択
nest_developer_tool_shot
Thermostatsの+ボタンを押してサーモスタットを追加します。
nest_add_themostat
ではサンプルを動作させてみたいと思いますが、その前に、nestアプリで動作させてみましょうか。iPhoneのApp Storeにてnestで検索するとすぐ見つかります。
IMG_0208IMG_0209IMG_0210
すると何の事はない、単にWebと同じ画面が開くだけのアプリのようです。
気を取り直してサンプル動作です。さて、事前知識としてnest APIがどのように動作するか確認します。

  • サーモスタットからのデータはnestのサーバーにupされる。
  • Nest APIが提供されており、サーモスタットにはREST、Firebaseでアクセス可能。
  • Developer Serviceを介してNest APIにアクセスすることも、iPhoneなどから直接Nest APIを呼ぶことも可能。
  • OAuth2.0で認証するようだ。

ではSample Codeの一番上にあるThermostat Controlから試してみます。
control-jquery-master.zip をダウンロード、展開。
まずはツール類をダウンロード、インストール。
node.jsをインストールします。

$ brew uninstall node
$ brew update
$ brew install nodebrew
$ nodebrew install latest

ビルドにはそこそこ時間がかかります。次にバージョンを確認

$ nodebrew list
v0.11.14
current: none

上記バージョンを有効にする

$ nodebrew use v0.11.14
use v0.11.14

パスを設定する。

$ echo export PATH=\$PATH:/Users/$(whoami)/.nodebrew/current/bin >> ~/.bashrc

反映して、バージョン確認

$ source ~/.bashrc
$ node -v
v0.11.14

ちなみにyosemiteでbrew updateがうまう行かない場合、次の記事および次の記事で無事解決しました。

つぎにYeomanです。Yeomanについてはこちらの記事を参考。

Yeomanはnode.jsのパッケージ管理コマンドであるnpmコマンドを使用してインストールします。こちらのページを参考にインストールしましょう。

$ npm install -g yo bower grunt-cli gulp

展開したサンプルのフォルダに入ります。 例えば以下のように。

cd ~/Documents/Projects/nest/sample/control-jquery-master

次に、展開したサンプルの環境構築を行います。bower installを行うとbower.jsonに記載されているdependenciesのとおり、ライブラリが構築されます。

$ cat bower.json
{
 "name": "Control",
 "dependencies": {
 "jquery": "= 2.1.1",
 "jquery-cookie": "= 1.4.1",
 "firebase": "= 1.0.15"
 },
 "private": true
}

jqueryとjquery-cookie、それにfirebaseが導入されるようですね。それではbower installしてみましょう。

$ bower install
[?] May bower anonymously report usage statistics to improve the tool over time? No/n) n
bower not-cached git://github.com/jquery/jquery.git#= 2.1.1
bower resolve git://github.com/jquery/jquery.git#= 2.1.1
bower not-cached git://github.com/carhartl/jquery-cookie.git#= 1.4.1
bower resolve git://github.com/carhartl/jquery-cookie.git#= 1.4.1
bower not-cached git://github.com/firebase/firebase-bower.git#= 1.0.15
bower resolve git://github.com/firebase/firebase-bower.git#= 1.0.15
bower download https://github.com/firebase/firebase-bower/archive/v1.0.15.tar.gz
bower download https://github.com/carhartl/jquery-cookie/archive/v1.4.1.tar.gz
bower download https://github.com/jquery/jquery/archive/2.1.1.tar.gz
bower extract jquery-cookie#= 1.4.1 archive.tar.gz
bower resolved git://github.com/carhartl/jquery-cookie.git#1.4.1
bower not-cached git://github.com/jquery/jquery.git#>=1.2
bower resolve git://github.com/jquery/jquery.git#>=1.2
bower download https://github.com/jquery/jquery/archive/2.1.3.tar.gz
bower extract firebase#= 1.0.15 archive.tar.gz
bower resolved git://github.com/firebase/firebase-bower.git#1.0.15
bower extract jquery#= 2.1.1 archive.tar.gz
bower resolved git://github.com/jquery/jquery.git#2.1.1
bower extract jquery#>=1.2 archive.tar.gz
bower resolved git://github.com/jquery/jquery.git#2.1.3
bower install jquery-cookie#1.4.1
bower install firebase#1.0.15
bower install jquery#2.1.1
jquery-cookie#1.4.1 bower_components/jquery-cookie
└── jquery#2.1.1
firebase#1.0.15 bower_components/firebase
jquery#2.1.1 bower_components/jquery

次にnpm installします。npm installをオプション無しで実行すると、package.jsonの内容に従って、packageをインストールします。

$ cat package.json
{
 "dependencies": {
 "body-parser": "latest",
 "cookie-parser": "latest",
 "express": "latest",
 "express-session": "latest",
 "passport": "latest",
 "passport-nest": "latest"
 }
}

ではインストールします。

$ npm install
npm WARN package.json @ No repository field.
cookie-parser@1.3.3 node_modules/cookie-parser
├── cookie@0.1.2
└── cookie-signature@1.0.5
passport@0.2.1 node_modules/passport
├── pause@0.0.1
└── passport-strategy@1.0.0
express-session@1.10.1 node_modules/express-session
├── cookie@0.1.2
├── utils-merge@1.0.0
├── cookie-signature@1.0.5
├── on-headers@1.0.0
├── parseurl@1.3.0
├── crc@3.2.1
├── depd@1.0.0
├── uid-safe@1.0.2 (native-or-bluebird@1.1.2, base64-url@1.1.0)
└── debug@2.1.1 (ms@0.6.2)
body-parser@1.10.1 node_modules/body-parser
├── media-typer@0.3.0
├── bytes@1.0.0
├── raw-body@1.3.1
├── depd@1.0.0
├── qs@2.3.3
├── on-finished@2.2.0 (ee-first@1.1.0)
├── iconv-lite@0.4.5
└── type-is@1.5.5 (mime-types@2.0.7)
express@4.11.0 node_modules/express
├── utils-merge@1.0.0
├── cookie@0.1.2
├── merge-descriptors@0.0.2
├── methods@1.1.1
├── cookie-signature@1.0.5
├── fresh@0.2.4
├── escape-html@1.0.1
├── range-parser@1.0.2
├── media-typer@0.3.0
├── finalhandler@0.3.3
├── vary@1.0.0
├── serve-static@1.8.0
├── content-disposition@0.5.0
├── parseurl@1.3.0
├── path-to-regexp@0.1.3
├── etag@1.5.1 (crc@3.2.1)
├── on-finished@2.2.0 (ee-first@1.1.0)
├── depd@1.0.0
├── debug@2.1.1 (ms@0.6.2)
├── qs@2.3.3
├── proxy-addr@1.0.5 (forwarded@0.1.0, ipaddr.js@0.1.6)
├── send@0.11.0 (destroy@1.0.3, ms@0.7.0, mime@1.2.11)
├── type-is@1.5.5 (mime-types@2.0.7)
└── accepts@1.2.2 (negotiator@0.5.0, mime-types@2.0.7)
passport-nest@1.0.0 node_modules/passport-nest
├── pkginfo@0.3.0
└── passport-oauth@1.0.0 (passport-oauth1@1.0.1, passport-oauth2@1.1.2)

次に、https://developer.nest.com/clients/より環境変数を取得します。

空っぽなので作成します。

nest_client

Clientの説明とパーミッションを設定。* の欄は必須なのでここだけ埋めていきます。今のところ個人用なのでIndivisualで設定。Select up two categoriesも適当に選択。Support URLは適当に記載。

テストなのでパーミッションはすべてONのread/writeにしていきます。説明も適当に記載。

nest_Create_Client

作成されたCliantのCliant IDとClient Selectを環境変数にセットします。

 $ export NEST_ID=<CLIENT ID>
 $ export NEST_SECRET=<CLIENT SECRET>

では、サンプルを実行してみましよう。

$ grunt
grunt-cli: The grunt command line interface. (v0.1.13)
Fatal error: Unable to find local grunt.
If you're seeing this message, either a Gruntfile wasn't found or grunt
hasn't been installed locally to your project. For more information about
installing and configuring grunt, please see the Getting Started guide:
http://gruntjs.com/getting-started

エラーが出ます。プロジェクトにgruntがインストールされていない?下のコマンドを打ち込みます。

$ npm install grunt
npm WARN package.json @ No repository field.
npm WARN package.json passport-nest@1.0.0 No repository field.
grunt@0.4.5 node_modules/grunt
├── which@1.0.8
├── dateformat@1.0.2-1.2.3
├── eventemitter2@0.4.14
├── getobject@0.1.0
├── rimraf@2.2.8
├── colors@0.6.2
├── async@0.1.22
├── grunt-legacy-util@0.2.0
├── hooker@0.2.3
├── exit@0.1.2
├── nopt@1.0.10 (abbrev@1.0.5)
├── minimatch@0.2.14 (sigmund@1.0.0, lru-cache@2.5.0)
├── lodash@0.9.2
├── glob@3.1.21 (inherits@1.0.0, graceful-fs@1.2.3)
├── coffee-script@1.3.3
├── underscore.string@2.2.1
├── iconv-lite@0.2.11
├── findup-sync@0.1.3 (glob@3.2.11, lodash@2.4.1)
├── grunt-legacy-log@0.1.1 (underscore.string@2.3.3, lodash@2.4.1)
└── js-yaml@2.0.5 (esprima@1.0.4, argparse@0.1.16)

再度サンプルを実行してみましょう。

$ grunt
>> Local Npm module "grunt-wiredep" not found. Is it installed?
Running "server" task
body-parser deprecated bodyParser: use individual json/urlencoded middlewares server.js:58:9
body-parser deprecated undefined extended: provide extended option node_modules/body-parser/index.js:85:29
express-session deprecated undefined resave option; provide resave option server.js:59:9
express-session deprecated undefined saveUninitialized option; provide saveUninitialized option server.js:59:9
Web server running at http://localhost:8080.

こんどはうまく動きました。でも上記の通りエラーが出ています。

>> Local Npm module "grunt-wiredep" not found. Is it installed?

足りないモジュールをインストールして再度gruntを実行します。

npm install grunt-wirede

gruntを実行してlocalhostを開くと、認証プロセスに遷移します。

nest_Works_with_Nest

nest_login_Works_with_Nest

nest_pin_code

ログインするとPincodeが表示されます。しかし、ここから、どうすればいいのかわかりません。

どうすればいいんだ!そうこうしているとそろそ出勤時間です。続きはまた明日