Raspberry Pi で iBeacon を発見するための調査メモ

近いうちに試してみることになるかもしれないのでメモ。

Raspberry PiBluetoothを使えるようにするために

Raspberry Pi を Bluetooth Low Energy (BLE) の Peripheral として動作させるで、BLE の Peripheral として動作させたことはあるので参考に。

RPi Bluetooth LE が詳しい。

あとはこのあたりを参考に。
https://github.com/sandeepmistry/noble#prerequisites

apt-getで BlueZ をインストールできるが、バージョンが 4.99 で BLE のサポートが完全ではないらしい。
BLE のスキャニングだけならおそらく問題はないと思うけど、使えない場合はビルドが必要。

Node.js でプログラミングするために

sandeepmistry/node-bleacon でいけるっぽい。
スキャニングは Central モジュールの noble に、発信は Peripheral 側の bleno に依存している。

UUID を指定しなくてもスキャニングは可能。…というか実装を見てみたら、全部取得してから通知するかどうかの判断をしている模様。
UUID は配列で複数渡すこともできるから、違う種類の iBeacon が混在していても大丈夫そう。

iBeacon と Raspberry Pi の距離の測定

node-bleacon では MeasuredPower や RSSI の値を取得可能。
ただし、それらの値だけでは距離の算出は難しい。

iBeaconのRSSIでiPhoneの二次元座標をとれたらいいな
屋内測位をやってみました

大雑把な距離なら proximity を使えばいいけど、具体的な距離を出したい場合はキャリブレーションが必要っぽい。
Raspberry Pi では収集だけして、フィンガープリンティングの値の設定と距離の算出をサーバ側でするようにしたら個別にソースをいじらなくてもいいかも。

Node.jsのあれこれ

今のプロジェクトで、Node.jsを使ったAPIサーバの開発を行っていて、その時のいろいろをメモ。

Node 5.0.0への対応

プロジェクトではv0.12.7で開発を進めているけど、自分で使っているBoilerplateはv5.0.0に対応を。
node_modulesのディレクトリ構成が変更になっていて、従来までnpmが依存するパッケージはそのnpmのnode_modulesに配置されていたのが、全てnode_modules直下に配置されるように。
アプリケーションでの利用はほとんど影響はないと思うけど、利用しているnpmの依存パッケージを直接利用している場合は注意が必要。
gulpタスクでBabelのRequire Hookを利用するのに、gulp-babel内部のbabel-coreを呼び出している部分はパスの修正を実施。

Bable 6.0への対応

Babel 6.0からトランスパイルの部分がモジュール化され、別途インストールする必要が。
Babel 5と同様の変換を行うプリセットが提示されていたので、ひとまず"es2015", "react", "stage-2"をpresetsに指定。
また、Require Hookで利用する際にもpresetsなどを指定する必要があり。
インポート時に指定でできるけど、gulp-babel等で同じことを複数箇所に書くのは嫌なので、.babelrcに設定をまとめて記述。
package.jsonと同じディレクトリに配置しておくと、gulp-bableやbabelify、Require Hookなどでの実行時に、それを見に行ってくれる。

以下を参考に。
6.0.0 Released
FAQ
babel6での変更点 Gulp・Webpackの設定

export defaultの挙動

ECMAScript 2015の仕様として、export default xxxmodule.exports.default = xxxとなる。
Babelによって変換されたコードは当然このように変換されるので、CommonJSのvar xxx = require('./xxx')でインポートするとxxx = { default: xxx }となる。
require('./xxx').defaultとするか、エクスポートする側でmodule.exports = xxxとするか。
もしくはES2015 modules to CommonJS transformプラグインに追加。
Nodeyardではexpress-generatorで出力された/bin/wwwがインポートする対象の、app.jsだけCommonJS形式のエクスポートとしている。
全部変換の対象にすればいいのだろうけど。

Sequelizeで既存のテーブルにアクセス

sequelize-clisequelize initでModelへのエントリーポイントとなる/models/index.jsを生成。
あとは手動なりコマンドなりで、/modelsディレクトリに、index.jsが読み込める形式でModelの定義していく。

テーブル定義がスネークケースとなっているのをキャメルケースとして扱いたいこと、timestampが不要なことから、以下を記述。

{
  timestamps: false,
  underscored: true,
  freezeTableName: true,
  tableName: 'table_name',
  associate: (models) => {}
}

