2012年12月28日金曜日

LEDネクタイ用の制御基板を更新

右(青い基板)が東京Node学園祭やMaker Faire Tokyoなどで活躍した第2機能試作。左(赤い基板)がFusion PCBで試作したもの。(主に自分のために)変更内容をまとめておきます。

実装部品の点数を減らした

基板上の部品を減らしてサイズとコストと重量を減らしました。というか、今までが多かった。手元にあったArduino Pro Miniが5V駆動だったので、エネループ2本(2.4V)から5V電源を生成。XBee用に3.3Vも生成っていう豪華仕様だったので、電源回路の部品が多かったのです。ここをArduino側も3.3V駆動にすることで電源を共通化し、5V生成部品をまるっとカット。電圧の低下によってArduinoの動作周波数は16MHz→8MHzになるのだけど、実使用上は問題なし。昇圧によるロスが減るので、電池がもう少し長持ちするかなと期待。

LED点灯電流の経路を分離

今まではArduinoの足から直接LEDにつないで、LEDを直接光らせるための電流を出力していました。でもICの役割としてコレはよろしくない。ICは信号をやりとりするものであって、結果として数十mAでも駆動電流を流すのは(ドライバのような専用回路として設計されてない限り)行儀がわるいのです。ICの信号端子から電流のオン・オフを制御する場合、トランジスタをはさみます。これがスイッチのようなはたらきをするので、ICの出力にあわせて分離された回路をオンオフできるようになります。

もう一つ利点があって、Arduinoの足から直接LEDを駆動させるだけの電流を流すってことは、その手前にいる昇圧回路もパワーがあるものを用意しなきゃいけないわけです。このためにLT1302をつかっていたのだけど、これ1個がかなり高いし国内じゃRSコンポーネンツかdigikeyでしか買えないのでクソめんどくさい。電流経路を分離したことによって、昇圧回路は電圧を生成できればよいから、ちょいとチープな回路に置き換えられるのです。この基板ではLT1302のかわりにHT7733-Aを使用。200mAまで出力可とあるけど、ArduinoとXBeeならそんなにいらない(と思う)ので十分でしょう。秋月以外にマルツなんかでも取り扱いがあるので、入手するのも手軽。

互換性をなくしてしまった

ネクタイのLEDが光るっていう半笑い回路でも、ハードウェア屋のはしくれがつくっているので、どうあるべきかはそこそこ考えています。上2つの変更点+ファームウェアの書きやすさを考えると、アノードコモンにしたほうがよいのではないかと思って、出力ピンの配置を変えてしまった。ということは、ネクタイのほうも変えないといけないのです。試作だからいいかなって。

基板にgithubのURLを印字しているので、そこに部品表やファームウェア、説明書きなどを載せておきたいと考えています。が、Eagleの回路ファイルがあるくらいなので年末年始にやるかもしれないし、やらないかもしれません。

Fusion PCBで基板をつくってみたよ

LEDネクタイの裏側には、そのLEDの点灯パターンを制御するために基板がおります。いままではこの基板をユニバーサル基板をつかって組み立てていたのですが、よりギッチギチかつ配線間のショートなどをなくすためにプリント基板をおこすことにしました。

どうやったらつくれるのか

順序をまとめるとこんな感じ。

  1. 回路図をつくる
  2. 回路図上の部品を基板上に並べる
  3. 部品どうしを線でつなぐ
  4. 基板メーカーでつくれるかどうかの確認
  5. 基板製造に必要なデータの出力
  6. メーカーにデータを送付して完成を待つ

今回、回路図をつくってからデータの出力までEagleをつかい、基板製造サービスのFusion PCBにお願いしています。

お願いするにあたって、itogさんのFusion PCBで基板をオーダーする手順を参照しました。が、今はすこし順番が変わっています。オーダーの部分は一番最後になり、Zip圧縮した必要なデータをオーダーのときに同時にアップロードします。注文番号はSeeed Studio側で基板上に適宜記載するらしく、ぼくの場合は裏面のスカスカな部分にちょろっと記載してありました。

Fusion PCBがすごい安くてビビる

Fusion PCBにした理由は安かったからです。5cm×5cmで緑レジストの基板が10枚で約10ドル。送料は別途で、国際郵便だと3ドルくらい。今回は赤いレジストと鉛フリーのめっき(?)的なオプションを増やしたぶん追加料金があったけれど、それでも送料込みで30ドル弱。

できあがりがコレ

発注から到着までがすごく早かった。12月13日の夜にデータをアップロードして注文、翌日には早速製造中に。土日のお休みを挟んで17日には発送されてた。送料の安い国際郵便にしたら、土日を含んで10日で到着。もう少し高い配送方法を選んだら、もっと早かったでしょうけれど、これでも十分早いっていうね。安いけど一枚ずつちゃんと検査が入っているみたいです。安いし早いし最高じゃないですか。

2012年12月24日月曜日

2012年のまとめ

今年はもう大きなイベントないしね。今年はいろんなことがあって、やっぱ外に出ていかないとダメだなと思った年でした。

第1回ペアプロ合コンに予選落ちする

モテようと思ってペアプロ合コンに応募するも、クライアントの要望にあったWebアプリを作れずに予選落ち。応募者多数のため急きょRubyとPHPに絞って予選を行うこととなり、「RailsとデータベースをつかったWebアプリをつくれ」といわれ、「EventMachineとシリアル通信を使ったWebオシロスコープ」を作り提出。結果として合コンには出られずRuby嫌いになりましたが、すべてNode.jsを使って書き直したことによってその後大活躍していただきました。結果は残念でもここから始まった気がする。

勉強会での発表が増える

先述のオシロスコープを筆頭に、電気回路とWebブラウザを組み合わせてあれこれつくったものを発表してまわったり、勉強会を開催したりなどしました。Make Ogaki Meeting / Maker Faire Tokyoと東京Node学園祭が特に思い入れ深いすね。いずれにせよ、なんらかの勉強会に出るときは、発表者に回ったほうがよいと思いました。他の参加者や登壇者からいろんなアドバイスやリアクションを、向こうから話しかけてきてくれます。それがきっかけで楽しい話が進んだりなんかもするしね。

クラブ活動が増えた

名古屋と東京のクラブイベントに遊びにいくことが増えました。でもなんとなく怖いので、日本語の曲、特にアイドルの曲ばかりかかるイベントを中心に。フロアだとおうちのスピーカーと違って楽しいし、夏の申し訳ないとサマーフェスではトマパイのライブも観れたし最高。名古屋で遊びにいったイベントはどれもVJがイルでやばかったです。今年の残りイベントはいまのところ年末の申し訳ないとSPのみ。

今年の残りと来年

今年はまだ、Fusion PCBでつくった自前の基板が届くというイベントが残っています。発送から1週間、そろそろ届いてもと思うのですが、成田空港で止まっているようです。

来年はそろそろ東京へ引っ越したいなと。いい仕事場があればいいのですが。

2012年12月13日木曜日

Wi"LL" Viに自転車を積むたったひとつのさえたやりかた

この記事はLL/ML Advent Calendarの13日目です。

WiLL Viがかわいすぎて生きるのが楽しい

俺の嫁ことWiLL Vi。みなさんご存知トヨタが誇る唯一の名車でございます。まーこれがものすごくかわいい。篠田麻里子と同じくらいかわいい。無人島になにか一つもっていくならば間違いなくWiLL Viだ。WiLL Viのどこがどれだけかわいいかは、過去のエントリを参照ください。

