2011年12月11日日曜日

GAME&WATCH(BALL)を自動で操作するマシーンを作って「Make: Tokyo Meeting 07」で展示した



はじめに
12月3、4日に「Make: Tokyo Meeting 07」が開催されるてことで、せっかくだから何か展示したいと思って、GAME&WATCH(BALL)を自動で操作するマシーンを作って、チームラボブースで展示をしました。

MTM07のまとめ。
Make: Tokyo Meeting 07:まさに「才能の無駄遣い」の宝庫――「Make: Tokyo Meeting 07」へ行ってきた (1/2) - ねとらぼ

チームラボブース。
チームラボMake部、MTM07に出展します!

というわけで、作ったマシーンの動画です。



これはなに?
GAME&WATCH(BALL)を自動で操作するマシーンです。
マシーンがゲームを操作するのを眺めて楽しみます。

作った理由
・自動で動く機械が好き
・人がゲームをしているのを見るのが好き
なので作りました。

仕組み
・カメラで画面を撮影し、画像処理をしてボールと手の位置を検出
・ナックルプレス(っぽい)機構でボタンを押す

画像処理
画像処理はこんな感じでやってます。




(1) 元画像
(2) 2値化した画像
(3) アフィン変換した画像
(4) (3)の画像をラベリングした画像
これを見てるだけでも楽しいです。

ボタンを押す
ボタンを押すのはソレノイドとか試したけど、ボタン押す力がなくてダメでした。
12VのDCソレノイドだったからACソレノイドとかにすればいける気もする。

こういう仕組みでもいいかも?

画像処理の結果からArduinoを介してサーボモーター動かしてます。

強さ
MTM07で一日中動かしていましたが、最高で40点でした。
今自分でやってみたら98点でした。なので僕よりは下手です。
というより僕下手だ。

まとめ
今後の展望的なもの。
・機械がかしゃかしゃ動いて楽しいから割と満足
・人工知能とかで動かしたい
とはいえ、しばらくは放置する感じかなと思います!

その他。MTM07の感想。
・みんなメイクメイクしてた
・プラネタリウムは何度見てもよい
・スライムシンセサイザーやばい(見た目が)
・シュークリームもらったらカレーパンだった
という感じでした。

チームラボブースではゲストでTogetterの作者でもある@yositosiさんがレジツイを展示していて、前を通る人が「これが、あの!」みたいな感じで足を止めてたので、すげーっていう感じですごかったです。そういうMakerに私もなりたい。

2011年8月25日木曜日

WindowsPhone IS12T発売!ビッグウェーブはくるんだろうか。

WindowsPhone IS12T
ついに発売されましたね!




会社行く前に有楽町ビックで契約して、会社帰りに受け取ってきました。

選んだ色
実際どの色選んでも微妙だったんで、鉛筆転がして決めました。
あと会社の隣の席の人が「ピンクはもてる」って言ってました。


NHK
NHKの人に契約してるとこ撮られたり、契約後にインタビュー受けたりしました。
NHKの人「WindowsPhoneを買った理由はなんですか?」
自分「うーん。特にないです。」
みたいな受け答えをしつつ。
実際にあんまり理由がなくて。あるとしたら、流行らなさそうだから。

あと、猫も杓子もiPhoneiPhoneなので、そろそろiPhoneいいかなあと。
思ったりしてます。

使ってみた印象
触ってみた第一印象は「軽い」でした。物理的に。
普段iPhone4だから、それに比べると一回りぐらい軽い。
逆に、重みがないぶん全体的にふわふわした操作感がします。
ここら辺はお店で触ってみるとなんとなくわかるかも。

Mangoで採用されてるタイルUIはいまのところあんまりストレスは感じないです。
フォントが微妙とか、タッチの検出精度があんまよくないとかはあるけど。
このあたりは、やっぱりiOSはできがいいなーと感じる部分ですね。

まとめ
ビッグウェーブが起きるかどうかは推して知るべしって感じですが、
iPhone、Androidと十分に戦える素質はあるんじゃないかなと思います。
なんだかいろいろ書いたけど、別にdisってるとかではないです!

ちなみに有楽町ビックの店員さん曰く
19時ぐらいのタイミングで契約した人は80人ぐらいだそう。

話は変わって
9月6日のKinect勉強会 Vol.3 で話をします。
中身のない話をすると思いますが、気になる方はぜひ聞きにきてください!
場所はなんと日本マイクロソフト品川本社!

あと、明日発売の「キネクトハッカーズマニュアル」という本にインタビューが載りました!
内容はサンプルコードからキネクトハックの事例紹介などなど充実したものになってます。こちらもぜひ!


というあたりの話はまた後日ちゃんと書くつもり!

2011年6月26日日曜日

