0

socket.io-client-simple gemをsocket.io 1.1.0に対応した

socket.io 1.1.xに対応した、socket.io-client-simple gem 1.1.2を今朝リリースした。
これを使うとrubyでsocket.ioサーバーに接続できる。

https://rubygems.org/gems/socket.io-client-simple
Comparing v1.0.0…v1.1.2 · shokai/ruby-socket.io-client-simple

1.1.2のクライアントでsocket.ioサーバー1.0系に日本語を送ると文字化けするので注意してほしい。「ああ」が「BB」になったり「はい」が「oD」に化ける。


socket.io 1.1.0


1.0→1.1での変更
Socket.IO — Socket.IO 1.1.0


だいたいbug修正じゃね?と思ってたら、マルチバイト文字列のエンコーディング方法が修正された。

これにより、1.0系のsocket.io-clientから1.1系のサーバーに日本語などのマルチバイト文字を送ると文字化けするし、1.1系のクライアントから1.0系のサーバー通信しても文字化けする。

サーバーとクライアントのバージョンを合わせるか、URLエンコードするかすればいいと思う。


あと、websocket proxy(herokuやnginxなど)を前に建てたsocket.ioサーバーと接続している時に、proxyが生きているけどサーバーが再起動した時などに切断を検知できるようになった

0

tesselに日本語を喋らせる

tesselのaudioモジュールを使うとLine出力でスピーカーに接続し、音がだせる。

再生できるのはmp3とwavファイル。


普通のmp3を再生


こんなコードで再生できる。tesselで実行するjsファイルと同じ階層に”cabbage.mp3″をを置いたら、fs.readFileSyncで読めた。実装をちゃんと追ってないから詳細はわからないがファイルシステムがあるらしい。

tessel-study/audio-play-mp3 at master · shokai/tessel-study
var tessel = require('tessel');
var fs = require('fs');
var audio = require('audio-vs1053b').use(tessel.port['A']);

audio.on('ready', function(){
console.log('audio ready');
audio.setVolume(20, function(err){
if(err) return console.error(err);
var data = fs.readFileSync('cabbage.mp3');
setInterval(function(){
audio.play(data, function(err){
if(err) return console.error(err);
console.log('audio done');
});
}, 2000);
});
});


日本語の音声を再生


強引だけどgoogle翻訳のmp3を取得して再生できた。ただし再生まで10秒ぐらいかかる。

tessel-study/audio-google-say at master · shokai/tessel-study
var tessel = require('tessel');
var fs = require('fs');
var stream = require('stream');
var request = require('request');
var wifi = require('wifi-cc3000');
var audio = require('audio-vs1053b').use(tessel.port['A']);

var led_green = tessel.led[0].output(1);
setInterval(function(){
led_green.toggle()
}, 200);

var getAudioStream = function(speech_text){
return request.get({
uri: 'http://translate.google.com/translate_tts',
qs: {
q: speech_text,
tl: 'ja'
},
headers: {
'User-Agent': 'Safari/1.0'
}
});
};

var say = function(speech_text){
console.log('say:'+speech_text);
if(!wifi.isConnected()){
console.error('wifi is not connected');
return;
}
var buf = new Buffer(10240);
var offset = 0;
var ws = stream.Writable({decodeStrings: false});
ws._write = function(chunk, enc, next){
if(chunk.length > buf.length - offset){
return next(new Error('buffer over'));
}
buf.write(chunk, offset, buf.length - offset);
offset += chunk.length;
next();
};
var req = getAudioStream(speech_text);
req.pipe(ws);
req.on('end', function(){
audio.play(buf);
});
};

audio.on('ready', function(){
console.log('audio ready');
audio.setVolume(20, function(err){
if(err) return console.error(err);
audio.emit('ready:volume');
});
});

audio.on('ready:volume', function(){
console.log('audio ready:volume');
if(err) return console.error(err);
setInterval(function(){
say('うどん居酒屋 かずどん');
}, 30*1000);
say('焼肉ざんまい');
});

stream


本当はaudio.createPlayStream()を使いたいんだけど、ビミョーに再生できるのに音声の最後が切れてしまう。音声の長さに関係なく、最後が切れる。
getAudioStream("ざんまい").pipe(audio.createAudioStream());

audio.createPlayStreamの実装も見たけど、どうもそっちじゃなくてstreamの実装の方にバグがある気がする。

0

hubot-gohanに説明と画像を付けた

hubotがごはんを占ってくれる。

https://www.npmjs.org/package/hubot-gohan

0

Feedlyで今読んでる記事がわかりにくいので強調表示する

今どのフィード読んでるのか、申し訳程度に太字になるだけでわかりにくかった。のでUserStyleSheet作った。
ローマ字のfeed titleだと太字だけでもまあいいんだけど、フィードが1000件購読してると今どこ見てるのかわからなくなる。


https://userstyles.org/styles/106215/feedly-highlight-selected

userstylesheetなのでchromeならstylishが必要

0

FeedlyでRSS購読するbookmarklet

インターネット検索すると、DOMの中からRSSを探してfeedlyで開くブックマークレットしか見つからなくて、ちゃんと発見できなかったり複数のfeedが見つかった時の挙動が気に入らなかったので作りなおした。

[Feedly Subscribe]

feedlyにはfeedを探すAPIがあるので、それにURL渡してるだけ。