idはPostgreSQLのシーケンスを使っているので、idの定義を以下のように。

id: {
  type: DataTypes.INTEGER,
  primaryKey: true,
  autoIncrement: true
}

詳しくはWorking with legacy tablesを。

PostgreSQLでユーザ定義型の確認

以下のSQLで確認できる。

SELECT t.typname, e.enumlabel 
  FROM pg_type t, pg_enum e 
  WHERE t.oid = e.enumtypid;

ここを参照。

MacBook Pro (Retina, 13-inch, Late 2012)にEl Capitanをクリーンインストール

プライベートで使っているMacBook Proに、El Capitanをクリーンインストールしました。
Yosemiteの時から、OSのアップデートのタイミングでクリーンインストールするようにしています。
理由は、開発環境をリセットしたり、インストールするアプリケーションやパッケージを整理したいから。あと、Macを使ってるとストレージを圧迫する「その他」を一掃するため。

クリーンインストールの方法については、去年書いたMacBook Pro (Retina, 13-inch, Late 2012)にYosemiteをクリーンインストールと同じ方法で問題なく行えました。
いくつか聞いていた不具合にも遭遇することなく、スムーズにインストールが完了。

設定の変更と、インストールしたアプリケーションなどをメモ。

システム環境設定

一般

  • 「書類を閉じる時に変更内容を保持するかどうかを確認」にチェック
  • 「アプリケーションを終了するときにウィンドウを閉じる」にチェック
  • 「最近使った項目」を5に変更

Dock

  • 「ウィンドウタイトルバーのダブルクリックで」を「しまう」に
  • 「ウィンドウをアプリケーションアイコンにしまう」にチェック
  • 「Dockを自動的に隠す/表示」にチェック

セキュリティとプライバシー

ファイアウォール

キーボード

  • 「キーのリピート」をもっとも速く
  • 「リピート入力認識までの時間」をもっとも短くs

トラックパッド

  • 全ての項目にチェック
  • 「軌跡の速さ」をもっとも速く

アクセシビリティ

マウス/トラックパッド

トラックパッドオプション

  • 「ドラッグを有効にする」にチェックを入れ、「3本指のドラッグ」を選択

今までトラックパッドの設定でドラッグの方法を選択できていたのですが、El Capitanではアクセシビリティの方に移動しています。

アプリケーションのインストール

Apple Store

Xcodeのインストール後は、ターミナルで以下のコマンドを入力してコマンドラインツールをインストール

$ xcode-select --install

インターネット経由

ChromeはHomebrew Caskでもインストールできるのですが、1Passwordのエクステンションをインストールすることができなかったのでホームページからダウンロードしたものをインストールしています。
Carthageは今まではhomebrewで管理していたのですが、OSのアップデートでSwiftのバージョンが2にあがり、ビルドできなくなってしまったのでここからパッケージをダウンロードしてインストールしています。
インストールしたパッケージを削除する時はMacでインストールしたパッケージを削除するを参考に。

Homebrew

  • git
  • nodebrew

nodebrewでnodeをインストールする際にFailed to create the fileのエラーが出たので、以下のコマンドでディレクトリを作成。

$ mkdir -p ~/.nodebrew/src

Homebrew Cask

以下のコマンドでCaskをインストール

$ brew install caskroom/cask/brew-cask
  • Dropbox
  • iTerm2
  • Atom
  • PSequel
  • AppCleaner
  • Flux
  • CheatSheet
  • Alfred
  • Colors

ひとまずはこんな感じで。
El Capitanになって、画面の切り替えなどがスムーズになったような気が。
ライブ変換は最初は戸惑うけど、変換精度もかなり高くて便利かも。
Split ViewはWindow Tidyを使うから、自分はあまり使わないような気が。左右だけじゃなくって、上下とかも対応していたらよかったのですが。

AWS上の Node.js アプリケーションに HTTPS でアクセス可能にする

9月からのプロジェクトでは AWS を使っています。
今までインフラを扱ったことがほとんどなくて、AWS も今回初めてアカウントを作って恐々触っているレベルですが、タイトルのことは割とすんなりと。
ただやっぱりある程度インフラのことは気にする必要があって、改めて Heroku はおかん。

EC2 インスタンスに Node.js と npm をインストールする