【アメリカ国外でTurntable.fm 終了のお知らせ。】のお知らせ

寝て起きたらTurntableのサービスが終了してました。アメリカ国外で。
昨日てら子で発表したのがTurntableのChrome拡張機能というのもあってびっくりした。

Turntable


@dfnt ヨシナガ(僕秩)
いいサービスだったのに! RT @mehori 【アメリカ国外でTurntable.fm 終了のお知らせ。】 http://skit.ch/btas


あと、アメリカのIPアドレスからアクセスする方法もあるそうです。
串を挿すってやつですね。


@dfnt ヨシナガ(僕秩
【Turntable.fmが米国外からのアクセス遮断を開始-回避方法あり】 http://bit.ly/mNafMR もう以前のような活気は戻らないけれど、IPアドレス回避の方法について。


サービスが終了したのは残念だけど、Turntableの
We are working very hard to try and get you in as soon as possible.
という言葉を信じて待っています!

あと、最近僕秩見にいってなかった。

2011年6月25日土曜日

東京てら子Vol.16 - Turntableの曲情報を取得するふたつの方法

今日行われた東京てら子Vol.16に参加し、LTをしてきました。
前々からてら子参加したいと思ってたんですが、忙しくてなかなか参加できず。
今日やっと参加できました。よかった。

普段JSまったく書かないんでワードがよくわかんなかったりしてます。
「DOM操作」っていいのかみたいな。まあいいか。

LTで話した内容はTurntableの曲情報を取得する方法についてです。
プレゼン資料は以下です。


今回は力技なので画像処理をして曲が更新されたというのを検出しています。
  • JSで画像処理がどれくらいできるのか知りたかった
  • ちょうどAS3に移植したSIFT(SIFT++)があったから使ってみた
といった理由から、SIFTを使っています。
SIFT特徴量のがどれだけマッチしているかによって画像の変化を判定しています。
でもちゃんとやるには「最新の画像がひとつ前の画像のどこに位置するのか」といったところまで考えないと誤認識が多くなっちゃってダメですね。
今日はそこまでやる体力と時間がなかったのでした。

あと、発表はしませんでしたが、DOMの探索で普通に曲情報がゲットできたりします。
(<div class="messages">のあたり)
こっちの方で実装したら画像処理より数倍簡単で数倍安定して動く大変実用的なのものができました。
ちゃんと拡張機能にするとしたらこっちの方を使うかなという感じです。

昨日Turntable専用ブラウザTech1200を見つけてドキッとしました。
糞アプリらしいんですが、すごい勢いでアップデートしているので今後が楽しみです。
Macな人はこれあれば十分な気がする。

てら子、発表多いなあとか思ってたんですが、過ぎてみればあっという間でした。楽しかった!
次はFlashメインのときにもいっかい行ってみたい。

そんなわけで、Turntable楽しいよ!

2011年6月21日火曜日

Turntableで再生中の曲情報を取得する。その2。

まえおき
前回Turntableで再生中の曲情報をポップアップで表示するところまでやりました。
しかし、この方法だと
・ページ開いていないとポップアップが見られない
という問題があります。
そこで、他の作業をしていてもちゃんと通知が見えるようにしなくてはなりません。

この問題を解決するために今回はデスクトップ通知に対応させます。

こんな感じになります↓。


デスクトップに通知する方法
デスクトップに通知する方法として例えばGrowlがあります。
Growlは↓のようにデスクトップに通知を出してくれます。


Growlはこのようにデスクトップに通知を出してくれます。

Chrome Extensionsでもこれと同じような機能があります。
それが、Desktop Notificationsです。そのまんまですね。

これを使うと先ほどのGrowlと同じように、デスクトップに通知ができます↓。


デスクトップの通知にはこれを使えば良さそうです。
また、Desktop Notificationを使う場合にはmanifest.jsonのpermissionsに、"notifications"を加える必要があります。
"permissions": [
"tabs",
"http://*/",
"https://*/",
"notifications"
]

通知する内容を考える
Desktop Notificationで表示する中身を作る方法は二通りあります。
ひとつはSimple Text Notification 、もうひとつはHTML Notificationです。

Simple Text Notificationは
  • アイコン画像
  • タイトル
  • メッセージ
から作ります。

HTML Notificationは

  • 外部のHTML

から通知する画面を作ります。

なので、単純に画像だけを表示するものはない!のです。
Simple Text Notificationのアイコン画像は小さすぎるため、今回の用途には使えません。

そこでHTML Notificationを使うことになるのですが、問題は
「どうやって画像を表示するか」
です。
ただ、あんまりhtmlの知識がないので、画像ならimgタグだろうぐらいしか思いつきませんでした。なので、ここではimgタグを使います。
そして、解決しないといけない問題がもうひとつあります。それは
「どうやって画像を渡すか」
です。

今回の構成ではキャプチャを取るbackground.htmlと通知画面を作るるnotif.htmlの二つのファイルに分かれています。
そのため、background.htmlでキャプチャした画像をnotif.htmlに送らなければなりません。
通常のウェブページであれば、ローカルにあるファイルを読み込んだり、ウェブ上にある画像のURLをimgタグのソースに指定すれば良いのですが、今回の場合、

  • キャプチャした画像をローカルに保存できない(多分)
  • どこかにアップロードすることもできない

といった理由からこれは無理そうです。

しかし、imgタグで画像を表示するにはこれ以外にも画像のデータを直接指定する、という方法が使えます。
画像のデータには例えばBase64エンコーディグされた文字列が使えます。
なんだか、ちょっと道が見えてきました。

通知する画像データを作る
imgタグのソースに画像データを指定できることがわかりました。
そうすろt、指定するための画像データを作らなければなりません。

通知画面で表示する画像は前回(リンク)ポップアップで表示した画像をそのまま使うことにしましょう。
この画像はCanvasに描かれています。
そしてなんと、HTML5のCanvasにはtoDataURL()というまさにこの用途に使うためにあるかのようなメソッドがあります。

この関数はCanvasに描かれた内容を指定した形式でBase64エンコーディングした画像データ(URL)として出力してくれます。こんな感じです↓。
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABGcAAAJqCAIAAAAJ+7rbAAAgAElEQVR4nOzdeXxV1b03/s9aa+9zdnJOQhJCIGAYS1RSxMpQFBUHnPCRipXWscUOONxb2/pcuT/709Zbbf090p9WbWuL16utor2ldcCLCoojCAURLAY1yhhIIISQ4SRn2Guv9fyReTrMYs3n/fJVz7DO2uvsnGP353zXXlu4D20HERERERFRX/LymE9838/JyUkkElprIUQ4HHZd13Ec13WbbyilgiBIJpPOsR4tERERERHRZ00pNXjw4CFDhkgpfd9vampKJBJSSrcDKaUxJh6PMzUREREREVGfo5SSUrbFpMzMzFgs1tTU5DiOlFK1CoJAKcXUREREREREfU5zOhJCABBCWGullG3T80KhkOM4QggppdaaqYmIiIiIiPo0Y0xjY2NjY6NSyrQC0JypADA1ERERERFRn2OttdYCSKVS1dXVjY2NAEKhUCqVcl03EokIIVzXbW7M1ERERERERH2OlBJAMpncsWNHaWnp7t276+rqYrFYOBzOy8sbMWLEuHHjCgoKHMex1jI1ERERERFRn2OMCYLgww8/XPZG6VtlzsfJkVWZBTbDyfF3D6nbcUL...
次は、こいつをnotif.htmlに渡しましょう!

notif.htmlに画像データを送る
画像データを生成することができたので、次は通知するhtmlにこのデータを送らなければいけません。
他のhtmlファイルにデータを送るには

  • 画像ファイルを作る
  • WebSocketを使う
  • クエリを使う

みたいな方法があると思うのですが、今回はクエリを使って実現しています。
画像ファイルは生成する方法がわからなかった。
WebSocketはめんどくさそうだったのと、今回の用途みたいにちょこっと使うにはコストが高かいと思ったのでやめました。
(やるとしたら、サーバー側の実装も必要?)

そこで、クエリを使う方法です。
htmlを読み込むときのファイル名に、
notif.html?q1=v1&q2=v2...
というような指定をすることができます。
こう書くと実際に読み込まれるファイルはnotif.htmlとなり、"?"より後ろに書いた文字列は無視されます。
では、"?"の後ろの文字列はどうなるのか、というと、notif.html側で読み取ることができるんです!

これで、通知用のnotif.htmlを読み込むときに画像データをくっつけてあげれば、notif.htmlに画像データを送ることができそうです。
実際にはこんな感じになります↓。

var notification = webkitNotifications.createHTMLNotification(
    'notif.html?data=' + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABGcAAAJqCAIAAAAJ+7rbAAAgAElEQVR4nOzdeXxV1b03/s9aa+9zdnJOQhJCIGAYS1RSxMpQFBUHnPCRipXWscUOONxb2/pcuT/709Zbbf090p9WbWuL16utor2ldcCLCoojCAURLAY1yhhIIISQ4SRn2Guv9fyReTrMYs3n/fJVz7DO2uvsnGP353zXXlu4D20HERERERFRX/LymE9838/JyUkkElprIUQ4HHZd13Ec13WbbyilgiBIJpPOsR4tERERERHRZ00pNXjw4CFDhkgpfd9vampKJBJSSrcDKaUxJh6PMzUREREREVGfo5SSUrbFpMzMzFgs1tTU5DiOlFK1CoJAKcXUREREREREfU5zOhJCABBCWGullG3T80KhkOM4QggppdaaqYmIiIiIiPo0Y0xjY2NjY6NSyrQC0JypADA1ERERERFRn2OttdYCSKVS1dXVjY2NAEKhUCqVcl03EokIIVzXbW7M1ERERERERH2OlBJAMpncsWNHaWnp7t276+rqYrFYOBzOy8sbMWLEuHHjCgoKHMex1jI1ERERERFRn2OMCYLgww8/XPZG6VtlzsfJkVWZBTbDyfF3D6nbcUL...';
  );
  notification.show();

渡した文字列を取得する
window.location.search.substring()
を使っています。substringの中に渡した文字列が入っているので、
ここから必要な箇所(画像データ)だけを抜き出します。
抜き出した画像データをimgタグのソースに指定すれば画像が表示されます。
やったね!

次回!
次回は一定時間おきに通知するようにしてみます。

ソース
background.html
<html>
<head>
<script>

chrome.browserAction.onClicked.addListener(function(tab) {
  capture();
});

function capture() {
  chrome.windows.getCurrent(function (win) {
    chrome.tabs.captureVisibleTab(win.id,{format:"png"}, function(imgUrl) {
      createImageData(imgUrl, onImageData);
    });
  });
}

function onImageData(imgData) {
  showNotification(imgData, 3000);
}

function createImageData(imgUrl, callback) {

  var img = document.getElementById('myImg');
  img.setAttribute('src', imgUrl);

 setTimeout(function() {

      var canvas = drawToCanvas(img);

      img.setAttribute('src', 'data:image/png;base64,');

      if(callback) {
        callback(canvas.toDataURL());
      }
  }, 10);
}

function drawToCanvas(img) {
  var canvas = document.getElementById('myCanvas');
  var context = canvas.getContext('2d');
  context.fillRect(0, 0, 100, 100);
  var x = (img.width - 760) / 2 + 72;
  context.drawImage(img, x, 238, 360, 88, 0, 0, canvas.width, canvas.height);
  return canvas;
}

function showNotification(data, duration) {
  var notification = webkitNotifications.createHTMLNotification(
    'notif.html?data=' + data
  );
  notification.show();
  setTimeout(function() {
    notification.cancel();
  }, (duration ? duration : 3000));
}

</script>
</head>
<body>
<img id="myImg" src="" />
<canvas id="myCanvas" width="280" height="68" />
</body>
</html>
notif.html
<html>
<script>
  function onLoad() {
    var query = "?data=";
    var imgData = window.location.search.substring(query.length);
    var img = document.getElementById("myImg");
    img.src = imgData;
  }
</script>
<body onload="onLoad()">
<img id="myImg" src="" />
</body>
</html>
manifest.json
{
  "name": "Test",
  "version": "1.0",
  "background_page": "background.html",
  "browser_action": {
    "default_icon": "icon.png"
  },
  "permissions": [
    "tabs",
    "http://*/",
    "https://*/",
    "notifications"
  ]
}

そんじゃーね。

2011年6月18日土曜日

Turntableで再生中の曲をゲットする!

最近登場した Turntable というウェブサービスが面白い。
誰でもDJになれちゃう。みたいなそんないけてるサービス。

@fladdictさんがたくさんつぶやいてたから、なんとなく初めてみたんだけどともかく面白い。
何が楽しいかはちゃんと説明できないけど、なんか面白い。
裏側(選曲)に人を感じるからとかそういうことだろうか。。とりあえずそういうことにする。
Facebookのアカウントがあれば誰でも参加できるから、気になる人はとりあえずやってみるといいです。

これを聴いてると自分の知らない曲がばんばん流れてくるわけです。
そんで、「この曲なんだろう?」って思ったときに、いちいちTurntableに見にいくのはめんどくさいからどうにか曲情報だけゲットしたい!
と思ったところで、もちろんAPIなんてのは公開されてないわけで。
そうなったら力技で解決するっきゃないから、Google Chromeの機能拡張として作ってみた。

が、途中で力尽きた!

今のところこんな感じになります↓。


仕組みとしては、

  1. chrome.tabs.captureVisibleTab()を使って表示されてる部分をキャプチャ
  2. 1.で取得した画像をimgタグのsrcに指定
  3. imgタグの内容から曲情報の部分をcanvasで切り抜き

という感じ。

今後やること。

  • 一定時間おきにバッグラウンドでキャプチャする
  • なんかいい感じに画像を表示する(Growlみたいな感じで)


あと、ろくにテストをしてないので、画面サイズ変えたりしたら表示おかしくなるかも。
そんでもって下にスクロールとかしたら確実におかしなことになるので。

なんというか。
Google Extensionsを勉強しつつだったからやけに疲れた。
早くHTML5とかJSを使いこなせるようになりたい。

ソース置いときます。
popup.html
<html>
<head>
<script>
  chrome.windows.getCurrent(function (win) {    
    chrome.tabs.captureVisibleTab(win.id,{"format":"png"}, function(imgUrl) {
       var img = document.getElementById('myImg');
       img.setAttribute('src', imgUrl);
       img.style.visiblity = 'hidden';

       setTimeout(function() {
         var canvas = document.getElementById('myCanvas');
         var context = canvas.getContext('2d');
         context.fillRect(0, 0, 100, 100);
         var x = (img.width - 760) / 2 + 72;
         context.drawImage(img, -x, -224);
         document.body.removeChild(img);
       }, 100);
    });
  });    
</script>
</head>
<body>
<img id="myImg" src="" /><br />
<canvas id="myCanvas" width="360" height="88" />
</body>
<</html>

manifest.json
{
  "name": "Test",
  "version": "1.0",
  "browser_action": {
    "default_icon": "icon.png",
    "popup": "popup.html"
  },
  "permissions": [
    "tabs",
     "http://*/"
  ]
}

そんじゃーね。

AIR for Androidで作るのだ。

はじめに

最近は猫も杓子もモバイルモバイルで。
その中でもネイティブの言語以外からネイティブアプリを作るというのが流行っているらしい!
Package for iPhoneを皮切りに、AIR for iOSAIR for AndroidiProcessingTitanium Mobileなどなど、いろんなものが出てますね。

実際のところ、Package for iPhoneが出た当初に使ってみたのだけれど、そのときは、
・ipaファイルを作る手順がめんどくさい
・できたipaファイルのオーバーヘッドが大きい
・パフォーマンス出なさそう(多分)
みたいな理由で、すぐに使うのをやめたのでした。
あと、Appleがそういうの禁止しちゃったし。
唯一使い道があるとしたら、既にあるFlashコンテンツ(ミニゲームとか)をさくっと移植することかなあと。

それからしばらくして、状況もだいぶ変わったそうで、
AIR for iOS/Androidは割と使えるみたいです↓。

hi-posi » Blog Archive » AIR for Androidでできない事。

今回使ってみたいと思ったのも先のブログにも書いてあった、

両方抑えたい!→JavaとObjective-Cで開発→コスト高い&てか人居ない!→Flashアプリ(AIR)ってどうなの?
この感じに近い。

作ってみた

ここからが本題。
FlashBuilder 4.5を使って、AIR for Androidのちょっとしたアプリを作ってみた。

できたのが↓みたいなボタンを押したら画像を表示されるアプリ。
アプリって言っていいのかわかんないけど、アプリ。

作り方

1. プロジェクトの作成
ファイル>新規>Flex モバイルプロジェクト
から、プロジェクトを作成する。

2. プロジェクトの設定
次のウィザードに沿ってプロジェクトの設定をしていく。

まずはプロジェクト名やSDKのバージョンを設定する。

次にテンプレートを決める。今回はビューベースアプリケーション。
それ以外に、カメラ使うとか、GPS使うとかいった権限の設定もここで行う。
今回は特殊なものを使わないので、最初の状態のままにした。

サーバーの設定ができるらしいけど、よくわからない&今は必要なさそうなので次へ!

これでプロジェクトを作成できました。

3. GUIのデザインをする
まず最初に、GUIを作りましょう。
ImageViewer>src>ImageViewerHomeView.mxml
を開き、デザインボタンを押してデザインエディタを開く。
iPhoneのInterface BuilderよろしくGUIでコンポーネントを配置していくのだけれど、これのできが超ださい。
どこが?っていう人は一度使ってみよう。

今回はこんな感じ↓でボタン(s:Button)とイメージ(s:Image)を配置した。
それぞれidは_loadButtonと_imageとした。

4. ボタンのクリックをハンドルする
クリックしたときのイベントハンドラを設定するには、もちろん自分で書く方法もあるが、デザインエディタから生成するという方法もある。

ボタンをクリックし
プロパティ>カテゴリビュー>イベントタブ
を開く。
ここのプロパティがclickとなっている右側の欄のカミナリマークを
クリックするとソースの方に自動的にイベントハンドラが追加される。

あとはここにクリックしたときの挙動を書いていく。

5. 画像の読み込み
画像の読み込みはさぐりさぐりやってみたら、なんかAS3とmxmlのあいのこみたいになった。

クリックしたらLoaderを使って、画像を読み込み。
protected function button1_clickHandler(event:MouseEvent):void {
        // TODO Auto-generated method stub
        trace("click", event.currentTarget);
        var loader:Loader = new Loader();
        loader.contentLoaderInfo.addEventListener(Event.COMPLETE, _onLoadImageComplete);
        loader.load(new URLRequest("http://www.google.co.jp/images/logos/ps_logo2.png"));
}        

画像の読み込みが終わったらそれを_imageのソースにセットする。
protected function _onLoadImageComplete(event:Event):void {
    trace("load image complete!");
    var bitmap:Bitmap = (event.currentTarget as LoaderInfo).content as Bitmap;

    _image.source = bitmap;
    _image.scaleMode = BitmapScaleMode.STRETCH;
    trace(_image.width, _image.height);
}
これで、画像が表示される。やったね!
_image.scaleModeをBitmapScaleMode.LETTERBOXにすると、アスペクト比を保持したまま、_imageの大きさにフィットするように表示してくれる。

あとで気づいたけど、
_image.source = "http://www.google.co.jp/images/logos/ps_logo2.png";
とかもできるし超簡単。こっち使えば良かった。

6. デバッグ そして 完成
左上の方にある虫ボタンか、メニューの
実行>デバッグから起動
選択する。
デバッグをPCでするか、デバイス上でするかを決めることができる。

PCでデバッグを行うと(多分)AIR製のデバッグプレイヤーが立ち上がり、動作を試すことができる。
Android純正のエミュレータが死ぬほど起動に時間がかかるのを考えると、デバッグのしやすさはこっちの方がだいぶ良い。

7. 実機での確認
できませんでした><

持っている端末が、みんなの記憶から消えかけている(というかもともと存在してない)ことでおなじみのHT-03Aなので、OSが対応してませんでした。残念。

思ったこと

そんなわけで、作ってみました。
これまでAS3一筋だったんで、Flex自体初めてでした。
addChildじゃなくaddElement使うあたりで微妙に悩んだりもしましたが、
無事初アプリができてよかったです。よかったです。

簡単に作れたのはいいんだけれど、これってJavaで書いても超簡単なんじゃね!
って思いました。
Flashの知識が使えるというのは嬉しいけど、結局ネイティブの開発知らないと意味がない気がする。
それこそ冒頭に挙げた、「AIR for Androidでできないこと」も頭ではわかっても体感としてはわからない。

とりあえずしばらく使いつつ、ネイティブの開発も勉強する感じがいいんでしょうか。
まずは、複数画像読み込んで、ちゃんとビューワーにしてみるつもり。

コード
<?xml version="1.0" encoding="utf-8"?>
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009" 
        xmlns:s="library://ns.adobe.com/flex/spark" title="HomeView">
    
    <fx:Script>
        <![CDATA[
            import mx.graphics.BitmapScaleMode;
            protected function button1_clickHandler(event:MouseEvent):void
            {
                // TODO Auto-generated method stub
                trace("click", event.currentTarget);
                 var loader:Loader = new Loader();
                loader.contentLoaderInfo.addEventListener(Event.COMPLETE, _onLoadImageComplete);
                loader.load(new URLRequest("http://www.google.co.jp/images/logos/ps_logo2.png"));
            }
            
            protected function _onLoadImageComplete(event:Event):void {
                trace("load image complete!");
                var bitmap:Bitmap = (event.currentTarget as LoaderInfo).content as Bitmap;

                _image.source = bitmap;
                _image.scaleMode = BitmapScaleMode.STRETCH;
                trace(_image.width, _image.height);
            }
            
        ]]>
    </fx:Script>
    
    <fx:Declarations>
        <!-- 非ビジュアルエレメント (サービス、値オブジェクトなど) をここに配置 -->
    </fx:Declarations>
    <s:Button id="_loadButton" x="193" y="594" label="Load" click="button1_clickHandler(event)"/>
    <s:Image id="_image" x="10" y="92" width="460" height="371"/>
</s:View>

2011年6月10日金曜日

enchant.jsでゲームを作っていた。

はじめに
そういえばenchant.js使ってゲーム作ったんだった、
と思い、折角なので何を作ったか、何を思って作ったかを紹介してみます。


あらまし
enchant.jsというのはUEIの研究部門ARCが作っているHTML5/JavaScriptベースのゲーム作成ライブラリ。
これを使うと簡単なゲームが簡単に作れちゃうのです。
超頑張ると超大作RPGなんかも作っちゃったりすることもできます。
そんな、ゲーム作成ライブラリ。


つい先日行われたIVSのLaunch Padで優勝したことも記憶に新しいですね。


そんなenchant.jsはこれまたUEIの研究部門ARCが運営をしている
9leapというゲーム投稿サイトのオフィシャルライブラリとしても使われています。


その9leapが5月の頭に9leap 9days challengというゲームコンテストを開催しました。
(9と9をかけているわけですね。)
5月1日から9日までに投稿されたゲームの中から、いろんな要素を加味して優勝を決めるコンテストです。


ちょうど時間もあったし商品のiPad2も欲しい、ということで、コンテストに参加することに決めました。
コンテスト期間中に投稿したゲームは


  • 落穂拾い
  • 迷い熊オーバーラン!


の2つ。それぞれ紹介していきます。


落穂拾い





どんなゲームか?
落ちている「ば」の中から「ぼ」を探し出し、拾うゲームです。
なぜ思いついたのか?
「おちば」と「おちぼ」って字面似てるなあとふと思ったため。
工夫したポイント
色をつけて、回転させた。
その他
思いついてから2時間ぐらいで形にして、投稿しました。
ゲームデザインも何もないので、運の要素が強いゲームになっています。
まだ9leapが公開されてから日が浅いこともあって、投稿するとすぐに遊んでくれる人がいた。
これには驚いたし、嬉しかったです。次のゲームを作るやる気もでました。


迷い熊オーバーラン!





満を持して登場した次のゲーム。※迷い猫のそれとは、特に関係ありません。
どんなゲームか?
熊が100m走るタイムを競うゲームです。
なぜ思いついたのか?
落穂拾いの反省を活かし、
  • できるだけ、シンプルなルールで、
  • 短時間に終わり、
  • 頑張れば記録のばせるかも!と思わせられる
ようなゲームを考えました。
それに加えて、他のゲームを遊んだときに、熊が走るアニメーションが面白かったため、
熊を走らせるゲームにしようと決めました。
工夫したポイント
実際の100m走とおなじように10秒前後でゴールできるように調整してみた。
雲を動かすことで疾走感を醸し出した。
ゴールフラッグに9leapのロゴをあしらうことで、媚を売ってみた。
その他
開発を始めたのがコンテスト終了2時間前だったので、終止どきどきしながら作ってました。
投稿後は、初めの狙いがよかったのか媚を売ったのがよかったのか、プレイ回数も着々と増え、いつの間にか1000回を超えていました。
さらに、人気のゲームにランクインされていたのも誇らしかったです。
(でもなぜかお気に入りが1個もついてないのが不思議。)


コンテストの終わり。
当初はコンテストで優勝することを目的としていたけれど、
実際に締め切りが過ぎてみると、プチ燃え尽き症候群みたいな感じになってしまい、
結局何が優勝したのかも見ていないし、今も知らない。(結果って出てるんでしょうか?)


さらに、JS恐怖症みたいな感じになり、しばらくJSとは距離を置こう、と相成りました。
JSは自由すぎて、それが逆につらい、みたいな感じです。


でもやっぱりゲーム作るのは楽しいし、遊んだ人の反応が見られるのもすごい嬉しい。
なので気が向いたときに、また投稿しようと思ってます。


最後に。
ミニゲーム2つしか作ってないのにJS恐怖症なんて!と言われそうなんですが、
実はこれらとは別のゲームを細々作っていました。
その話は「enchant.jsでゲームを作っていた。その2」で!

2011年6月4日土曜日

Kinect勉強会 Vol.2 で「MSのくせになまいきだ。」を発表しました

#追記(2011/06/04)
発表資料中に掲載した動画がプライベートモードになっていて見られなかったのを修正しました。


LTしました。

木曜日に行われたKinect勉強会 Vol.2に参加し、LTをしてきました。
「MSのくせになまいきだ。」というタイトルで
WiiをKinectで操作するアプリケーションについて話をしました。


このタイトルをぼけーっとしながら当日の朝に考えて、
会場行ったらMSのエバンジェリストの人がきていますーとか、もうダメだと思った。
自分の発表後、MSの方がにこにこしながら話かけてくれたり、
皆すごい良い方々だったので壁紙をIE9にしたりしました。IEばんざい!


当日の様子は以下から見られます。
http://www.ustream.tv/channel/team-lab


発表資料は以下に。


発表の詳しい内容は資料を見ていただければと思います。
今回は時間がなくデモとかできなかったんですが、
また機会があればそういうのもやりたいですね!


自分以外の発表はどれも面白くて、刺激を受けました。
特に大津さん(@jovi0608)の「Kinect on HTML5」は
なんか未来っぽい感じでよかったですね。


ホストとなる人がKinectで取得した情報を発信して、
それをリアルタイムでWebサイト見てる人みんなが共有できるというものなんですが、
言葉で説明してもよくわからないので発表資料見てください。



KINECTセンサープログラミング(Kinect本)
をゲットした

この本の著者である中村薫さん(@kaorun55の基調講演後に行われた
じゃんけん大会になんと勝利し、本をもらうことができました!嬉しい!


一通り読んでみたところ、中村さんが言っていたように、
日本語のリファレンス本としてナイスな一冊だなと思いました。
特にこれからKinectを始めようと思っている人にはオススメです。


実のところ、自分が今回発表したKinect側のプログラムはサンプルコードを改造して作ったものです。
なので、基礎をすっ飛ばした(本を読んで、なるほど震度画像はそうやって取得すんのかーとか、思ったり。。)
自分にとってもためになる本なので、あとでちゃんと読みます。





戦い終わって

Kinect勉強会で発表するのが決まってから、
Kinectプログラミングを始めるというなんとも無茶な感じでしたが、
無事発表を終えることができて一安心です。


最後になりましたが、主催の@hagino3000さん、会場を貸していただいたniftyの皆様、
Ustをしてくれた@tksさん、発表者、参加者の皆様、お疲れさまでした!


ほんとはカービィの話とか、作るきっかけの話とかしたかったんですが、
それはまた別の機会に。

2011年5月1日日曜日

新感覚Twitterビューワー「ぐんまけん!」



ゴールデンウィークはいかがお過ごしでしょうか。
僕のゴールデンウィークは昨日で終わりました


さて、ゴールデンウィークということで、
新感覚Twitterビューワー「ぐんまけん!」を作りました。
まずは以下の動画をご覧下さい。



新感覚Twitterビューワー「ぐんまけん!」 from Gota Kakehi on Vimeo.


概要
新感覚Twitterビューワー「ぐんまけん!」はDock内に常駐する、Twitterのつぶやきを眺めるアプリケーションです。あたかもDock内で生きているかのように感じられます。
コンセプトとしては2000年初頭にはやった、伺か(あれ以外の何か、偽春菜、任意、等々)とか、そういうとこを狙っています。


機能
主な機能は以下の通りです。

  • 「どせいさん」で検索したつぶやきをしゃべる
  • かわいい
  • 割と邪魔


実装
今回の注目ポイントはいかにどせいさんの上に吹き出しを出すかというところです。
実際にはDockの画像を取得して、単純なパターンマッチングをしているだけです。


パターンマッッチングにはOpenCVを使おうとしましたが、MacでOpenCVを使うコストが恐ろしいほど高い(インストールとか、NSImageとIplImageの変換とか)ので、結局自前でパターンマッチングしています。


※公開の予定はありません。


では、よいゴールデンウィークを!

2011年2月28日月曜日

mxmlc + FlashPlayer11(Molehil) + Away3D 4.0 Alpha

次期Flash Playerに搭載されるネイティブ3Dエンジン(通称Molehil)が搭載されたFlash Playerが公開されました。

Adobe AIR and Adobe Flash Player Incubator


そして、Molehilの紹介記事や、既にコンパイルしてみた、という記事もあります。


これらの記事を参考にして、mxmlcを直で叩いてる人向けにMolehilを使う手順を解説します。

手順1. ClockMaker Blogさんの記事を参考にする


まずは、ClockMaker Blogさんの記事(Molehill を搭載した Flash Player Incubator プレビュー版が公開)の手順4までを終わらせましょう。

手順2. flex-config.xmlを修正する

FlexSDKの「frameworks/flex-config.xml」を適当なエディタで開き、15行目〜19行目を次のように書き換えます。

修正前
    
    10.2.0

    
    11

修正後
    
    11.0.0

    
    13

手順3. Away 3D 4.0 Alpha をダウンロードする

ここもClockMaker Blogさんの手順5.と同じです。
Version 4.0.0 Alpha (Broomstick) の source と examples をダウンロードします。

手順4. libsとsrcをコピーする

サンプルのコンパイルに必要なファイルをソースからコピーします。

  • 「away3d_4_0_0_molehill/libs」フォルダにあるapparat-lzma-decoder-1.0.RC8.swcを「examples_4_0_0_broomstick/libs」にコピーします。
  • 「away3d_4_0_0_molehill/src/」フォルダにあるaway3dを「examples_4_0_0_broomstick/src」にコピーします。
  • 「away3d_4_0_0_molehill/src/com/」フォルダにあるadobeフォルダを「examples_4_0_0_broomstick/src/com」にコピーします。

手順5. コンパイルする

ターミナルなどで「examples_4_0_0_broomstick/src」に移動します。
以下のコマンドでコンパイルできるでしょう。
% mxmlc -library-path+=../libs/ TraverserTest.as 



ではよい Molehill ライフを!

おわりに

馬鹿全さん、ClockMaker Blogさんの記事がよくまとまっていているため、ほとんどやることなかった!という感じです。
あと、黒MacBookだとグラフィックカードが対応してなくて、あんまりうまみがないですね。残念。