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の助手席に乗せてきた。これが一番緊張した。上品ドライバーに徹しました。

2011年11月3日木曜日

node.jsとMIDI信号でHTMLをいじる

準備

node.jsでMIDIを拾うには、node-midiを使います。RtMidiというOSごとの差異をうめるライブラリを呼び出しているので、MacでもLinuxでも、もちろんWindowsでも大丈夫なようす。npmにはもうひとつPure JSでMIDIを扱えるものがありますが、こっちはサンプルを見たところLinux依存のようです。


MIDI信号をひろう

とりあえずサンプルのとおりに。

var midi = require('midi');
var input = new midi.input();

// MIDI INの信号を拾ったら実行する
input.on('message', function(deltaTime, message) {
  console.log('m:' + message + ' d:' + deltaTime);
}); 

// ポートを読み始める
input.openPort(0);

実行結果は以下の動画で。引数にファイル名を指定していないのは、どういうわけか実行ができなかったから。ノブをぐりぐりしたりキーを叩いたりすると、ターミナルに表示されているのがわかりますね。



HTMLに送る

node.jsでつかまえられるということはあれこれいじれますな。せっかくシンセサイザーにノブが3本ついているので、それぞれをRGBとしてSocket.IOでHTMLの背景色をいじってみます。コードはgithubに。


コードのなかでは何をやっているのか。MIDI信号を拾ってからの処理のうち、前半はこのシンセサイザーのための処理をやっています。XYZ3個のつまみがついているのですが、つまみを回した瞬間に「どのつまみを回した」という名刺がわりの信号がとび、そのあとに回し具合の信号がずらずらつづきます。回し具合の信号は3つのつまみで共通なので、「いまどのつまみを回したのか」を正しく知るための処理ということになります。

後半は、つまみの回し具合をカラーコードの文字列に変換しているところです。ここもハードウェアの縛りがあって、Xだけが127(実際はもっと大きい)、それ以外は100が最大値という仕様らしいので、それを255(0xFF)が最大になるように計算しています。この計算だと#FFFFFFにはできないんですけど、そこは手をぬきました。

最後にio.sockets.emit()で、Socket.IO経由でつながっているHTMLにカラーコードを送ります。HTML側では、受け取ったカラーコードをそのまま背景色につっこんでいるだけですね。

2011年10月30日日曜日

東京node学園祭に行ってきたよ

東京node学園祭に行ってきましたよ。六本木遠いわー。


アメーバ水をもらいました。なかみはふつうの水のようです。

Yahoo! Japanの中村さんが発表していた、バスの現在位置を共有がとても興味ぶかくて。渋滞その他で遅れがちな路線バスを、GPSでリアルタイムに地図上に表示するというもの。バス側にどんな仕掛けがあるのかが気になるところなのだけど、残念ながらそのあたりの話はなく。もっと聞きたかったっす。


むしろ後夜祭のほうがアツいというかアガるというか。ぼくが「nodeはいろんなハードウェアと組み合わせたら絶対おもしろい」的な話をしたら、周りの方々から「ソフトウェアをわかっていても、ハードウェア、というか電気回路になると壁を感じる」とか「ハードがわかる人とソフトがわかる人とが、もっと関わりを持てるといいよね」とか、いい方向のおしゃべりができたなと。

オームの法則程度で十分なんとかなる程度でも、やっぱりとっつきにくいものだし、わからなくてもいいようになっている。その大きな例がキネクトだね。ハードウェア屋さんがビシーッとデバイスをつくりこんで、APIを提供する。ソフトをつくる人はAPIを叩いたらどんな反応があるかをわかっていれば、ソフトから簡単にいろんな機能を使えるようになるし最高じゃないですか。そんな方向の話にひろがっていって楽しかった。名古屋でもこういう場があればいいな。なければ東京へ引っ越すだけなのだけど。

2011年10月2日日曜日

ラジオがないと困るたったひとつの理由

RADIO-iが閉局して1年ということで、ラジオがないと困る個人的な理由を。

ラジオがないと、新しい音楽に出会わないのだ。防災情報云々って言うと思った?そんなことを今になって説いているのは普段ラジオなんか聞いていないやつらだ。

