0

Edisonへのsshログイン設定

configure_edisonコマンドでWiFiやホスト名の設定ができる。
同じLANの中からなら

% ssh root@edison.local
でログインできる。


ユーザー名を設定

ホストごとにユーザー名設定する

~/.ssh/config に
Host edishon.local
User root
と書くと、

% ssh edison.local
でよくなる


家の外からログイン

家の外からログインできる別のマシンがすでにあるとする。
うちではMacminiがサーバーとして外から見えるようになっていて、EdisonはMacminiと同じLAN内だけど外からは見えない。

~/.ssh/config に
Host edison
HostName edison.local
User root
ProxyCommand nohup ssh -l `whoami` (自宅サーバーのアドレス) nc %h %p
と書いておくと

% ssh edison
でMacminiを踏み台にしてEdisonにログインできる。


ssh鍵の設定

鍵を作ってedisonに公開鍵を渡しておくと毎回パスワード入力しないですむ
% ssh-keygen
% ssh-copy-id root@edison.local

0

Edisonのファームウェア(Yocto Linux)をアップデート

Edison Getting Started Guide – learn.sparkfun.comを参考にした。

最新にしたらconfigure_edisonコマンドで設定したWiFi AP情報が再起動しても消えなくなった。
システムだけアップデートされて、ホームディレクトリの中は消えない。でもgitなどの別途opkgでインストールしてたものは全部消えてしまった。


最新ファームウェアをダウンロードする

Yocto 2.1 complete imageをzipでダウンロードした
IoT – Intel® Edison Board Download | Intel® Developer Zone


Macと接続

J16とMacをマイクロUSBケーブルで接続、外付けストレージとしてマウントされる

Breakout Board Hardware Guideより


アップデート

隠しファイルも含めて全て削除する
% cd /Volumes/Edison
% rm -rf *
% rm -rf \.

zipを解凍して、すべてそのまま /Volumes/Edison/ にコピー
.ext4とか.imgとかも全てコピーする

/Volumes/Edisonをアンマウントする


再起動する

J3にマイクロUSBケーブルを接続し、MacからEdisonのコンソールにログイン
% screen /dev/tty.usbserial-A502F1ZL 115200 -L

ストレージの中身を使ってシステムにアップデートかける
% reboot ota
しばし待つ

ログイン

パスワードがリセットされてるので、user:root pass:なし でログインできる。

WiFiやパスワードを設定する
% configure_edison --setup


確認

アップデートされてる
% uname -a
Linux edison 3.10.17-poky-edison+ #1 SMP PREEMPT Wed Apr 29 03:54:01 CEST 2015 i686 GNU/Linux

node.jsは0.10.28だったのが0.10.35に上がってた


ストレージの中のアップデート用イメージを削除する

残ってるとreboot otaしたらまたシステムを上書きしそうなので、Macでマウントして全て削除した。
削除してからreboot otaしてみたけど、再起動されるだけでWiFi設定とか消えなかった。

0

またHubotのbrainが爆発したのでhubot-mongodb-brain作った

既存のbrainがあまりにもひどいので自作した。

https://www.npmjs.com/package/hubot-mongodb-brain
https://github.com/shokai/hubot-mongodb-brain

npm installして、external-scripts.jsonに書けば使える。何も設定しなくてもローカルのmongodbか、Herokuならmongolabかmongohqを読み込む。

他のbrainからの移行スクリプトもある。


爆発

以前爆発した時
hubotのbrainが爆発した

hubot-brain-redisは全データを1つのblobとして固めて保存するから、brainのサイズが1.5MBを超えるとRedisToGoのmax memoryにひっかかって保存できなくなる。
そこでhubot-brain-redis-hashに乗り換えたのだが、やっぱり2MB超えたあたりで保存できなくなった。brain-redis-hashもよく見たら1つのblobにまとめて1keyに保存してた。READMEには1つのblobとしては保存しないって書いてあるけど、よくコード読んだら

// brainのデータ構造
{
users: userとroomのリスト
_private: { // この中をrobot.brain.get/setで操作している
key1: value1,
key2: value2,
key3: value3
(略)
}
}
これのusersと_privateを別に保存してるだけなので、全然解決してない。

_privateの中をkey毎に保存するべきで、usersはそもそも用途が無いので保存する必要がない。
hubot-mongodb-brainでは_privateだけ保存するようにした。

他の選択肢

mongo-brainとmongolab-brainも、1 documentに全部固めて保存するのでだめ。そもそもcollections.find().limit(1)とかcollections.find({})とかで取り出してるのが気持ち悪すぎる。

0

Circle CIのビルド結果をHubotで通知

久しぶりにCircle CIを試したら、起動が妙に速くなっていた(前からこんなに速かったっけ?)のでいくつかのプロジェクトで使ってみる事にした。

Slackのインテグレーションがlimitに達していたので、Hubotで通知させるのを書いた。

circleci-webhook.coffee


設定

こんな感じでwebhook設定するとJSONが来るので、HubotがSlackに通知してくれる。

circle.yml
machine:
node:
version: 0.12
deployment:
staging:
branch: master
heroku:
appname: (herokuのアプリ名)
notify:
webhooks:
- url: https://自分のhubot.com/circleci-webhook?room=(chat部屋名)

動作

Hubot自体のビルド通知も、自分自身にやらせてる。
CircleCIでテスト→Herokuにデプロイ→Hubot起動→CircleCIからビルド結果がWebhookで届く→HubotがSlackに通知 という順に動いている。

0

littleBits Arduino moduleをNode.jsやRubyから操作する

littleBitsArduinoモジュールをNodeから使うFirmataのラッパーを書いた。PCで動かしているNodeからlittlebitsを操作できる。

https://www.npmjs.com/package/littlebits-arduino
https://github.com/shokai/node-littlebits-arduino


littleBitsは専用のマグネットコネクタで接続する電子工作ツールキットで、このコネクタのおかげで部品が壊れるような向きには絶対接続できないようになっている。サーボモーターとLEDとスピーカーみたいな回路的に全然違う物も全部「output module」として組み換え可能になるようにモジュール化されていたりと、回路としては無駄は多いけどとてもソフトウェア的な考え方で作られていて面白い。回路わからない人でも適当につなげれば動くのはすごい。


インストール

% npm i littlebits-arduino


使い方


左側の3つが入力、右側が出力ポートになる。

d1やa0のようなポート名そのままのアクセサがあるので、読み取ったり代入したりすると操作できる。
なおarduino-firmata npmを単純にextendしただけなので、arduino-firmataのdigitalWriteやanalogRead等の関数もそのまま使える。

var LittleBitsArduino = require('littlebits-arduino');

var arduino = new LittleBitsArduino();
arduino.connect(); // use default Arduino
// arduino.connect('/dev/tty.usb-device-name');

arduino.on('connect', function(){
setInterval(function(){
var d0 = arduino.d0; // true or false
var a0 = arduino.a0; // 0~1023 analog input
var a1 = arduino.a1; // 0~1023 analog input

console.log([d0, a0, a1]);

arduino.d1 = d0; // digital output
arduino.d5 = a0/4; // 0~255 analog output
arduino.d9 = a1/4; // 0~255 analog output
}, 100);
});


Ruby用

Rubyでlittlebits操作するのはどうやるのかな、と思って検索したらlittle_bitsというgemがあって、node版ではこれのインタフェースを参考にさせてもらった。ほぼ同じ雰囲気で使える。

あと、中を見たらで自分が作ったarduino_firmata gemが使われていて、入力ポートを読むとか足りない機能があったのでプルリクしておいた。