iMac between the sheets of WiLL Vi

そんなWiLL Vi、ヴィッツがベースなのに意外と荷物が積めるのです。できるだけ一緒にいたいので、積める荷物はできるだけ積んでどこへでも行きたい。27インチiMacは後部座席にギリギリ入るし、ちょっとした工夫で自転車も積める。今日はみなさんに自転車を積む方法をご紹介します。ぜひおためしください。

IMG_0714

1. 輪行袋に詰める

IMG_0715

タイヤを外して、フレームを輪行袋に詰めます。通常の輪行ではタイヤも袋のなかにいれますが、今回は別々にしておきます。フレームのほうはサドルと後輪タイヤ部で直立できる状態にしておきましょう。

2. タイヤはトランクに

IMG_0716

袋に入れなかったタイヤは、トランクにいれましょう。このためにつくったかのように、奥行きはぴったりです。

3. フレームを後部座席の隙間にはめこむ

IMG_0717

ここが重要。後部座席の足元には、左右のシートをわけるように突起が出ています。ここにフレームを、シートポストがまたぐように、サドルと後輪を下にして差し込みます。ペダルは座席の上に浮かぶように調整しておくこと。

これで小さな車体に無事自転車が収まりました。このまま出かける際にはいつも以上に慎重な運転を心がけましょう。

2012年11月25日日曜日

Maker Faire Tokyo 2012に出展してきます

Maker Faire Tokyo 2012

12月1日(土)・2日(日)に台場の科学未来館にて開催されるMaker Faire Tokyo 2012に、Node.jsを利用したハードウェアを持って出展してきます。

WebブラウザとArduinoでつくるオシロスコープ

Arduinoで電圧を読み、Webブラウザに表示させるオシロスコープを展示・実演します。どんな端末でも表示できる強みをアピールしたいところですが、会場内の無線LANは不安定になりそうなのでスタンドアローンでの実演です。

光るネクタイ

LED電飾を埋め込んだネクタイも展示します。ネクタイの裏にいるArduinoとMacをつなぐZigBeeは無線LANと同じ周波数帯なので、こちらも当日うまく動いてくれるか心配なところ。当日の実演はiPhoneシミュレータを使う予定です。

テーブル配置を確認したところ、ぼくの背中側にはガンガンにキラキラしている方がいらっしゃるようです。負けないようにがんばります。

2012年11月24日土曜日

2012年も東京Node学園祭に行ってきたよ

東京Node学園祭、昨年に続いて参加してきました。しかも今年はLT登壇者として。まさかこんな日が来るとはね。

おもしろハードウェアが増えた

手前みそでございますが、自分の興味ある話に注目しちゃいますよね。去年は、Yahoo!の路線バス追跡と、LTのKinectの2本。今年はリクルートさんの脳波でデバイスをコントロールする話を筆頭に、LTがぼくを含めて3本。いずれもNode.jsをハブとしていろいろな機器・機械を制御するという内容でしたが、Node.jsとその周辺機器とのつなぎ方、動作のトリガーがそれぞれ違っているので、そんなこともできるのか!と思ってもらえれば幸いです。

できるだけ話す側にまわったほうがよい

LT枠にて、「光るネクタイをNode.js経由で制御」という発表をしたのですが、これによって「ああ、あいつね」となりいろいろ話しかけてもらえました。外国の方(すみません名前を聞かなかったです)からjohnny-fiveというArduino制御モジュールを教えてもらったりなど、「他人の発表を聞いて学ぶ」だけじゃなく「自分よりも詳しい人からアドバイスをもらえる」という経験ができました。

知識の増え方が加速するので、「来年こそは」と思った方はぜひ。こういった形で循環が進んでいくといいですね。そして、こんな素敵な経験ができたのは運営の皆様のおかげです。ありがとうございます。

2012年11月4日日曜日

iPhoneとArduinoを、XBeeとNode.jsでつなぐ。その2。

東京Node学園祭2012 アドベントカレンダーの21日目ぶんになります。ひとつまえの記事にて、Node.jsとXBee ZBを使ったiPhone〜Arduinoの無線制御について書きました。このときからのアップデートについてまとめます。

XBeeをAPIモードでつかう

前回の内容では、XBeeを透過モードで使っていました。ここをAPIモードにかえています。これによってXBeeボードに搭載されているAD変換のモニタリングなどが使えるようになる一方、きちんとパケットを組み立てなければならなくなっています。透過モードではシリアルポートに値を入れれば、それがネットワーク内のすべてのXBeeにそのままの値で飛ばされるので、周辺のコードを書く分には楽なのです。が、特定のモジュールにだけ飛ばすとか、XBeeボードのちょっと便利な機能を利用できないという弱点があるのです。

XBeeボードの詳細については、オライリー・ジャパンから出版されているXBeeで作るワイヤレスセンサーネットワークを参照ください。

node-xbeeを使う

Node.js〜XBee〜Arduinoとなりますが、Node.jsとXBeeの間はnode-xbeeという便利なモジュールを使っています。基本的にシリアルポートを経由しての通信はかわらないのですが、0x7Eのパケットの節目ごとに切り取ってくれたり、パケットの中身をオブジェクトに分解してくれたり、送信時には逆にパケット長やパリティを付加してくれたりなど、よきに計らってくれる機能を実装しています。

全体の構成

DaiNagoya_v4.010

APIモードのAD変換機能を、基板上の電源電圧の監視につかっています。XBeeでAD変換の後Node.jsに投げて、WebSocket経由でiPhoneへ飛んでいく部分。ここはオシロスコープの経験を流用しています。ソースコードについてはgithubをごらんください。動かしている様子はこちら。

iPhoneとXBee/Arduinoが直接つながっているように見せたくて、Node.jsの動いているMacは画面の外にしてしまいました。LEDが全部点灯すると引き込まれる電流が増えるため、エネループが電圧降下をおこしている様子がiPhone上のグラフから読めると思います。

さいごに

2011年の東京Node学園祭より。Node.jsという名前の由来について、「グラフ理論のノードが由来。今はまだNode.jsをノードとしたノードは少ないけど,これからそれらがどんどん多くなるのを期待している」とRyan氏。いままでつなげることが難しかったデバイス同士を、Node.jsがノードとなってつなげている例と言ってもよいのではないでしょうか。

2012年10月18日木曜日

Node.jsとXBeeの助けを借りて、iPhoneからArduinoを動かす

iPhoneからArduinoを動かしたいとき、iPhoneには自作の外部ハードウェアをほとんどつなげられないことが障壁になります。そこで頼りになるのがご存知Node.js。iPhoneからNode.jsへはWebSocketを使い、Node.jsからArduinoへはnode-serialportを使います。今回はArduinoも無線の先におきたかったので、Node.js→シリアル通信→XBee→Arduinoといった形をとっています。最終的にiPhoneからArduinoのLED点滅パターンを変えてみます。

全体の流れ

  • iPhone
    Node.jsの提供するWebSocketサーバに接続。制御コマンド(アルファベット1文字+数字1文字)を送る。制御コマンドはアルファベット1文字+数字1文字で、自分で勝手にきめたもの。
  • Node.js
    WebSocketサーバを立てて、iPhoneからのコマンドを受信。node-serialportを通してXBeeモジュールに送る。
  • XBee
    透過モード。Node.jsが投げた文字をそのままもう一方のXBeeモジュールへ投げるだけ。
  • Arduino
    XBeeモジュールとはシリアル通信で接続。読み取ったコマンドをもとに、LEDを光らせる。

