Raspberry Pi で iBeacon を発見するための調査メモ
近いうちに試してみることになるかもしれないのでメモ。
Raspberry Pi で Bluetoothを使えるようにするために
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 xxx
はmodule.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-cliのsequelize 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
- Carthage
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
ひとまずはこんな感じで。
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 で秘密鍵と証明書の中身を表示して貼り付け。
インフラ初心者でもいちおうなんとかなるっぽい。
ただセキュリティグループとかどう整理すればいいのかはまだわからない。。
この辺りは多分技術書を読んだ方が早そう。
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のアプリ開発も行ったので、その時の気づきなどは後日まとめたいと思います。