ラジオ、特にFMラジオはいろんな音楽をかけてくれるので、そこで新しい音楽を知っていくわけですよ。もちろんいい曲だけじゃなくて、売らなきゃいけない曲ばかりであることのほうが多いのだけど。いいDJだと、雰囲気に会う音楽を選んでかけてくれる。そのかかった音楽で「ああーこの曲いいなー」とか「このかっこいい曲は誰のだ?」とか思うじゃないですか。いま流行りの表現をすれば、ラジオDJはみんなが大好きなキュレーターだよね。ラジオ放送は聞く分にはお金がかからないから、自分でCD買うなりダウンロードする前に試聴できるようなものですよ。初めて聞く名前のミュージシャンの曲を試聴もなしに買うってハードルたかいしさ。

だからってラジオがあればそれでいいかと言うとそういうわけじゃなくて。FMラジオなんてしゃべってばかりじゃないっすか。今は愛知県在住だからZIP-FMを名指しで例に挙げるけどさ、DJがひたすらしゃべってその隙間になんか売れたらいいな的な曲を挟むだけなんだよね。それも似たりよったりの、コブクロかファンキーモンキーベイビーズの劣化コピー的な曲ばっかり。自分の好みだけでは手を出さないところから、いい曲をかけてもらいたいんだけどね。

2011年8月26日金曜日

npmでhttp-basic-authをインストールしようとするとエラーになる

package.jsonに誤りがあるので、npm install http-basic-authを実行してもエラーになります。


回避方法


githubに正しいpackage.jsonの書き込みが入っているので、これに入れ替えます。



  1. wget http://registry.npmjs.org/http-basic-auth/-/http-basic-auth-0.1.0.tgz

  2. tar zxvf http-basic-auth-0.1.0.tgz

  3. [解凍ディレクトリ]/package.json を、上記リンク先のものに入れ替える。

  4. npm install [解凍ディレクトリ]

2011年8月18日木曜日

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

会社の夏休みで実家に帰省して一週間、テレビはあるけどそれでも毎日ラジオを聞いている。というか、radikoでInterFMばっかり聞いてる。いろんな音楽をかけてくれるからね。もうすぐまた愛知県にもどるとおもうとさびしいよ。RADIO-iはとっくになくなっちゃったしね。


という話はおいといて。radiko経由でバックグラウンドで聞いていると、いまかかっている曲が気になることもしばしば(あるよね?)。で、知るとなればradikoのタブまで移動するか、放送局のサイトを開けばいい。だけど、それはちょっとめんどう。MacにはGrowlがあるんだから、そこに表示できれば横目で見られてステキだよね。邪魔にならないし。


そこで、放送局のサイトから放送中の曲名を引っ張り出すにはどうすればいいか。ちょっとまとめておこうかと。本当なら何らかのAPIでもあればいいんだけどね。



InterFM


hoge


ロゴの下にあるNow Playingの欄。これがFlashでできていて、別URLのテキストを呼び出す形になっている。


http://www.interfm.co.jp/flashLED/nowplayingflash2.cgi このURLで返ってくるのはアーティスト名と曲名の書かれたプレーンテキスト。flashLEDというのはリニューアル前のサイトの名残。



TOKYO FM


tfm


これもFlashから別URLを呼び出して表示するかたち。でもこっちはXMLでやってくる。しかも収録アルバム名やCDの番号まではいってるので、アートワークをアマゾンからもってきたりできそう。J-WAVEもこんな感じでXMLを吐いているが、ひとつの属性にタイトルやら全部押し込んじゃってるので不便。

NACK5


ここはちょっと大変。HTMLに直で書き込んであるのだ。でもNACK5の場合、あんまり曲かからないし、かかっても曲名細かく言うからいいか。



NHK-FMは放送中の曲を知る仕組みがない。だいたいは番組表に書いてある通りにかかるからいいけども、○○三昧とかだとちょっとね。

2011年7月25日月曜日

DDT両国大会観戦ツアー中に食べたもの

DDT両国大会観戦のため、一泊二日のツアーを敢行。いろんなものを食べてきました。

ニコニコカレーのカツカレー

中野にあるDDT運営のカレー屋さん。先代のミツボシカレーからリニューアルして営業していたけれど、両国大会のこの日に閉店ということで食べ納めに。