Arduino側

IMG_0800

XBeeで作るワイヤレスセンサーネットワークを参考に、ArduinoとXBeeモジュールとをシリアルで接続しています。XBeeのパケットからコマンドをよみとり、それに合わせてLEDの点滅パターンを変えています。

Node.js側

var express = require('express')
  , app = express()
  , server = require('http').createServer(app)
  , io = require('socket.io').listen(server);

server.listen(3000);

app.configure(function(){
 app.use(express.static('static'));
 app.use(express.logger());
 app.use(express.bodyParser());
});

app.get('/', function(req, res){
 // index.html に、iPhoneで表示するボタンやスライダーを配置
 res.sendfile(__dirname + '/index.html');
});

// シリアルポートの準備
var serialport = require('serialport');
var SerialPort = serialport.SerialPort;
var sp = new SerialPort('/dev/tty.usbserial-AE01CQBA', {
 parser: serialport.parsers.readline('\r\n')
});

io.sockets.on('connection', function(socket){
 // iPhoneからWebSocketのパケットが来たら……
 socket.on('value', function(data) {
  // 書き込みデータをつくって
  var xbeewrite = [data.state.charCodeAt(0), Math.pow(2,data.value)-1];
  // XBeeに送信
  sp.write(xbeewrite);
 });
});

WebSocketサーバ+Webサーバ。Webサーバは、WebSocketを送るためのインタフェースを出すだけ。ボタンやスライダーで、iPhoneから制御しやすくするためです。

WebSocketを受け取ったあとは、node-serialportのWriteを使ってXBeeへ送ります。配列に入れているのは、write関数の実装によるもの。.lengthを参照できるものでないとダメなので、文字列or配列ならOKだけど、整数や数値1つはダメ。1バイトだけ送るときも[かっこ]でくくって配列にしないとダメなのです。

最後にデモ動画を

2012年10月6日土曜日

ITコミュニティで発表するようになって変わったこと

カルカルのITコミュニティ秋祭りに知っている人が2人も出ていたので、触発されてぼくの経験を書いておこう。

そのまえに、ぼくのお仕事について。名古屋から少し離れた田舎で、ハードウェアの設計と評価をしています。コードをお仕事で触ることといえば、マイコンの中に書き込むソフトウェアを少しいじる程度。まったくITとは関係のないお仕事で、IT的なことと言えば仕事以外の時間にWebアプリやArduinoをつかったおもちゃを作っているくらい。学生のころからPerlはちょいちょい触っていまして、IT屋さんの採用面接にiPhone(当時は3Gが出た直後)で動くWebアプリを持ち出したりなどしていましたが。

最初に参加したコミュニティ

昨年…と思ったら一昨年でした。2010年8月開催の「名古屋でPerlをゆるく語る会」の2回目。2010年に今の会社に入ってからすぐに、この環境に居続けたくないなーと思い始めまして。IT勉強会カレンダーで名古屋の勉強会を探していたらそんな名前の勉強会(?)が。「ゆるいならいいかなー」くらいの気持ちで出ていって、Nagoya.pmが立ち上がるまでぽつぽつ顔を出していました。「名古屋でPerlをゆるく語る会」は、今はなき栄のCafeどえりゃあ(電源・無線LANが使える)にて、ごはんを食べつつPCを持ち寄って文字通りゆるく語る場で、特に発表とかはないものでした。

最初の発表

最初の発表はNagoya.pmの第2回にて。MIDIシンセサイザーでHTMLをいじる発表をしたのが最初です。まだ1年経ってないんだねえ。

この発表の前にちょっと転機がありまして。2011年になってからかな。その場で常連参加者の@trinityCRZさんがしきりに「Node.jsはいい」と言っていたところからNode.jsを知り、Arduinoと組み合わせたりなどしていました(この辺の時系列はよく覚えていません)。ついカッとなって東京Node学園祭に行ったりもしました。Node学園祭の発表がすごかったと@do_akiくん(上記秋祭りの登壇者ですね)に話したところ、「すごいのはわかった。ところで君は何をやったの?」と。受けるだけじゃなくて、出していかないとと。この言葉はかなり響きました。で、先の発表につながっていったのです。みんなIT系の人っぽいから、ハードウェア屋さんってところを推していこうかなーという方向も、この頃から出てきていました。

やっぱり人生が変わってきてる

ちょっとかっこよく言うと、そんな感覚なのです。マジで。

特に東京Node学園 7時限目で、その他ちょこちょことブラウザで動くオシロスコープの発表をして、少しずつ人生が変わってきてるかなと。発表を聞いて面白がってもらえているという感覚がまず嬉しいし、発表を続けていって似たようなことをやっている人が他にもいるとわかることが自信と動力につながっていくのです。ぼくの場合は外での発表がお仕事でやっていることではないので、次々と新しい内容には出来ないけれど、自分が好きでやっていることを面白がってもらえるなんて嬉しいし盛り上がるし最高じゃないですか。

Node.js+ハードウェア(+Web)っていうIT屋さんがあまりやっていない分野に、ハードウェア屋の俺様がしゃしゃり出ていくというやり方。まだしばらく続けていこうと思います。ソフトも面白いけど、回路だって面白いぞという気持ちをこめて。あまりやってる人がいないから、埋もれないしね。

そして、@do_akiという素敵な友人がいて本当によかった。少しずつ、外の人を巻き込み始めてるじゃん。やるじゃん。

2012年8月31日金曜日

Node.jsとHTML5でつくるオシロスコープ

EventMachine版から半年、Node.jsとWebブラウザでオシロスコープをつくるしくみをまとめます。

処理の流れ

内部の動きを順に並べると、次のようになります。

Arduino

  1. Arduinoのmillis()で時間を読み出す
  2. analogRead()で電圧を読み取る。
  3. "時間,電圧"のように、カンマで区切った文字列を、シリアル通信で送る。

Node.js

  1. Socket.IOでWebSocketサーバをたてる
  2. シリアルポートを監視
  3. シリアルポートにArduinoからデータが来たら、WebSocketでブラウザに送る。

ブラウザ

  1. Socket.IOでWebSocketサーバにつなぐ
  2. WebSocket経由で時間・電圧の文字列を受けたら配列に保存
  3. Canvasを使い、配列からグラフを描画する。
  4. グラフの描画を定期的に繰り返すことで、アニメーションにする。

が、オシロスコープの簡単な流れ。Arduinoで取得した電圧の読み値が若干の遠回りをしているので、微妙に遅れて表示されてしまうのが弱点。

ソースはgithubに載せています。が、もっと汎用性を高めないと。うちの環境の痕跡が若干残っています。課題です。

2012年8月27日月曜日

Make: Ogaki Meeting 2012に出展してきました

8月最後の土日、岐阜県は大垣市で開催されたMake: Ogaki Meeting 2012に個人で出展してきました。

Make: Ogaki Meetingってなんぞ

目にみえる、触れる作品をつくって発表する場なのです。電気回路を利用した作品が多いのだけど、編み物や木工などもあり、自分でつくって楽しんでいるものならみんなで持ち寄って楽しもうという感覚です。個人・団体も関係なければ、仕事も趣味も区別なしといった様相。Makeの動き・取り組みなどの詳細は、オライリー・ジャパンのサイトを参照ください。