公式のガイドを参考にインスタンスを起動
User Guide for Linux Instances

ssh でアクセスし、まずビルドに必要なライブラリをインストール

$ sudo yum update

$ sudo yum install gcc-c++ make
$ sudo yum install openssl-devel

GitHub からバージョン指定で clone してインストール
yum を使うと v0.10 系となるため、この方法を取っています

$ sudo yum install git

$ git clone --depth=1 -b v0.12.7 git://github.com/nodejs/node.git

$ cd node
$ ./configure
$ make
$ sudo make install

Amazon Linux は root のパスが特殊らしいので、以下の変更を実施

$ sudo su
$ visudo
Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin

続いて npm をインストール
Node.js の v0.12.7 にバンドルされているバージョンの npm をインストールし、npm コマンドでアップデートを行いました

$ git clone --depth=1 -b v2.11.3 https://github.com/npm/npm.git
$ cd npm
$ sudo make install
$ sudo npm update -g npm

How to install node and mongodb on Amazon EC2
上記のページを参考にしています。
nodebrew とかを使わなかったのは root のパスの問題と EC2 ならバージョンを上げるのならまた一から作るんだよね、というようなことを考えつつ。
この辺りの考え方はどうなのでしょうか、教えてえらい人。

ELB の作成と SSL 証明書の設定

ELB の作成と証明書の設定は公式のドキュメントの通りに
Developer Guide

SSL 自己証明書の作成

ELB に設定する SSL 自己証明書は、オレオレ証明書をopensslで作る(詳細版)を参考に。

以下のコマンドで秘密鍵、証明書署名要求ファイル、証明書を作成

$ openssl genrsa 2048 > server.key
$ openssl req -new -key server.key > server.csr
$ openssl x509 -days 3650 -req -signkey server.key < server.csr > server.crt

ELB の SSL Termination は、秘密鍵に鍵がついているとダメなのようなので、以下のコマンドで解除

$ openssl rsa -in server.key > server-released.key

AWS で設定する際は、PEM 形式じゃないとだめ。
openssl はデフォルトで PEM 形式で出力されるようなので、cat で秘密鍵と証明書の中身を表示して貼り付け。


インフラ初心者でもいちおうなんとかなるっぽい。
ただセキュリティグループとかどう整理すればいいのかはまだわからない。。
この辺りは多分技術書を読んだ方が早そう。

Apple Watch対応のiPhoneアプリ「Glancely」のリリース

プライベートで開発していたApple Watch対応のiPhoneアプリ、「Glancely」がApp Storeに公開されました。

Open Weather MapAPIを利用した、今日の天気を素早く確認するためのアプリです。
Swiftでの開発、Carthageを用いた依存ライブラリの管理、Embedded Frameworkを使ったWatch Kit Extensionとのコードの共有など、いろいろ試してみたのでまたブログに書きたいと思います。

無料のアプリなので、気軽にダウンロードいただければと思います。

Swift強化月間

5月は仕事、プライベートともSwiftをがっつり書いた月でした。

Xcode 6からフレームワーク用のテンプレートが用意され、独自フレームワークの開発や公開が簡単になりました。
そこで、他のアプリケーションで使いそうな機能とかをいくつかフレームワークとしてまとめ、Carthageで管理できるように、Githubに公開しました。

AKIRA-MIYAKE/SwiftyEvents

Node.jsのEventEmitterのような使い方ができる、イベント通知のためのライブラリ。
GenericsクラスのサブクラスはGenericsでなければならないというSwiftyの制約のため、EventEmitterのサブクラスを定義する際はこういう方法を取る必要がありますが。。

AKIRA-MIYAKE/OpenWeatherMapper

今はプライベートで開発中のアプリで使う部分のみの実装。
パース処理は共通で大丈夫だから、もしかしたら今後拡張するかも。

AKIRA-MIYAKE/EasyBeacon

iBeaconのモニタリング、レンジングの処理を簡単にアプリに組み込むためのライブラリ。
リージョンの出入り、リージョンに入った際のもっとも近いビーコンの取得に機能を限定していますが、多くの場合それで十分なのではないかと。
あんまり細かい部分までいじれるようにすると、単なるラッパーになってしまうし。

Apple Watchのアプリ開発も行ったので、その時の気づきなどは後日まとめたいと思います。