お昼過ぎにお店にいったものの、既に大半のトッピングは完売。トンカツとえびカツがまだあるということだったので、トンカツのほうを。ここのカレーはとろとろの牛肉と、カレーのなかにかくれている野菜がとてもおいしかった。キャベツなのかたまねぎなのか、煮込まれてなくなりかけている野菜ね。たまねぎっぽくない気がするけど、何だったのかな。

もういっこ。ミツボシカレー時代からの、ごぼうのフライね。ごぼうってちょっと苦い感じがあるけど、あんまりそういうのがなくて。ミツボシの当時、お店の人に聞いて初めてごぼうとわかったのです。

両国大会終了後に、お店のツイッタ公式アカウントからカレーも完売のお知らせが。大会前に行っておいてよかった。DDTのカレー屋さんはおいしいってのと昼間食べに行けるってところが魅力なので、またいつか復活してほしいところ。

すた丼

ツイッタで名前を聞いていて、いつか行こうと思ってたお店。ツイッタだと"秋葉原のすた丼"という投稿をよく見ていたので、秋葉原だけにあるお店なのかと思っていたのだけど、チェーン店なのね。"秋葉原にも歩いて行けるから"という理由でお茶の水のホテルをとったのだけど、まさかそのお茶の水駅のそばにもあるとはね。

学生のころ、大学ちかくの中華料理店にスタミナ丼があって、それを想像していたのだけどちょっと違った。しょうが焼きっぽい豚肉が丼にどーん。食べきれないかもと不安だったけど、意外とさらっと食べられたところ。みんな夢中になるのわかるわー。調子にのってテーブルにあったおろしにんにくを鬼のように盛って食べていたら、ホテルにもどってからにんにくの風味が抜けず困惑。ほどほどにしよう。

リナカフェのモーニングセット

A morning plate @ Linux Cafe, Akihabara

ケーキでも食べるつもりでいたけれど、意外にも安かったモーニングセット。選べる飲み物は限られるけど、これで380円。マヨネーズが攻めぎみなのはちょっと…。

リナックスカフェの店員さんってかわいい娘が多い気がする。ただし

ラディッシュのランチセットの麻婆豆腐

名古屋は鶴舞、どうでしょうでおなじみのお店。小倉トーストがヘビー級なのだけど、ランチセットも負けずヘビー級なのです。

おかず+ごはん+サラダ+飲み物orアイスクリームがセットのなかみで、これにおみそ汁がついたりつかなかったり。そのおかずの量が比較的多めなのですね。

大きさが伝わるかなー。おいしいのだけど味の主張がちょっと強いのもあって、はやめにおなかいっぱいがやってきてしまう感。ぼくはもうちょっと少なくても大丈夫だよと思います。うまくいいにくいね。

2011年5月16日月曜日

WiLL Viオフ会に行ってきたよ

mixiのWiLL Viコミュニティのオフ会に行ってきました。

岡崎のレストランでみんなで食事→トークとゲームなど→公園まで移動→ニヤニヤがおおまかな流れ。遅刻してすみませんでした。


まずはレストランに集合。これはゲームの景品の一部。ポストカードは販売されていた当時にディーラーさんで配布していたもの。あのころってこんな売り出し方だったんだとしみじみ。発売当時ぼくはまだ高校生で、ステキな自動車を横目に充実した高校生活を送ってた。もちろん運転免許さえもなく「いつかは…」と思ってたんだけど、あのころの夢がかなったような感覚に。金で解決しちゃってはいるけれども。


お食事とゲームの写真はほとんどなし。その場にいたみんなの想い出ということで。公園までみんなでドライブ。レストランの時点ですでにみんなニヤニヤ。かわいいもんね。一番手前はうちのね。


最初の公園がいっぱいで、他の行き先を考えている間に一枚。サイドミラーもバックミラーもずっとこの画なの。運転中もニヤニヤしてましたw


で、別の公園にて。どうコレ?ぎゅーっと引かないと、全部収まらないのだ。みんなでこの画を見てはかわいいかわいいと。萌え死ぬわー。また、同行いただいたWiLL Vi担当チーフエンジニアの方にあれこれ楽しい話を聞かせてもらいました。あのシートは実は…とか、ここのプレスは…とかね。

参加者みんな、この車が大好き感を全開にしてた。当初から乗り続けている人も、中古車で途中から仲間入りした人も。愛情がビシビシ伝わってきて、同じ車に乗ってることがうれしくなったよ。みんな今の一台を一生懸けて大事にしていく想いでいっぱいだったね。HONDAのBEATに近い愛され方が、まったく違うベクトルの車でも起きてるってことがうれしいわけ。みなさん、また会いましょう。そのときも同じ車で。