こういった集まりはいつも東京開催が主だったのですが、大垣市に拠点を置くIAMAS/情報科学芸術大学院大学を中心に大垣市・岐阜県が力をあわせて、地方開催を行なってくれています。今回は2010年の初開催に続いて2回目。

オシロスコープと光るネクタイを持ち込んで

自分でつくって自慢をしてきました。写真を残していなかったので、Twitterに載せてくれていたものを拝借しています。感謝。

オシロスコープについて。Arduinoで読み取った電圧を、Webブラウザに表示するというだけのもの。電圧の発生源に距離と振動の各センサをつかったので、自分の動きが違う形で見えるってところが特にお子様連れにウケまして。仕組みはわからないけど動くから面白い、みたいな状態になってくれたのはうれしい限り。

ぼくよりもわかる方も当然いらっしゃるわけですが、そういう方ほどぼくの気づいてない指摘・知恵なんかを渡してくれるのです。こうなりたいと思わせる方ばかり。

このオシロスコープ、バックエンドはNode.jsが支えています。Node.js meets Arduinoな展示を行なっている方がちらほらいて、この方向は間違ってなかったなと安心しました。イベント駆動プログラミングとハードウェアは相性が良いと言い続けていてよかったです。

もうひとつ。LEDがチカチカ光るネクタイ。意外にも女性(と女性にみえる男性)から圧倒的支持(感覚的に)をいただきました。「その光っているネクタイかわいいですね!」とか声をかけてくれたりして、"ついに!やってきた!おれの人生の!好景気!"なんて、モテキだったら気分上々ばりにうかれたりもしました。

このネクタイの元ネタはクラフトワークのステージ衣装なのですが、これを一発でわかった方があしやまひろこさん。さすがはLEDエンベデッドなウェディングドレスを展示・着用してらっしゃったかた。このドレスがすごかった。設計はくとのさんなのですが、見た目はもちろん、複数段のヒューズなど安全対策の回路の作り込みも素晴らしい作品です。いろいろ事情があったとのことですが、ぼくら趣味で遊んでいる者が手を抜きがちな地味な部分、表に出ない部分まで作っているのは見習わなければなりません。

反省点

もう少しディスプレイに力を入れるべき。展示物についてとか、動かし方とか、紙などに出力した上で展示しておけばよかったです。ひとりのブースなので、ぼくがいなくなると誰も説明しなくなるということを考えていなかったです。紙なら電源を必要としないので、いろいろな心配をしなくてよいし。

もうひとつ。やはり見せ方なのですが、どうしてもこじんまりしてしまうので、スペースの使い方をうまくかんがえないといけないです。結局は、つくるのは楽しいが、そこで終わりじゃダメってこと。どうやってうまく人に伝えるかを考えないといけませんと学びました。

12月には東京でまた開催されるそう。反省を生かして、もっとおもしろがってもらえるようがんばります。

2012年7月15日日曜日

クラフトワークのLEDネクタイをつくってみた

先日、クラフトワークが来日したときいて、いつかあのLEDネクタイを作ってやろうと考えていたのを思い出しまして、今なら資材も手に入るし知恵もついたしってことで勢いで作ってみました。

なんだLEDネクタイって

クラフトワークが近年のライブにて着用する衣装のひとつ。スーツをバキッと着込み、シンセサイザーを前に直立不動で演奏するメンバー。無表情なのにネクタイだけがチカチカ光るというところがうっかりおもしろいのです。

どうやって

IMG_0963
裁縫が雑で恐縮です

この実装では電池以外をネクタイの裏にすべて収めることとしました。電池も同じ位置におさまるとよいのですが、それだとボタン電池を使うのが現実的になります。使い捨てのボタン電池は気分的に避けたかった(ゴミ捨てが面倒)ので、エネループとすることに。

エネループ2本の電圧(1.2V×2=2.4V)を5Vに昇圧し、Arduino Pro Miniに供給。ArduinoからLEDを駆動させます。Arduino〜LED間は導電糸を通してつないでいます。

エネループ→Arduino間について

Arduino Pro Miniは5V駆動と3.3V駆動とがあるのですが、ボタン電池は1枚で3.0Vだし、単3電池は2本で2.4〜3.0Vだしってことで、いずれにせよ昇圧回路の実装が必須になります。昇圧回路は"なんでも作っちゃう、かも。"のミント缶USB充電器 for 携帯電話を参考に、リニアテクノロジーのLT1302を使って実装。ArduinoからLEDを駆動させるために多少大きめの電流が流れても電圧がぶれず優秀でありますが、国内ではRSオンラインでしか取り扱いがないらしいのが困っちゃうところ。少なくとも秋葉原にはなかった。

Arduino→LED間について

導電糸を使って、ネクタイの裏側に配線を縫い込みます。かなり久々のお裁縫。リード型LEDをネクタイに埋め込むには、位置決めのあとミシン用の太い針でぐりぐりして穴を開けます。そのまま刺そうとしても、布地が多層基板状態なので入りません。

導電糸について。電気を通す加工を施した糸で、ぼくはスイッチサイエンスさんから購入しました。銀かなにかを染み込ませて導通をとれるようになっているようです。導電糸の種類にもよるかもしれませんが、購入したものはざっくり20cmで10Ωくらいの配線抵抗をおもちの様子。ArduinoとLEDの間に入れる抵抗に比べれば小さいのでこの実装ではあまり気にしてませんが、電圧がきっちりシビアに必要な場面においては気配りが必要です。

もうひとつ。裁縫ではあたりまえなのかもしれませんが、導電糸をけちってギッチギチにすると、布地が引っ張られてネクタイが微妙にカーブします。実際困ってます。

光らせてみる

微妙に接触が悪いのがちょっとね。とはいえまずはこんな具合で。着るとこうなります。


まともな鏡を買おうと思う

これから

電源をどうするか問題。シャツの隙間から中に入れたりとしても、どこかで固定しなきゃいけない。ベルトかな。あとは、来月のMake Ogaki Meetingで自慢しますってところで。

2012年6月8日金曜日

Google ChromeでDJきどり

Web Audio APIをつかってDJごっこのテスト。

Chrome DJ - jsdo.it - share JavaScript, HTML5 and CSS

これはなに?

2つの音楽を適宜つないでいきます。URLに音楽ファイルのURLを入れてEnter。Startボタンをクリックすると、ファイルを読み込んだ後に再生されます。再生までは時間がかかりぎみなので、しばし待つべし。Crossはクロスフェーダー。左右に動かすと音が重なります。これらは全部Javascriptで。Google Chromeに実装されている、Web Audio APIをつかっています。

Web Audio APIって?

Google Chromeに実装されている、Javascriptで音声ファイルを扱うためのAPI。XMLHttpRequestでファイルを取得し、エフェクタなどのAPIを通した後出力するのがおおまかな流れ。再生中でもパラメータをいじるとリアルタイムに反映されます。

UIを考えるのがめんどうだったとはいえ、使いにくさが半端ないですね。djayとかを購入したほうがいいと思います。

June 6th: UIを書き直しました

さすがに殺伐かつ簡素なUIがすぎたので、書き直しました。読み込みに少し時間を要しますが、つまみとスライダーが表示されます。縦スライダーはBPMの調整、2つのつまみは上:ハイパスフィルタ、下:ローパスフィルタです。横スライダーはクロスフェーダーです。つまみはjqskinを利用して実装しています。

