jQueryでグラフを書く

集計データをグラフ化したいなー、ということでどういう道具が使えるの探してみました。
以前、河合さんがFlashで描くライブラリについて取り上げていたのだけれど、iOS系で表示できないとやだね、ということで、Flashじゃないものを探してみました。

で、まずは、Google Chart API
Googleさんが、Web baseのAPIとして提供しているもの。Analyticsの中でも使われているとか。
GETのQUERY STRINGで値を渡すらしい。描画はサーバサイドの画像処理ですね。
データが外に漏れるのを嫌うシチュエーションでは使いにくそうです。

JavaScript系はどんなかなというところで、出てきたのがflot
こちらは、jQuery系プラグインで、シンプルにまとまっていてよさそう。Canvasに描画するんですね。
使うのも比較的簡単。divのプレースホルダをもってきて、$.plot() というメソッドに、データと
オプションの配列と一緒に渡す。シンプル。

コードはこんな感じ

$(document).ready(function() {
	var data_results_cumulative = [[1301270400000,0],[1301875200000,8.25],[1302480000000,22],[1303084800000,29],[1303689600000,36.5]];
	var data_plan_cumulative = [[1301270400000,12],[1301875200000,24],[1302480000000,36],[1303084800000,48],[1303689600000,60]];
	var data_firstplan_cumulative = [[1303689600000,16]];
	var ticks = [1301270400000,1301875200000,1302480000000,1303084800000,1303689600000];

	$.plot($("#graph"), [
		{ label: "results", data: data_results_cumulative, color: 2},
		{ label: "plan", data: data_plan_cumulative, color: 0},
		{ label: "first plan", data: data_firstplan_cumulative, color: 1},
	],
	{
		series: {
			lines: { show: true },
			points: { show: true }
		},
		legend: {
			position: "nw"
		},
		xaxis: {
			mode: "time",
			timeformat: "%y-%m-%d",
			tickSize: [7, "day"],
			ticks: ticks
		},
		yaxis: {
			ticks: 10,
			min: 0,
		},
		grid: {
			backgroundColor: { colors: ["#fff", "#eee"] },
		}
	});

});

iOS 4.3 で使えるようになったthird-party appからのAirPlay呼び出しを試してみる

iOS 4.3の目玉機能の一つ、third party appからのAirPlay利用について、コードを書いてテストしてみました。

といっても、難しいプログラミングが必要な訳ではなく、今まで動画を再生するのに使っていた MPMoviePlayerConntroller に追加された allowsAirPlay というプロパティをYESに設定するだけ。
これで、動画再生のコントローラの並びにあのAirPlayボタンが追加され、それをクリックすると出力先のリストが表示されるようになります。

今回はとりあえず試してみようということで、以下のようなコードを、ViewControllerのloadViewのところに直接書いてみます。

- (void)loadView {
CGRect bounds = [[UIScreen mainScreen] applicationFrame];

NSURL* url=[NSURL URLWithString:@"http://dev.uniba.jp/~jun/apt/test.m4v"];

MPMoviePlayerController *movie=[[MPMoviePlayerController alloc] initWithContentURL:url];

movie.scalingMode=MPMovieScalingModeAspectFit;
movie.allowsAirPlay = YES;

[movie.view setFrame:bounds];
self.view = movie.view;

[movie play];
}

これでビルドしてSimulatorで実行してみましたが、AirPlayボタンが出てきません。どうやら、SimulartorはAirPlayに対応していないようです。(リファレンスにも対応したDeviceで、と書かれています)

気を取り直して、実機をUSBでつないで今度はターゲットをDeviceにしてビルド。しばらく待った後に、実機でアプリが起動し、プレイヤーが起動、AirPlayボタンが表示されました。

AirPlayボタンをクリックして、AppleTVを選択してみましたが今度は「Cannot play video on “Apple TV”」というアラートが表示されます。もしやと思って確認してみると、Apple TV側でソフトウェアアップデートのガイダンスが表示されています。Apple TV側のソフトウェアバージョンが4.1系だったのですが、こちらも最新のバージョンにアップデートする必要がありました。

Apple TV側のソフトウェアをアップデートすると、ちゃんと先ほどのコードで、映像を飛ばすことができました。

アプリからのAirPlayの呼び出しは、MPMoviePlayerController のプロパティということで、今のところAirPlay経由で飛ばせるのは、MPMoviePlayerControllerがサポートしている動画ファイルということになるようです。AirPlayのプロトコルは、静止画もサポートしているようですが、こちらはAPIとして利用できる状態にないようです。