2011年5月12日木曜日

Objective-Cの高速列挙

なんて書くと難しいこと話しちゃってる感じ全開だけど、Objective-Cにもforeach的なものがありますよと。Objective-C 2.0からはforinで配列のなかみをビシーッと展開してバキーッと一気に処理してくれる、高速列挙という構文が追加されております。

for ( 一時変数 in 配列 ){
命令文とか;
}

と書くだけで、配列の要素をひとつひとつ一時変数に入れて処理してくれる。一時変数は配列のなかみに合わせて型を書き換えてよし。便利だわー。

ただ、高速とうたうだけあって、配列の順番は保証しないらしい。順番が重要なときにはふつうのfor文を。

2011年5月7日土曜日

iPad 2でプリペイドプランをつかってみた


iPad 2をアップルストア名古屋栄で購入。3G回線つきだけど、プリペイドプランとしました。

なぜって。自宅には無線LANがあるし、数少ない旅行以外では持ち出さないだろうと。街中でナビがわりにしたいとか、そういうときに都度チャージすればいいよなと考えて、プリペイドにしたのです。

で、昨日1GB分をチャージしてみた。川越〜大宮〜新三郷のイケアを移動するのに、Googleマップを開いてカーナビがわりに使うために。もちろん運転中はさわっていないけどね。

IMG_0003
まずは購入まで。iPad上から「使います」と言ってすぐできるようなものじゃなかった。利用規約に同意して、クレジットカードの番号や名義を入力しないといけない。もろもろを入力して使えるようになる。

片道50キロ程を往復する間中Googleマップを開いて約50MB。意外と少ない。よっぽどYouTubeとかでも見ない限り、100MBでも大丈夫かもね。

2011年2月15日火曜日

NSURLConnectionに渡すURLはきちんとエンコードしてから渡すこと

iOS SDKの話。ふつうにMac OS Xでもそうなのかもしれないけど。

NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]];
[req setHTTPMethod:method]; self.URLconnection = [NSURLConnection connectionWithRequest:req delegate:self];
みたいな感じでURLを渡すと、そのURLのなかみを取ってきてくれるのがNSURLConnectionなんですが。SafariのURL表示窓がURLエンコードをしないで表示しているからって、requestwithURLのなかみに半角スペースや全角文字をそのままいれると"bad URL"と言われてエラーになります。

日本語やスペースのある文字列をURLエンコードするメソッドがビシーッと用意されているので、それをバキーッとつかうこと。

[hogehoge stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]
NSUTF8以下の引数は、相手の文字コードにあわせて適宜書き換える。さいきんはUTF-8が多いよね。

2011年2月12日土曜日

MPMusicPlayerControllerをつかってiPod.appごっこ

俺様用メモ

iOS SDKでは、iPod.appみたいな音楽プレイヤや動画の再生とかなんとかはまるっとフレームワークにまとまっています。MediaPlayer.frameworkがそれ。とりあえずここでは音楽プレイヤとしての話を。

使い方

ヘッダにMPMusicPlayerController *musicPlayer;などとインスタンスをつくる文をかいておき、viewDidLoadなどのタイミングで、

[self setMusicPlayer:[MPMusicPlayerController iPodMusicPlayer]];
としておけば、musicPlayerがiPodのライブラリなどとのやりとりをやってくれます。お手軽。

再生と停止

IBActionで受け取った先に、

[musicPlayer play]
[musicPlayer pause]
[musicPlayer stop]
とするだけ。なんて簡単なのでしょう。

いま再生している曲の情報を取り出す

[musicPlayer nowPlayingItem]
でいま再生している曲をつかまえるので、そこから次のようにして欲しい情報を取り出します。
[[musicPlayer nowPlayingItem] valueForProperty:MPMediaItemPropertyTitle];
この例は曲名を取り出す場合。MPMediaItemProperty〜の部分を変えると取り出せるものが変わります。詳しくはデベロッパドキュメントを参照ください。アートワークもとれるよ。

再生している曲がかわったら、曲名表示も書き換えたい