注意

Web Audio APIは基本的にGoogle Chromeのみに実装されているので、それ以外のブラウザでは特に何も表示されません。 It's exclusive to Google Chrome.

再生したい音楽ファイルのURLを入力したあと、Enterキーを押してください。キーがトリガーになります。残念な実装なのはわかってますってば!

Startボタンを押すまでは、各種つまみは動きません。

あなたのお気に入りのチューンでロックしたいときは、127.0.0.1以下にファイルを配置し、そのURLを入力してください。このとき"XHR Error"が出る場合は設定が必要です。音楽ファイルはXMLHttpRequestで取得してくるのですが、この取得先は表示しているページと同じドメインである必要がありました。過去形なのは、各ブラウザでこの制限をゆるめつつあるからです。XMLHttpRequestで投げたリクエストに対するレスポンスのヘッダ中に"Access-Control-Allow-Origin: *"が設定されていれば、ブラウザはレスポンスを有効にするのです。*はワイルドカードなので、特定のサイトも指定できます。今回の場合はjsrun.itを指定ですね。これを設定しても同様のエラーが出るときは、URLがまちがってたりとか。ブラウザに直接入力して、404などでないことを確かめてみてください。

2012年5月20日日曜日

ArduinoからWebSocketサーバへ、socket.ioをつかって接続するには

ArduinoにEthernet Shieldを積んで、WebSocketを使うときのKUFU。

WebSocketをつかうには

WebSocketClientというライブラリが公開されているので、それをつかって。Zipファイルをダウンロードしたら、Arduino.app/Contents/Resources/Java/librariesに展開。Arduino.appを再起動すると、Scketch→Import LibraryとFile→ExamplesにWebSocket関係の項目が追加されます。Mac以外の場合は知りません。然るべきディレクトリに解凍してください。

サンプルをうごかしてみる

#include "Arduino.h"
#include <Ethernet.h>
#include <SPI.h>
#include <WebSocketClient.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 2, 100 };
char server[] = "echo.websocket.org";
WebSocketClient client;

void setup() {
  Serial.begin(9600);
  Ethernet.begin(mac, ip);
  client.connect(server);
  client.setDataArrivedDelegate(dataArrived);
  client.send("Hello World!");
}

void loop() {
  client.monitor();
}

void dataArrived(WebSocketClient client, String data) {
  Serial.println("Data Arrived: " + data);
}

もともとのサンプルから、7行目にbyte ip〜を追加、13行目の引数をmac→mac, ipに変更しています。ipは適宜変更していただいて。ipが指定去れていない場合はDHCPとなりますが、試したArduino DuemilanoveとEthernet Shieldの組み合わせせはIPアドレスの取得に時間がかかり、echoサーバにつながっていないようでした。固定IPアドレスにすることでDHCPの時間をカットできます。

socket.ioをつかったWebSocketサーバにつなぐ

WebSocketサーバでsocket.ioをつかっている場合、これはちょっと特殊。そもそもWebSocket = socket.ioではなく、WebSocket ⊂ socket.ioといった具合。WebSocketが使えない・対応していない状況ではXMLHttpRequestやCometなどの代替手段でWebSocketふうの接続をまかなうのがsocket.ioなので、微妙に変えてあげる必要があります。

// Arduino (Client)
#include "Arduino.h"
#include <Ethernet.h>
#include <SPI.h>
#include <WebSocketClient.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 2, 100 };
char server[] = "192.168.2.1";

WebSocketClient client;

void setup(){
  Serial.begin(9600);
  
  Ethernet.begin(mac, ip);
  delay(1000);
  if(client.connect(server, "/socket.io/1/websocket/", 3000)){
    client.setDataArrivedDelegate(dataArrived);
    //client.subscribe("atime");
    delay(1000);
  } else { while(1){} }
}

void dataArrived(WebSocketClient client, String data) {
  Serial.println("Data Arrived: "+data);
}

void loop(){
  client.monitor();
  
  //send a message
  String message = "{";
  message += "\"millis\":";
  message += millis();
  message += "}";
  
  client.send(message);
  delay(1000);
}

// Node.js (Server)
var io = require('socket.io').listen(3000);

io.sockets.on('connection', function(socket){
  socket.on('atime', function(data){
    console.log(data);
  });
});

クライアント側はこのスライドを参考に。でもコレ、ちょっと怪しい箇所があるので、動くものに書き直ししたのが上のもの。サーバ側のNode.jsは基本的にサイトのサンプルのまま。重要なのはクライアント側のclient.connectの部分。第2の引数をsocket.ioの仕様にて定義されているとおりに指定するだけ。プロトコルのバージョンを示している1と通信方法を示しているwebsocketの部分は基本的に変えません。socket.ioの部分が名前空間を示しているので、任意の名前空間を使用する場合には適宜書き換えとなりますここは試していますがうまくいきません。destroying non-socket.io upgradeというメッセージがコンソールに表示されているところ。socket.ioを使うサーバとWebSocketでやりとりするならコレでOK。

問題点

何らかの原因でサーバとクライアントとの接続が切れたとき、ブラウザ上のsocket.ioでは再接続のタイミングをねらって待機しますが、この実装ではそういった点は考慮していません。この実装ではリセット以外に再接続の方法はないので、必要ならうまいことスケッチに追加する必要があります。

もうひとつ。最後のdelay(1000)は1秒待てですが、これがないと3〜5msおきにメッセージを投げ続けます。このときに、Ethernet Shield上のチップが結構熱くなるのが心配。常温環境でもパッケージに触るといい具合に熱が伝わってくるので、あったかいところでは気がかりです。

2012年5月7日月曜日

アシッドたんぱ大放送復活スペシャルにいってきた

"日本の平均的かつ最先端のクラブ"でおなじみの渋谷アシッドパンダカフェ。アシパンのポッドキャスト公開録音イベントに行ってきたよ。Dommuneを参考にした2部構成で、1部にトーク。2部にDJミックス。

第1部は店主の高野政所さんトークショー。トップ5の裏話を。おかしな名前のゲストが呼ばれた背景などを、当人を交えてのお話。録音してポッドキャストの予定だったのですが、録音に失敗していたとのこと。現場とUstreamのみのお楽しみになってしまったので、ここには書きません。

2部のDJミックスがすごかった。高野政所 a.k.a. DJ JET BARONとプリキュアおじさん2人のDJで、先発はDJ JET BARON。Funkotが楽しくて盛り上がるのは当たり前で、それ以上に政所さんがかっこいい。曲にノリつつもびしびし選曲をすすめる。代官山の申し訳ないと年末スペシャルでも政所さんのDJは聞いていたんだけど、あのときは照明でよく見えなかったんだよね。DJブースとの距離が近いのがアシパンのいいところ。

そしてプリキュアおじさん(=プリキュアにはまりすぎるあまり、政所さんに命名された)のDJ。プリキュアを見たことないし曲も知らないけど、確実に楽しいDJミックス。政所さん曰く、曲を聞きすぎているから完璧につないでいくとのこと。みんな聞ける機会をつくって聞きにいくべき。加えてVJもプリキュアおじさん自身が。というか他の人では無理だろうと。一人二役をバキーッとこなしてフロアを盛り上げるプリキュアおじさん、こういう大人になりたいと思いました。

