0

Web+DB Press vol.84でTesselについて書いた

前:Web+DB Press vol.83でHueについて書いた


書いた

今日発売の84号に、JavaScriptが動く、Node.js互換環境が入ってるマイコンボードTesselについて書いた。

Tesselは実行速度(というか拡張ボードと本体間のバスにUARTが使われてるところ)がかなり遅い事を除けば本当に理想的なマイコンボードな感じがする。拡張ボードに色々用意されているセンサー類のドライバもnpmで管理・インストール出来るし、必要があれば自分で機能拡張する事もできる。(例:tesselに日本語を喋らせるnpmライブラリ作った

もちろん既存のnpm資産も併用できるので、今回の記事ではtesselでの開発の簡単な説明のほかにセンサーで明るさを計ってYoやslackに通知するような話を書いた。

調度良いタイミングで最近スイッチサイエンスでも扱われるようになったし、ほんと実行速度がもう少し速ければすごい流行ると思う。

WEB+DB PRESS Vol.84
WEB+DB PRESS Vol.84
posted with amazlet at 14.12.23
藤 吾郎 桑野 章弘 福永 亘 谷井 靖史 野村 晋之介 蛭川 皓平 岡田 友輔 藤本 真樹 伊藤 直也 宮崎 靖彦 佐藤 健太 高橋 俊幸 佐藤 太一 海野 弘成 佐藤 歩 泉水 翔吾 渡邊 恵太 舘野 祐一 中島 聡 橋本 翔 はまちや2 竹原 伊賀敏樹
技術評論社
売り上げランキング: 455

0

UX基金

ユーエックスの話はもう聞きたくないので1000円を数えることにした



hubot script UX1000円

module.exports = (robot) ->

reply = (msg) ->

who = msg.message.user.name
count = (robot.brain.get(who) or 0) + 1
robot.brain.set who, count
msg.send "@#{who} UX#{count*1000}円"

robot.hear /ux/i, reply

register_censor = (word) ->
robot.hear new RegExp( word.split('').join('.*'), 'i' ), reply

register_censor 'ユザエクスペリエンス'
register_censor 'ユザ体験'
register_censor 'ユエックス'
register_censor 'userexperience'

適当なマッチングはtomblooのタグ補完を参考にした。

linuxって発言できなくなってしまった

0

tesselに日本語を喋らせるnpmライブラリ作った

そういえばtesselに日本語を喋らせるをnpmにしたのだった
書くの忘れてた

https://www.npmjs.org/package/audio-vs1053b-textspeech


インストール

% npm install audio-vs1053b-textspeech


使う

まずaudioモジュールにスピーカーを接続しておく。

こんな感じでaudioモジュールをtextspeechモジュールに食わせてセットアップし、
var audio = require('audio-vs1053b').use(tessel.port['A']);
var textspeech = require('audio-vs1053b-textspeech').use(audio);

audio.on('ready', function(){
audio.setVolume(20, function(err){ // 音量調整
console.log('audio setup');
// この後に喋ったりさせる
});
});


簡単に喋らせれる。日本語でおk
textspeech.speech('こんにちは'); // japanese
textspeech.speech('hello world', {tl: 'en'}); // english

なお初めてしゃべる言葉はgoogle翻訳にmp3を取りに行くので10秒ぐらいかかる。
2回目以降はオンメモリのキャッシュに入っているので、すぐ発声できる。
でもaudioモジュールの通信がUARTなので、同時に他のセンサ系モジュール使ったりしてるとそっちのUARTもバリバリ通信おこなわれて、途切れ途切れになってちゃんと喋れなくなる。

tesselはaudioとかカメラとか大きなマルチメディアデータやりとりする系のモジュールがウリっぽい所あるのに、それ使ってると他のモジュールが動かなくなるのはなんかつらい。そもそもtesselのCPUであるARMから拡張ボード用に4つUART出してるけど、たぶん全部ソフトウェアUARTだから、ファームウェアの実装を効率化してもどうにかなる気がしない。どうするんだろ。


あとキャッシュのサイズも指定できる
textspeech.setCacheSize(5); // default is 3


前に書いたとおり(おそらく)streamのバグがある状態の上で妥協する感じで実装しているので、そのうち仕様変わるかもしれないので最新情報はnpmjs.orgのほうのドキュメント見てください

0

Web+DB Press vol.83でHueについて書いた

前:Web+DB Press vol.82にJawbone Up24について書いた


書いた

今日(10/24)発売のWeb+DB Press vol.83にphilips hueというプログラマブル電球について書いた。

WEB+DB PRESS Vol.83
WEB+DB PRESS Vol.83
posted with amazlet at 14.10.24
原田 騎郎 吉羽 龍太郎 山口 陽平 青木 雅弥 松下 誠太 三宅 英明 高橋 征義 南川 毅文 伊藤 直也 海野 弘成 高安 洋輝 佐藤 歩 泉水 翔吾 佐藤 太一 横江 直輔 舘野 祐一 橋本 翔 渡邊 恵太 中島 聡 はまちや2 小沢 邦雄 長沢 智治
技術評論社
売り上げランキング: 265

hueはフルカラーLED電球なんだけど、よくある専用のスマホアプリから調光できるLED電球と違ってHTTPから操作できるAPIがある。あとHSV/CIE/Mired色温度などで細かく色指定できたり、電球が点灯しているかどうかもAPIで取得できたりする。

記事ではcurlやRubyでhueを操作したりとか、俺が(家の外で)プログラム書いたりgit commitすると家の電球が明るくなったり暗くなったり色が変わったりして、家族に俺ががんばってる感が伝わるシステムを作ったりした。


天気を電球で表示するプログラムが動かない

3ページ目に書いてあるMSN天気のAPIが消滅してしまった。入稿時には確かに地域ごとにRSSが存在していたんだけど完全に無くなっちゃった


代わりにyahoo天気を使う例をここに書いておきます。weather-report gemを使うと、降水確率は取得できないけど傘が必要そうな天気かどうかはわかる。

require 'hue'
require 'weather-report'

weather = WeatherReport.get '東京'

light = Hue::Client.new.lights.find{|i| i.name == '居間' } # 居間の電球を使う
puts light.name

light.on = true
light.saturation = 80
light.brightness = 255

if weather.today.umbrella?
light.hue = 47000 # 青
else
light.hue = 60000 # 赤
end


これをcrontabとかにセットして朝実行すると、電気ついて起きれるうえに雨ふりそうかとかわかるので、傘を忘れない。

0

RubyのARGV.shift or “default value”

orと||は(優先度とか)違う演算子だという事は知ってたけど、左側がARGVかArrayかでもまた動作が違うとは思ってなかった。Rubyは難しい。


or演算子でデフォルト値をセット

Rubyで、値が無い時にデフォルト値をセットするのによくor演算子を使う。

例えばコマンドラインからの引数を取り出して、何も値が無かったらデフォルト値を使うとかあると思う。

ARGVは配列なのでこうやろうと思った

user = ARGV.shift or "shokai"

引数なしだとARGVは空配列になるから、or演算子の右側のデフォルト値が左辺に渡されると思ったけど、そんなことはなかった。


Array#shift or “default value”ってできないんだっけ?と思ってARGVじゃなくてArrayで試した。こっちはできる。


or のかわりに || を使ったら、空のARGVをshiftした時にorの右側が取り出せた。


念のため確認したけどARGVはArrayを継承してる。でもorと||で挙動が違う・・


結論

orの方が好きだけどこう書く。
arg1 = ARGV.shift || "defalut value"