コードのなかで"書き換えろ!"と書かない限り、UILabelなんかに映している曲名は曲がかわってもずっと同じままです。曲がかわったことにアプリが気づく→曲の情報を取り直す という手順で、自動的に書き換えることができるようになります。

じゃあどうやって曲が変わったことに気がつけばいいのか。そこでNSNotificationクラスの力を借ります。このクラス自体の詳しい仕組みは他のサイトにまかせますので、ここではどんな流れになっているのかを書いておきます。

  1. NSNotificationCenterに、曲がかわったときに動かしてほしいメソッドと、プレイヤのインスタンスを登録する。
  2. プレイヤのインスタンスに、曲が替わったらNSNotificationCenterに知らせるよう伝える。
  3. 曲が替わったらNSNotificationCenterにプレイヤから連絡が出て、メソッドを実行する。
といった流れ。これをコードに直すとこうなります。

NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
[notificationCenter addObserver:self 
                    selector:@selector(updatePlayingMusicInfo:) 
                    name:MPMusicPlayerControllerNowPlayingItemDidChangeNotification 
                    object:musicPlayer];
[musicPlayer beginGeneratingPlaybackNotifications];
まずNSNotificationCenterをつくっておくところから。そのCenterにselectorとしてメソッド名を、nameにメソッドを実行するタイミングを、objectにプレイヤをそれぞれ登録する。Centerに伝えるよう仕向けるのはそのあとのbeginGeneratingPlaybackNotificationsで。これで曲の切り替わりと同時に情報を書き換えてくれるようになります。

nameに指定するフラグも、デベロッパドキュメントにはもっといろんなタイミングでできるとあります。そちらを参照ください。

2011年2月9日水曜日

スキーちゅうにGPSロガーを動かすと楽しい / KMLの共有

週末は苗場までスキーにいっていました。自宅からスキー場までの移動を記録しようと思ってHoluxのGPSロガーM-241を買っていたんですけど、スキー中にもログをとったらおもしろいんじゃないかと。
M-241

Holux M-241。きいろいほうね。手前はKO-D無差別級王座のベルト。

このM-241、けっこう精度がいいので、スキー中でもばっちり位置を記録してくれました。そのようすがこれ。

スクリーンショット(2011-02-09 19.06.44)

青い線が滑った経路。Google Earth上の苗場スキー場は雪がないんだね。まっすぐな線はリフト・ゴンドラで、くねくねがスキーとなってます。けっこう上のほうまでがんばったんだなー。

で、このKMLをGoogleマップのマイマップに載せるとこうなります。


より大きな地図で なえばスキー を表示

経路全部がみえない…。

大きい地図で表示をクリックしてもらうとわかりますが、ログがいくつかに分割されちゃってるんですね。マイマップの仕様みたいで、一度に表示できる点の数には限りがあるようです。

GPSロガーで記録した位置情報や経路なんかを、うまくシェアできる方法はないものかなーと考えています。ダウンロードしてもらってGoogle Earthで見てもらえばいいんですけど、それってすごいめんどうじゃないですか。リンクをクリックして、ブラウザのなかでさらっと表示できるのがいいと思うんですけどね。

2011年2月3日木曜日

2月2日 水曜カレープロレス(仮)

お仕事のあとに、かわいいWiLL Viをすっとばして名古屋は鶴舞のスポルティーバアリーナへ行ってまいりました。ほぼ毎週水曜は"水曜カレープロレス"と銘打って興行をやっているのです。愛知に引っ越してからもうすぐ1年なのですが(早いな)、初めての観戦です。

カレーライスが入場料がわりなのね。1ドリンク制ではなく1カレーライス制。カツは別料金だけどね。

このカレーライスがうまいのだ。ごはんがちょっとかためなのがすごくいい。あまりやわらかくないごはんだと、ごはんがカレーを吸いぎみになってしあわせなひとときになりますよね。カレーのほうはちょっと懐かしい味がします。東京都内に出没する屋台のカレー屋さんに"俺の昭和カレー"というのがあるんですけど、あの味に近い感じがしました。

福神漬はお酢が強め。いいっすねー。福神漬のついたカレーは久しぶりに食べた気がする。豚カツ以外にも鶏や烏賊のから揚げもトッピングにできるので、また食べに行こうと思います。

プロレスの話をしていなかった。20時開始で2試合。Ustreamでも中継があるので、遠方のかたもパソコンから是非。