"アシパンこわい"という声はありますけども、アシパンがこわいというよりも、初めて飛び込む場所がこわいってことかなと。初めて参加する勉強会はなんとなくこわかったりするしね。アシパンの中の人はみなあったかいというか、自分たちが楽しいと思ってることを一緒に楽しんでくれる人なら心のハードルは下がるじゃないですか。アシパンこわくなかったよ。

2012年4月30日月曜日

iOSの音声変換の精度が高すぎてビビってたじろぐ

iPhone 4Sでは音声から日本語を入力する機能が搭載されています。その変換精度がヤバいという話。

日本語はめんどうなもので、同じ読み仮名でも違う意味の言葉や、読み仮名も発音も全く同じなのに意味の違う言葉なんてものが存在します。上がその例。"うたまるさん"は当てられている漢字が違うだけで、発音は両者ともに同じ。これをSiriのシステムは完璧に使い分けるんですな。

もちろん"うたまるさん"だけでは、どっちかの判別は無理。ぼくの場合、1回目は"宇多丸さん"と変換されたので、おそらく変換履歴でも見ているのだろうと。だいたいの人は歌丸さんだと思います。

これに前後の尾ひれがつくと、変換の分岐が完璧になります。"らいむすたーのうたまるさん"のときに、後半が歌丸さんになることが(いまのところ)起きません。逆もまた然りで、"らくごかのうたまるさん"では想像通りの変換結果になります。単語じゃなく、文章(単語のつながり?)で判定していることがわかります。

もうひとつ。"うたまるもうしわけじゅにあ"なんて面倒な日本語も一発。後ろに"申し訳"がついているってことは、ここは歌丸ではなく宇多丸だなと判定していますね。

辞書サーバのチューニング加減ではあるのですが、サーバにはどんだけ収録してるのかとか、単語どうしの関連の重みづけ具合なんかとかが気になってしまうのです。"申し訳ないとフロム赤坂"のフロムがきちんとカタカナに変換される理由とかね。最後に定番のめんどうな日本語を。

2012年3月31日土曜日

オシロスコープをインターネットの向こう側へ

オシロスコープの3つめ。諸事情でRubyをつかっていた部分をすべてNode.jsにしました。決してRubyがキライになったからじゃないですよ。

全力で稼働中

ひとつ前と変わらずNode Ninjaさんで動かしています。→こちら←。仕組みの解説をします。

サーバ側

いままではNode WebSocket Serverをつかい、生のWebSocketをつかってブラウザに送っていましたが、今回からSocket.IOをつかうことにしました。なぜか。生WSのときは、Arduinoで読み取った信号の受け口とブラウザ送信の送り口を同じエンドポイントで運用していました。これだと特にKUFUをしない限り、誰でもサーバにメッセージを投げられて、全てのブラウザに送信されてしまいます。いままではサーバ起動後すぐにArduino側のスクリプトを起動しサーバに接続、IDを保存しておいてそのIDから来たメッセージのみブラウザに送信するとしていたのですが、なんとなくスマートじゃない。これを、Socket.IOの名前空間を利用して解決しています。

名前空間(Namespace)とは

ブラウザからSocket.IOを利用してサーバへつなぐ際に、log.niccol.li/hogehogeのようにサーバ名+文字列を指定することができます。スラッシュ以降が名前空間と呼ばれる機能で、指定した文字列ごとにサーバ内で処理を分岐させることができます(詳しくはこちら)。受信用・送信用に名前空間を分け、ブラウザからは送信専用のエンドポイントを指定することで分離を実現させています。

Arduino中継側

「ArduinoがanalogReadの値をシリアル通信で送信、受けたPCがWebSocketでサーバへ送信」の流れは変わっていません。いままではここをRuby/EventMachineで記述していましたが、サーバでSocket.IOを使い始めたのにあわせてNode.js+Socket.io-clientに置き換えました。前述の名前空間をつかい、Arduinoからの信号受信用のエンドポイントを指定しています。

ここでNode.jsに置き換えたことでちょっと変化が。シリアル通信を読むときに、EventMachineではたまに改行を見落とすため、異常な値が送信される問題がありました。これがNode.jsでは起こらないんですね。モジュール内部も含めて、シリアルポートから読み出したあとの処理に差異はみられないため、読む処理そのものの問題なのかなと。違う点といえば、NodeはTTYも含むI/Oをlibuvでまかなっているため、ノンブロッキング処理になっていますが、Rubyのほうはブロッキング処理のよう。改行で文字列を分割するタイミングとTTY読み出しが当たるととぶのかなと思ってはいますが、どうやって確かめたらいいんですかね。

2012年3月18日日曜日

Arduino用オシロ、実演中

EventMachineとHTML5でつくる、Arduino用なんちゃってオシロスコープの続き。あなたのウェブブラウザでオシロスコープを実際にお楽しみいただけます。とは言っても波形を見られるだけなんだけどね。

デモンストレーションはRealTime - FakeScopeから。東京Node学園祭でいただいたNode Ninjaのサーバをつかっています。

ながれ

  1. Arduinoからシリアル通信でMacへ測定値を送信
  2. シリアル通信をEventMachineで受けたのち、WebSocketでNode Ninja上の中継サーバへ送信
  3. 中継サーバからブラウザへWebSocketで送信
  4. ブラウザ上で、Flotr2を使ってグラフ化
いま(3月18日23時時点)サーバで見えている波形は、iPhoneのスピーカー部分の振動を拾っているところ。何か音楽がかかっていれば揺れます。

それなりの勢いでWebSocketのデータを流しているので、Node Ninjaさんから怒られないか心配しているところではあります。

これから

ArduinoからMacを経由して中継サーバに送っているところ。ここはEthernet Shieldなどを使って、Arduino自信がサーバへ直接送信できるようになればスルーできます。また、信号の発信元もArduinoである必要はありません。WebSocketサーバにCSV形式で値を投げられるならば、何だってよいのです。ゆくゆくはエンドポイントを公開して、センサーネットワークの受け側にしたりとかしたいですね。

おまけ

なんでもグラフ化してみんなでシェアすればソーシャルグラフじゃね?という駄洒落を名古屋でのLTにておみまいしましたが、微妙なウケ具合でした。負けません。

2012年3月13日火曜日

東京と名古屋でLTをやったらすごいウケた話


まさかIT系のLTでトロンボーンを出す日が来るとはね

この週末は東京と名古屋でLTをやってきました。3月10日の土曜日は文京区の情報処理推進機構にて小江戸らぐ。ここでウケたところで調子にのって、12日月曜は名古屋新栄のPiano Bar Club Adriana a.k.a. 名古屋 Geek Barでも。

内容はというと、ひとつ前のArduinoオシロスコープについて。かるく中身を説明したうえで実際に動かしたら大ウケ。名古屋ではたまたまその日に返してもらったトロンボーンをつかって実演。さらにペアプロ合コンのためにつくったとゲスいネタをひきだしてだめ押し。

合コンは置いといて、実際にものを動かすLTは強いなと。ハードウェアという飛び道具をあやつってネットとリアルをつなぐ、つないだ様子を間近で見えるプレゼン。こういう方向でのプレゼンを繰り広げるエンジニアはあまりいないと信じて、今年は活動していきたいと思います。

2012年3月5日月曜日

EventMachineとHTML5でつくる、Arduino用なんちゃってオシロスコープ

HTML Fake Oscilloscope
Arduinoのアナログ入力で読んだ電圧の表示用に、HTMLでオシロスコープをつくってみたよ。