Kinect 勉強会 Vol.1 に参加してきました

RDDブログひさしぶりの小松です、

今日は、Kinect 勉強会に参加してきました

導入から丁寧に説明してもらえたので、だいぶ分かった気になりました

以下、自分のメモ。。
・最初のドライバはlibfreenect。賞金がついてオープンソースのドライバが開発された。
・今の主流はOpenNIのやつ。Macにも対応しているが、stableはwin/linux向けのもの。
・ C++/Python向けのバインディングが用意されている。
・深度画像と光学(RGB)画像が得られる。
・骨格トラッキングをすると、関節部分の座標と角度が取れる。
・primesense社のSDKというのも使えるらしい

・事例まとめ
http://www.openni.org/gallery
http://www.kinect-hacks.com/openni
・openFrameworks には、libfreenect / OpenNI のドライバが同梱されていてらくちん
・@hagino3000さんの発表スライドは、ハンドジェスチャーでページ送りしてた
・手が疲れるので途中でやめる
・画像処理はOpenCV使うとらくちん
・左右のカメラの視差で3D認識をしているんだと思っていたが、どうやら赤外線カメラで深度情報を取っているっぽい?
・@ndrugerさんの発表は、node.jpと、WebGLと、HMDを組み合わせてゲームを作る
・node.jsは、座標情報を右から左に流すだけのシンプルな物
・kinectからきた座標情報をTCPで送るコードも、OpenNIのサンプルコードに少し手を加えた程度の簡単なもの
・深度情報は、0-255の256段階、640×480の解像度
・深度は赤外線カメラで、映像はRGBカメラで撮影していて、カメラがついている位置が少し離れているためKinectに近づくと映像と、深度情報がずれる現象が起こる
・HMD楽しそうVR920 5万円ぐらいで、加速度センサ付きのHMDがかえるらしい。キネクト界隈でいろんな人が遊んでいるらしい。解像度はVGAぐらい

さて、あとは作るだけ!C++久しぶりに触ってみるのも、わくわくしますねー。

送られてきたメールをプログラムで処理する(Sendmail篇)

こんにちは、小松です。

モバイルのサービスを作るときに、ほぼ毎回作るけれども、毎回グーグルで調べながらやっている、「メールで送られてきた内容をプログラムで解釈できるようにする」ための設定。自分用のメモを兼ねて書いておきます。

今回はたまたまサーバにデフォルトでsendmailが入っていたので、sendmailでどうやるか調べました。

例えば、example.comというホストの /etc/aliases あたりに

jun:  |process_mail.php

等と書くと、jun@example.com 宛に送られたメールが、process_mail.sh の標準入力に渡されます。

ただ、ここのprocess_mail.phpというコマンドは、/etc/smrsh というディレクトリの下にあるコマンドじゃないとイケナイということなので、

ln -s /var/lib/command/to/process_mail.sh /etc/smrsh/process_mail.sh

等として、シンボリックリンクを作っておかなければなりません。

あとは、1つのサーバで複数のドメインを使うような場合は、 /etc/mail/virtusertable というのを使います。

ここにドメイン込みのメールアドレスに対して、どのユーザにメールを配送するかというルールを書いてあげるとその通りに配送されます。ちなみに、

info@example.com myuser1
@example.com myuser2

といった具合で、@の前を省略すると、そのドメイン宛に来たメールを全て1つのユーザで受け取ることができるようです。

メールアドレスの中に、token文字列をいれて、サイトとメールをつないだりするときは、このあたり使ってもよいですね。

AWS User Group – Japan 第0回勉強会行ってきました

Uniba RDのメンバーで、AWS(Amazon Web Services) User Group – Japan 第0回勉強会行ってきました。

AWS EvangelistのJeff Barr氏の来日にあわせて開催されて、私も初めてJeff Barr氏の講演を聞きましたが、AWSそのものよりも、AWS Japanのリクルーティングのアピールの方が強くて、そこが印象的でした。リクルーティングに力を入れるのは重要なんですけれどね。。

LTで、Jeff氏が話していた、Cloud Fusion (ColdFusionではない)が、PHP使いとしては気になりました。EucalyptusとCloud Fusionを組み合わせて、AutomaticなAmazonとLocalのHybrid Cloudみたいなものが作れると楽しそう。

preload preload preload