これを使うと
https://github.com/shokai/gyazzchecker-slack
Gyazzを定期的にクロールして、更新差分だけslackのチャットに流してくれる。slackbot gemを使った。
Gyazzはアウトラインエディタなwikiなので、1行毎で意味がわかる構造化された文章を書くことになる。
行毎の差分がチャットに流れてくると会話みたいになって面白い。
画像とかも勝手に埋め込まれてよい
slack.comというグループチャットサービスを使ってて、各デバイス用のアプリとかMac用のアプリもよくできてたので、nodeでslackbot APIを使うラッパー作った
https://www.npmjs.org/package/slackbot
https://(your-team).slack.com/services/new/slackbot からintegrationを追加して、tokenを取得してから
このようにするとチャットに投稿できる
var Slackbot = require('slackbot')
var slackbot = new Slackbot('YOUR-TEAM', 'YOUR-TOKEN');
slackbot.send("#general", "hello!!", function(err, res, body) {
if(err) return;
console.log(body);
});
lindaに流れてくるセンサーとかの情報とか、gyazzの更新差分とかを流している
bleaconを使うとMacをiBeacon発信機にできた。もう一台Macを用意すれば受信もできた。
https://gist.github.com/shokai/0354aaf8a72873f4412b
nodeの発信側は、プロセス終了してすぐ再起動するとうまく動かない。最低でも2,3秒まってから再起動する。
% npm i bleacon
% uuidgen
発信
Bleacon = require 'bleacon'
uuid = process.argv[2] || "805D6740-F575-492A-8668-45E553EB9DF2"
major = 1
minor = 1
console.log uuid
Bleacon.startAdvertising uuid, major, minor, -50
受信
Bleacon = require 'bleacon'
Bleacon.startScanning()
Bleacon.on 'discover', (beacon) ->
console.log beacon
昨日作ったAndroidでiBeaconを読むやつでも受信できた。
前:ScalaでAndroidアプリを作る
iBeaconをAndroidで読んで、ビーコンが現れたらNotificationを出すとかできるライブラリを作った。
advertiseパケットを自前でparseしてiOSのSDKで使われてるのと同じフォーマットの16進コードに変換してるけど、scalaなので15行ぐらいで書けた。
https://github.com/shokai/iBeacon-AndroidScala
先週研究会でspammerっていう人がiBeaconの仕組みとかをまとめて発表してくれた。
へぇーと思ったのでMyBeacon買って土日にAndroid用のライブラリを作った。
Javaは冗長でつらいのでScalaで書いたけど、Scalaもライブラリの配信方法が.classをjarに固めてmaven使うとか冗長でつらい。どうすればいいんだ。なんでコンパイル前のscalaスクリプトのまま流通させないのか理解できない。
使い方
詳しくはGitHubのREADMEに書いた。
Activityから起動する例
import org.shokai.ibeacon.{IBeacon, Beacon};
class MainActivity extends Activity{
lazy val iBeacon:IBeacon = new IBeacon(this)
override def onCreate(savedInstanceState:Bundle){
// ビーコンを発見した時にcallbackされる
iBeacon.onDiscover((beacon:Beacon) =>
Log.v("iBeacon", s"UUID=${beacon.uuid} Major=${beacon.major} Minor=${beacon.minor} RSSI=${beacon.rssi}")
)
}
}
AndroidManifest.xml
<manifest>
<application> ~~ (略) ~~ </application>
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true" />
</manifest>
とても簡単でよい。
onBeaconというコールバックもあって、これは全てのビーコンパケットをコールバックしてくる。
ビーコンは常に電波を発信しまくっているので、onBeaconイベントはものすごい勢いで呼ばれる。
コールバックされるBeaconオブジェクトのrssiプロパティで受信信号強度が取れるので、距離もなんとなく計れる。
だいたい見通し25メートルぐらいで-90、接触するぐらい近いと-20〜-10とかになる。
なお1度呼ばれた同じビーコンのonDiscoverが再び呼ばれるのは、そのビーコンの信号が5秒間無くなって再び現れた時。
サンプルアプリ
信号を読むやつ(apk)
ビーコンを見つけたら通知を出すサービス(電源ONしたら自動起動する)
これ改造すると、猫にビーコンつけて近寄ってきたらエサくれ通知を出すとか、自分が家に近づいたらカギが開くとか簡単に作れる。
iBeaconとは
Appleが考えたBluetoothデバイスの存在通知手法で、ずっと電波出し続けているデバイス(ビーコン)をいろいろな場所に設置しておいて、その電波をスマホが検知すると「〜〜というデバイスがあるのでアプリを起動しますか?」のような通知を出す。最近のiOSアプリ持ってないので実物を見たことがないんだけどそんな感じのはず。
実装としてはBluetooth LE (ローエナジー) のadvertiseパケットの末尾にビーコンのUUIDやmajor,minorといった識別子を突っ込んでいるもので、そんなに凄い事をしているわけではない。
なのでAndroidでもadvertiseパケットを見て、バイナリをparseしたらUUIDとか取り出せた。
インスタントメッセンジャーアプリの名前欄で会話してる人とかいるけど、そういうのに近い。
1800円のMyBeaconを3個買って、研究室に設置した。
参考
iOS – AndroidでiBeacon信号を受信してみよう – Qiitatw v1.0.9とanagoとUNIXという思想
参考:はむおコマンド作った – hitode909の日記
anagoというコマンド作った
UNIXという哲学にもとづいて作られているtwitterクライアント twの最新版v1.0.9にpipeで渡すとtweetできる
1.0.9以前は複数行pipe渡すと行ごとにtweetしてた。anagoのために仕様変更した。
最近のtwitterはunicodeの絵文字をがんばってimgタグで表示してくれてすごい。
でもandroidで見ると1つ目になっててヤバイ。