ソースはこちら→niccolli/FakeScope · GitHub

仕組み

  1. Arduinoからmillis()とanalogRead()の値をシリアル通信で出力
  2. RubyのEventMachineで読み込み、WebSocketで配信
  3. HTMLでグラフに描画
EventMachineでのシリアル通信にem-serialportを、WebSocketにem-websocketを使っています。HTMLのグラフ描画は直でCanvas……とも思ったのですが、flotr2というちょうキレイなグラフの描けるスクリプトにおまかせしています。

Piezo Mike Shield with LM386
Arduinoのほうは値を出力するならなんでもよいのですが、ただのサイン波ではおもしろくないので、指パッチンのときに使った回路を使っています。ブレッドボードからユニバーサル基板に進化しました。

動かしてみた

赤く見切れているものはトランペットです。マイクでトランペットのベルの振動を拾い、Arduino上のシールドで増幅。それをanalogReadで読んだものを表示させています。そこそこぬるぬるしてるよね。

やり残していること

  • 重い
    flotr2などはiOSでも見られる・使えるもののはずなんだけど、MobileSafariでは最終的に固まります。
  • 波形がとぶ
    これはem-serialportのような。このシリアル通信ライブラリはバッファリングがないので、その部分だけ自前で実装しています。このシリアル通信のデータをみていると、ちょっと信用おけない感じがするのです。
  • サンプリング周期が粗い
    これはArduino。loop()のなかでdelay()などを使ってはいないのですが、loop周期が数msなのでus/ns級の波形はたぶん見られません。ここはもう本物のオシロスコープを買えってことかな。
    追記:loop周期の問題ではなく、シリアル通信のボーレートの問題でした。ボーレートを全開にすれば早くなりますが、Ruby側で落とすぶん(上の問題)が増えているようです。

「Rubyつかってみろ」ってことでEventMachineをつかったおもちゃをつくったつもりだったけど、肝心のRuby分はうっかりすくなめ。なんかこう充実してた気がしてたのは、初めてだったからかな。

2012年3月4日日曜日

em-serialport:EventMachineでシリアルポートをつかう

急遽「おまえ、Rubyやれるのか!やれんのか!」的な話が来たのをいいことに、RubyのEventMachineであそんでいます。おれがイベント駆動。イベント駆動といえばArduino。Arduinoが出すなんらかの値はシリアル通信でうけとるのが楽なので、EventMachineでシリアル入力をトリガーにするためのライブラリem-serialportを使ってみます。

例:シリアルポートでうけた値をターミナルに表示させる

#!/usr/bin/env ruby
require 'em-serialport'

#serial = EventMachine.open_serial('/dev/tty.usbserial-A6008iDi', 9600, 8, 1, 0) 

EM.run do
    serial = EM.open_serial('/dev/tty.usbserial-A6008iDi', 9600, 8, 1, 0)

    serial.on_data do |data|
        print data
    end
end

requireはem-serialportのみ。require 'eventmachine'もつけると、名前の衝突かなにかでえエラーがでます。

open_serialの引数は順にシリアルポート名、ボーレート(もちろんスケッチに書いてあるものを)、データビット長、ストップビット、パリティの有無になっています。特に気にするのは前2つで、後ろは基本このままで大丈夫そうですね。4行目に同じものがコメントアウトになっていますが、ここでメソッドを呼び出すとダメみたいです。ループのなかにあるような感じが微妙に気持ち悪いんですけど、こういうものということで。

serial.on_dataが受信後に実行するコールバック関数。いまはprintのみを入れて、ターミナルに表示させているだけです。

Rubyはほぼ初めてなんですが、いままで書いたコードは命令のあとにセミコロンが必須のものばかりだったので、セミコロンなしインデント至上主義のコードに若干とまどっています。がしかし、やってみると楽しいものね。

注意

on_dataの引数で入ってくる値は、シリアルポートで受けた値がバッファを通すことなく直接入ってきます。上の例のようにそのままターミナルに吐き出す場合はよいのですが、値を拾ってスクリプト内でどうこうとなるとバッファに取り込んだうえで改行(\r\n)をめどに分割する必要があります。

2012年2月12日日曜日

チューニング用マイクとArduinoで指パッチンを検出する

明和電機が大好きで、吹奏楽部に所属していたころはよく「吹奏楽コンクールでパチモクを使って怒られたい」とニヤニヤしていたものです。

指パッチンをトリガーに木魚を鳴らす楽器なのですが、社長の著書に「指が曲がったことを検出して木魚を鳴らす」との記載があり、指パッチンじゃねえじゃんとがっかりした記憶があります。

何をトリガーにすればよいのか

音が鳴ってこその指パッチン。ならばその音をマイクで拾えばよいのではないか。マイクの先をArduinoにつないでおけば、木魚も鳴らせるしツイッタに投稿だってできるし最高じゃないですか。ということで、手元にあるマイクを探すと、ちょうどクリップ付きのマイクがうちにあるんですね。

IMG_0935
ほんとうはこうやってつかう

コルグのCM-100L。管楽器のベルなどをつまみ、振動をひろって音に変えるタイプのマイクです。マイクの先は写真のようにチューナーにつないで、音程を調べるのに使うのがふつうです。これで中指をつまめば、とりあえず音は拾えそうです。

マイクから先、Arduinoで音を読むまでの回路は、次のサイトを参考にしました。

なんでも作っちゃう、かも。 / Arduinoで遊ぼう - エレクトレット・コンデンサ・マイクでオーディオレベルメータを作る

記載どおりの回路を組んでも動かない。マイクのほうを調べてみると、うちのマイクは回路に記載のコンデンサマイクではない様子。振動を拾うものはピエゾ型になるそうで、これは振動から電圧を発生させるとのこと。プラスとマイナスがあるから一緒、みたいな単純な考えでやってました。あぶねえ。R1をオープンにしたら正しく動きました。5Vが邪魔して、電位の微妙な振動を殺していたようです。

2012年2月4日土曜日

ラジオ放送局が今かけている曲を"Radikoから"抽出するには

以前の記事が検索エンジン経由でよく読まれているので、その続編を。

Radikoのサイトに表示されている曲情報を使ってしまおう

放送局ごとにそれぞれ対応していたら手間がかかります。ラジコのページに表示されているものを使ってしまえば、ほぼ同じコードで全部の放送局に対応できそうな気がしますよね。

ラジコのトップページ、放送局を選択するとNOW ON AIRとTOPICSの欄が出てきます。これはどちらも、 http://radiko.jp/v2/station/feed_PC/[放送局名].xml に記載されています。放送局名はTBSラジオならTBS、InterFMならINT。その他の放送局の場合は、SafariだとWebインスペクタから確認できます。

このXML内のitem要素のうち、type属性にmusicと指定されているものがオンエア曲情報となります。タイムスタンプや一意に設定されていそうなIDまでそろってて便利そうですね。

Radikoサイト上の実装

ラジコのサイト上では、上記のXMLをXMLHttpRequestを使って5秒おきに呼んでいる様子。少し前の実装では、XMLの呼び出し時にLast-Modifiedヘッダをつけて負荷軽減をはかっていたようですが、いまはそういうKUFUはなさそうです。

おまけ

