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両国大会を除く)、自動車業界に対して愛想が尽きたなと。すぐそこで楽しいことが起きているのに参加できないもどかしさったらなくてね。

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

2011年12月24日土曜日

NodeがつなぐMIDIシンセサイザーとGoogleマップ

JavaScript Advent Calendar 2011(Node.js/WebSocketsコース)に急遽参戦。24日分の投稿になります。

MIDI信号をNodeで読み取り、WebSocketでブラウザに送ることで、MIDIシンセサイザーをキーボードやトラックパッドにかわる入力デバイスにすることができます。過去にもやったネタなのですが、今回はGoogleマップをシンセで動かします。Nodeみたいなイベント駆動系とハードウェアって相性がいいに決まってるじゃないですか。

まずは動画で

要はこういうことなんです。つまみのぐりぐりに連動して、マップのズームが上下していますね。

MIDI信号をNodeで読むには

node-midiモジュールを使用します。インストールは次のコマンドで。

npm install midi

RtMidiという、MIDI信号をリアルタイムに読み取るC++のライブラリをつかっています。

サーバ側

https://github.com/niccolli/MidiMaps/blob/master/midi2socketio.js

input.on('message', function(deltaTime, message) {
 // ノブをいじった信号
 if(message[0]==176 && message[1]==99){
  if(message[2]==0){ // knob X
   state = 'X';
  }
  if(message[2]==2){ // knob Y
   state = 'Y';
  }
  if(message[2]==4){ // knob Z
   state = 'Z';
  }
 }
 if(message[0]==176 && message[1]==38){
  LSB = message[2];
  switch(state){
   case 'X':
    var temp = MSB*128 + LSB;
    value = (temp-500)/5000;
    break;
   case 'Y':
    if(MSB){
     value = LSB - 28;
    } else {
     value = 100 + LSB;
    }
    value = (value-200)/1000;
    break;
   case 'Z':
    value = LSB/100*20;
    break;
   default:
    break;
  }
  io.sockets.emit('message', { state: state, value: value });
 }
}

一部抜粋で。使用するMIDIシンセサイザーに依存した記述になっています。ここではALESISのMicronを使っています。input.onはMIDI信号の受信をトリガにして呼ばれるコールバックで、前半のifで3つあるノブのどれが回ったかを記録。後半は3つのノブそれぞれ最大最小値が違うので、なんとなくごまかす処理。最後のio.sockets.emitでブラウザに値を送ります。

クライアント側

https://github.com/niccolli/MidiMaps/blob/master/map.html

socket.on('message', function(data){
 switch(data.state){
  case 'Z':
   map.setZoom(Math.round(data.value));
   break;
  default:
   break;
 }
});

こちらも一部抜粋。GoogleマップのsetZoomにそのままつっこむと、上記の動画のようになるんですね。

やり残し

本当はノブが3つあるので、残り2つのノブで上下左右の移動を実装しようとしたのですが、「WebSocketを受け取る→マップの中心座標から次の中心を調整→setCenter」を受ける度に繰り返すと、中心座標がundefinedになりうまくうごかないんですね。setCenterの処理が終わる前に次のsetCenterが呼ばれるのがいけない気がするのですが、なかなかうまい解決法がみつけられず…。

加えて、node-midiモジュールはいまのところnodeの0.6に対応できていません。C++のコンパイルがあるので、node_events.hがなくなった状態に追いつけていない状態です。ここはなんとかしたいところ。

(追記 2011.12.26 )Nodeが0.5.2以上の場合、node-midiはこちらで。先を越されてた…。

2011年12月18日日曜日

WiLL Viが可愛すぎてキレそう

Toyota Will Vi
トランクについてるエンブレム。かわいい。 by Gipiosio GipiOsio

表題のとおりWiLL Viがかわいすぎるので、かわいさ加減を書き散らして発散させてください。

WiLL Viってなんだ

もともとWiLLシリーズとして、いろんなお友達業種を超えたメーカーがデザイン重視の製品を発売するムーブメントがあって、松下(当時)がMDプレーヤや洗濯機を出してたり、文具が出てたりしていました(参考:Wikipedia)。そのなかで、トヨタ自動車はWiLL Vi / WiLL VS / WiLL CYPHAの3車種が発売されていました。後者2車種の話はしません。

WiLL Viは1999年の東京モーターショーにコンセプトカーとして発表され、まさかのデザインほぼそのままで発売。当時の奥田社長直下の組織で設計されたおかげで、横やりが入って牙がそがれることもなく生産にもっていけたそうな。ガワは独特だけど、中身(内装ではなく)は初代Vitzと同じ。トロンボーンや60鍵シンセサイザーも積めるし、タイヤを外せばロードレーサーも積めるのです。かわいいのにパワフル。

トランクのふくらみ具合がかわいい

Now, if only Camrys were this intriguing...
みんな後ろから撮りたがる。 by joh3

リアウィンドウの傾きがふつうと逆なので、トランクのふくらみ具合が余計に強調されるんですよね。これはアレですよ、アレ。

Maid in Japan
メイドさん by ThisParticularGreg

そう、フリフリのスカートのようじゃないですか。フリフリスカート=かわいい、トランクのふくらみ=フリフリスカート。ゆえに、トランク=かわいいが成立するわけですね。

内装がみてて愛おしい

IMG_0206
暗闇でもきれいに撮れます、ではなくて。

コラムシフトのさきっぽが真ん丸だったり、ダッシュボードから速度計がのぞいてたり。内装がいちいちかわいいので、ずっと見ていたい気持ちになります。運転中は前をみていないといけないけど。できるだけ長く車内にいたいから、必然とスピードを出さなくなりますよね。無意識のうちに上品ドライバーになってしまうのです。

ホイールキャップも個性的

IMG_0014

ウィキペディアではスカシカシパン呼ばわりされてますけど。ちょっとふくらんでいるおかげで、道路の端に寄りすぎてしまうとこすってしまうのね。角をまがるときも「傷つけてしまわないように」と思いやりが芽生えるほどということ。

トヨタってどこにも書いてない

WiLLというブランドを推していく方針から、メーカーの名前は大きく出ない方向に。WiLL Viでも、外から見てわかるトヨタのしょっぱいロゴは窓ガラスのみ。あとは取扱説明書の背表紙くらい。

凶器にも棺桶にも廃車にもさせない

「自動車は凶器にも棺桶にもなりうる」とTBSの安東さんがおっしゃっていましたが、かわいいかわいいWiLL Viをそんな目にあわせるわけにはいかない。心は常に上品ドライバーで。

でも既に10年落ち。いつかはエンジンが死ぬ日がくるでしょう。そのときはエンジンを捨てて、中身を電気に改造してしまうのもいいかなと。ネタになるしね。絶対に廃車にはしない覚悟で面倒をみていきます。俺の嫁だからね。

自動車内の信号を(できるだけ手軽に)読み出したい

昨年の初夏くらいにWiLL Viを中古で買ってから早一年半、かわいすぎるあまり彼女のことをもっと知りたいので車内の信号をどうにかして読めないか探っています。


一番手前が俺の嫁。かわいいし荷物積めるし最高じゃないですか。

どんな信号が流れているのか

いまや自動車の中身はおおかたが電子機器になっています。速度やエンジン回転数なんかが車内の制御コンピュータどうしのネットワークで流れることで、タコメータの針がふれたり、縦列駐車をビシーッとキメられるようにハンドルが曲がったりと、そこそこ便利になるように利用されているんですね。

WiLL Viも2000年ごろの自動車ですが、エンジンやエアバッグなんかのコンピュータが搭載されているので、それら同士の通信用だったり、警告ランプを点灯させたりするために自動車内のネットワークが構成されているのです。

どうやって読み取るのか

配線にワニ口クリップで電圧を…みたいなことをする必要はなく、コンピュータの故障診断用ポートを使います。OBD2(On-Board Diagnostics)というコネクタがどの自動車にも搭載されていて、通常は診断ツールで読み出します。

IMG_0778
OBDコネクタ。WiLL Viの場合は運転席の下に装備。

最近の自動車で使われているのは、シリアル通信とCAN通信のどちらか。2000年〜2003年くらいに生産されたものはシリアル通信、それ以降はCAN通信になっています。前者はISO 9141-2にて規定されていて、10.4kbps。Highが5Vや3.3Vなどではなく、12Vらしい。後者はISO 15765(よく調べてない)で、2本の線の差動信号で信号を読み取ります。両者とも送受信を同じ配線で行います。

長くなったので、WiLL Viで今のところどんなことを試したかは別の記事に。

2011年12月14日水曜日

Node.jsでつくるプログラマブルなMIDIコントローラ

Node.jsとMIDIの続き。

前の投稿で、Node.jsでMIDI信号を横取りしていましたが、これによってシンセサイザー上のあるスイッチの状態によって、別のスイッチの出力信号を変化させるなんてこともできるようになります。信号を出して終わりじゃなくて、状態を持つかたちですね。

背景

Ableton Live(のお試し版)でDJごっこをして遊んでいるのですが、うちのシンセサイザーはノブが3つついているので、3バンドEQを割り当てるのにちょうどいいんですね。

PICT0014

いっぽうで、2つのチャンネルそれぞれに3バンドEQを割り当てようとすると、6個必要になるわけですね。足りない。ここで、横についているスライダーの位置に連動させられれば、3個でもなんとか事足ります。この信号の組み合わせをNode.jsでやってみましたと。

コード

githubにアップロードしたものを参照ください。ここではそのなかの解説を。

output.openVirtualPort('NodeMidi');

ここでNodeMidiという名前で仮想ポートを立てています。Node.jsにMIDI OUTの端子ができたようなものですね。

その後のinput.onでやっていることは前の投稿とほぼ同じ、スライダーの処理が増えただけです。スライダーやノブの位置を変数に保存しておいて、組み合わせてから出力しています。

output.sendMessage([channel,2,x]);

sendMessageでoutputに指定したポートから、引数のMIDI信号を出力します。冒頭でNodeMidiという仮想ポートを指定しているので、そこから出力することになります。

Live側では、MIDI入力機器としてNodeMidiを指定すればOK。Nodeで変換している間の負荷はLiveの邪魔をしない程度、Nodeの本気です。ひとつ問題があって、node-midiはNodeの0.6系ではコンパイルが通らないので、0.4系を使って動かしています。あとで直す、たぶん。

2011年12月1日木曜日

Nagoya.pm #2で発表してきました

もう10日ほど過ぎていますが、2011年11月20日に行われたNagoya.pmの模様を。

ぼくの発表

ひとつ前のエントリーに書いた、MIDIシンセでHTMLをぐりぐりいじる話。これをそのままPerlのAnyEventに移植しようとして、ライブラリがなく苦労した話を発表しました。シンセのつまみをいじって背景色がものすごい勢いでかわるリアルタイム感がばかうけで一安心でした。そしてまずはnkfのxsを読むと。

発表中の様子は、@jiheiさん撮影の動画で。きいろい服の人がおれです。

気になった話題

  • App::Ack
    これすごい。Perlに限らずいろんなソースコードの中から検索してくれるっぽい。
  • プレゼンにおけるスライドの役割。AUGM名古屋でみた教授の講演がセオリー通りだったのを思い出して納得。
  • にこぐらふ
    マッスルハウスの「矢郷さんの出番はありません。富山にお帰りください」で試してみたのはおれです。本人降臨が一番なのかーwww
  • useful oneline script for perl
  • Perl6の動作環境はレジスタマシン。CASL的なかと思いきや、全然そんなことはなく。ちょっと高級ぎみのアセンブラっぽい。
  • Nagoya.pmのサイトがこわい。なごやこわい。

まとめ

こういう場でデモも含めてちゃんと発表するのは初めてだったのですが、うまくいってよかったなと。デキる人に疑問点を直接きけるのもいいです。テキストだとうまく伝えられないんだよね。とりあえず3回続けることが目標のようなので、次回は来年の春が来る前くらいでしょうか。

おまけ

懇親会後、うちの近所まで帰るお姉さんをWiLL Viの助手席に乗せてきた。これが一番緊張した。上品ドライバーに徹しました。