http://radiko.jp/v2/station/list/JP[数字].xmlで、その都道府県で聞ける放送局の一覧と、各種サイズのロゴURLが書かれたXMLがとれます。北海道は1(01じゃなくて)だったり、東京は13だったり。ラジコのサービスがない県も、枠だけは出てきます。

2012年1月21日土曜日

XSとC++で文字列のやりとり

PerlでC/C++ライブラリを使うときには、XSでラッパーを書いてあげる必要があります。C++はオブジェクトになっているものがあるので、ちょっと手間がかかるのです。

C++の関数を実行し、文字列をPerlへ返すとき

cpplibという名前のライブラリに、実行するとstd::stringを返す関数func1()があったとします。これをXSのなかで実行させて、文字列をPerlへ返すときは、次のように書けます。

SV *
cpplib::func1()
 PREINIT:
  std::string s;
 CODE:
  s = THIS->func1();
  RETVAL = newSVpv( s.c_str(), s.length() );
 OUTPUT:
  RETVAL

まず、PREINIT欄。func1()を実行したときの返り値の受け皿として、std::stringの変数をひとつ用意しておきます。

CODE欄でfunc1()を実行し、さっきの受け皿変数に保存。これをPerlの何でもありな変数に変換するのが次の行なのです。RETVALはPerlへの返り値専用の変数で、宣言は不要です。このRETVALに、C/C++の文字列からPerlのスカラー変数(SV)を生成する関数(newSVpv)を通してあげればOKなのです。

newSVpvは引数1つ目にstd::stringの文字列部分、2つ目に文字列の長さを与えることで、Perlのスカラー変数に文字列を代入した状態のものを返します。newSVpvのpvが文字列を表しており、例えば整数型ならnewSVivを使うといった具合に、C/C++側の変数型にあわせて使い分ける必要があります。

Perlから文字列を渡し、C++の関数の引数とするとき

これから書く

2012年1月7日土曜日

2011年のネットプロレス大賞に投票した

したのだけど、なかなか選べないですねえ。

ネットプロレス大賞って?

ブラックアイ2さんの主催する、1年間のプロレスを振り返る投票企画。プロレスファンが思い入れを込めまくって投票できるのです。毎年生観戦したものから選ぶと勝手に決めているのですが、それだと結果として名古屋中心になってしまうのですよね。

MVP

  1. DJニラ
  2. 勝ち負けではないプロレスで名を挙げた感。印象派。「なんだこの接待プロレスは!」と本人がキレるほど、名古屋に来るたびにミスター6号との試合を組まれているのですが、利用具合が凄まじくて毎回必ず盛り上がるのです。ほんと楽しいんですよニラさんの試合は。
  3. マンモス半田
  4. 大晦日の年越しプロレスでも天然のぼんやりした選手みたいに扱われているんですが。それでも時折キラー・マンモス半田が何度か垣間見え、そしてそれを澤選手が引き出していたように思います。
  5. 佐藤光留
  6. すっかり恐い印象の選手に。特にDDT48総選挙を圧倒的大差で勝ち上がって以降の恐さがいい。試合前の気迫っていうんですかね。最終的な勝ち負けは置いといて、入場曲の時点で妙な期待感があふれてくるんです。マジ信頼できる系。

最優秀試合

  1. 入江茂弘vsマンモス半田@2011年9月23日 プチでら vol.13
  2. これは上記のキラー・マンモス半田がみえた試合。いま一番勢いのある入江選手相手に勝てないだろうなと思いつつも、もしかしたらと思わせる瞬間が見えて感情移入させてしまう展開。セコンドで応援していた澤選手もまた良し。
  3. ヤス久保田&ヒデ久保田vs神威&ジ・ウインガー@2011年4月9日 トリプルテイルズ&FREEDOMS&スポルティーバ 合同興行
  4. やりたい放題のクボブラが最高。クボブラはタッグ戦で大きく映えるし楽しいので、年越しプロレスのガントレット戦はちょっともったいなかったと思う。クボブラvs佐藤兄弟が見たかった。
  5. DJニラ&平田一喜vs大石真翔&ミスター6号@2011年10月30日 DDT名古屋大会
  6. 安定して楽しいニラさんvs6号。6号くんのおこづかいは増えたのでしょうか。

最優秀タッグチーム

  1. 久保田ブラザーズ
  2. 強いし面白いし最高。前述の神威&ジ・ウインガー戦の暴れ具合とかね。

新人賞

  1. 彰人
  2. ギミックチェンジがとてもいいほうにむかっている感。
  3. 杉浦透
  4. スポルティーバでよく見ていた選手。昨年後半から大晦日の年越しプロレスにかけて、いい風がふいている。
名古屋勢においても、若い選手の盛り上がりが著しい。これをきっかけに、東京から名古屋へ観戦する人が増えてほしいところ。見たかったらこっちこいよと。東京へ出ていってばかりでは寂しいし、ちょっと不公平感もぬぐいきれないしね。

最優秀興行

  1. DDT 3/27 後楽園ホール大会 Judgement 2011~DDT14周年記念興行~
  2. "直後"にもかかわらず、節電対応型で不安を飛ばす構成。CZWのジョナサン・グレイシャム a.k.a. ボブサップの刺客もよかったよね。
  3. 4/9 トリプルテイルズ&FREEDOMS&スポルティーバ 合同興行「みっくちゅじゅーちゅ」
  4. 彰人選手の方向転換はここだったのではないか。ここからさらに男色先生やまこりんがあって、いまのほもクロがあると確信しています。歴史の転換点をみた。
  5. チームでら 9/23 プチでら vol.13
  6. 澤選手の名古屋最終戦からホフ専用ジオングvsタイガースマスクまで、どの試合もいろんな意味でどうかしてた。

最優秀団体

  1. スポルティーバエンターテイメント
  2. 名古屋びいきってのは大きいけれど、それでもね。DDT48総選挙前の、スポルティーバの盛り上げ方。どうかしてる感の煽り具合が最高だった。やれることはやっとこうぜ感。ズンドコバスのときは、うっかり鶴舞に集まっちゃう名古屋のファンもよかったよね。
  3. DDT
  4. ことしプロレス一見さんを、新木場のビアガーデンプロレスに誘って、大変気に入ってもらえたってのもあって。「楽しいね」「思ったより恐くないね」という感想をもらっていて、ちょっと複雑ではありますが。次は新日本プロレスを観にいってもらいたいところ。

最優秀マスメディア

  1. 19時女子プロレス
  2. 2011年初戦の名古屋大会中継でひいき目。あの特別編成感とドジっ娘の帯広代表のがんばり加減に惹かれていたのだけど、アイスリボンとなってしまったのは残念。
家にテレビを置いていないので、ワープロもサムライTVも見ていないんですよね。DDTのパンフレットに投票しようかとも思いましたが。

感想

なんといっても、職場の休日が木金に移動したのは大きすぎる影響だったなと。7月〜9月は土日のビッグマッチを全く見られなかったので(休みをとったDDT両国大会を除く)、自動車業界に対して愛想が尽きたなと。すぐそこで楽しいことが起きているのに参加できないもどかしさったらなくてね。

結果としてインディばかりになっていますね。比較的小規模の開催が多いので、わるいことでリングの上も下もヒソヒソ盛り上がっちゃっている感覚、共犯感覚が楽しいんですね。投票にはいれていないですが愛知県体育館でみた新日本プロレスもよかった。歴史が長いだけあって、ファンの入れ込み具合が違う。観客含めて恐かった。ちょっと高いんだけどね。