SyntaxHighlighter

2012-12-16

「アノニマス・ライフ」みてきた

ICCでやっているアノニマス・ライフみてきました。

米朝アンドロイドがすごかったです。みれば作り物で機械的な動作である事はすぐに分かるのに、時々ふと動く、目立ったり口が、なんか人っぽいなとも感じてしまいます。そんな動きに見てて飽きない。赤ちゃんの動きを見てるのも飽きない事がありますが、そんな感じに近いかも知れません。

あと丁度、アンドロイドを使ったパフォーマンスもやっていたので、見ました。人がアンドロイドの髪を切りながら会話をしていく、というものだけど、会話が成り立っているようで、成り立っていないようでとう不思議な感じでした。アンドロイドは幾つかの定型文を繰り返し話しているだけなのだけど、人側が合わせるのがうまい、のかも知れません。
見た後にもらったリーフレットに
機械によて再現できてしまうくらい、僕たちの日常の会話には非常に機械的な側面があるのだろう。
とあったのが印象的でした。
会話だけでなく、最近は、動作や思考も機械的なところが多々あるような気がします。

2012-12-08

エヴァンゲリヲンQを見たのだけど

ようやく見たのだけど、正直よく分かりませんでした。。。感想としては、ターミネータ4をはじめて見た時に感じた、前作までとの隔世感というか何というかに近いかなあ。
聞いたことがない単語がわんさか出てきて、なかなかついていけなかったです。あと、対立勢力が何処で、それぞれの勢力の思惑が何か良く分からなくて、最後の展開はどの勢力の得になったのかが分からないのでした。これは昔の作品を見てないと辛いのかしら。
用語集とかあったら見たいです。

全席自由映画館も久しぶりでした。小学校の頃「ドラえもん」の映画を立ち見で見たなあと思い出しました。さすがに今回は公開から時間が過ぎていたので余裕で座れましたけど。

秋のアニメ祭り的なシーズンが終わったと思ったら、冬休みは「ホビット」とか「レ・ミゼラブル」とか見たくなったなあと。

2012-11-04

「TOKYO DESIGNERS WEEK 2012」へ行ってきた

初めて行ってきましたが、なかなか楽しかったです。しかも予想外に広かったので、回るのにかなりの時間がかかりました。



絵画の販売会場で絵描きさんとお話し出来る機会もありました。そこで、高い染料やそうでもないものがあるとか、絵の作り方とか、色々教えてもらえて、勉強にもなりました。

アーティストって呼ばれる人は、基本的に語りたい人なのかなあと思ってみたり。語りたくて語りたくてしようがないものを持っている人が、アーティストを目指すのかも知れませんけど。


2012-10-28

「DCEXPO 2012」へ行ってきた

毎年行っている気がします。ってか最近のブログが展示会とかセミナーへ行ってきました系ばかりなのだけど、自分、大丈夫だろうか。

土曜日に行ってきましたが午前中はそれほどでもなくても、午後からすごい人の数でした。去年よりも人が多かったのかしら?会場は狭く感じました。
いろいろデモも体験してみたかったのだけど、並んでいるところも多くて、十分見れなかったのは残念でした。平日に行くべきだったのかも知れません。
早く、平日業務時間中にこういう所へ行っても文句を言われないような職場に異動したいものです。

個人的には展示物の中では、「Gocen」と森ビルの展示が面白かったです。

「Gocen」は、フリーハンドで書いた五線と音符を書いてそれをスキャンする事で音が出る、らしいです。和音や臨時記号にも対応しているそうです。ただ四分音符以外の音符(八分音符とか全音符とか)には対応していないらしく、ユーザがスキャンの速度を変えて音のテンポを決めるらしいです。
ガジェットとしても面白いですし、素人音楽やっている私としては、こういうのは結構普通に欲しいです。なんせ楽譜見ても具体的な音が分からないんです。。。

森ビルの展示は、模型作る為に東京23区の写真や建物データを入手したけど、模型以外に何か使えないか?という事を考えておられるようです。例として表参道を再現したセカンドライフっぽいビューワと、3DのビルをARっぽく表示できて、それをKinectで操作したり、遠隔地にいる人達と一緒に操作できる、遠隔会議室的なものを展示してました。
展示しているモノ自体も興味深いですけど、森ビルという所がこう言ったARとかKinectとかで何か出来ないか?と考えている事が驚きでした。


ただ、全体的に去年に比べると、割とおとなしいというか落ち着いた感じがしたのはなんでだろう?結構既に知っている、聞いた事があるものが多かったからかもしれないだけかもしれないけど。

2012-10-08

「六本木アートカレッジ」へ行ってきた

タイムテーブルをみて面白そうだったので、行ってきました。
人が多くて狭い廊下を移動するのは大変だったけれど、予想以上に面白くて、行けて良かったです。

いろいろと興味深い話を聞けたのだけど、その中でいくつかメモとして。

  • アフタヌーントークで「感性を磨くのはどうすれば良いのか?」というような質問があって、その回答に「良いモノに触れることだ」、というようなやり取りがありました。個人的には、じゃあ良いモノってどうやって分かるのだろう?ってのが疑問に感じます。
    感性があるから良いモノが分かるのか、良いモノが分かるから感性があると言えるのか……。鶏と卵の関係な気もしてしまいます。
    まあ、良いモノなんて人それぞれ違って、なんとなく良いモノを集める→感性ってのがなんとなく形見えてくる→それを元に良いモノが見えてくる→……っていう、自己組織化的なモノなのかなあと、ふと思いました。
  • お寺のお坊さんのトークもありました。お坊さんから経営論的な話が出てくるのが驚きでした。一歩はずれるととっても生臭い話になりそうですが。内容自体は仏教で諸行無常を訴えてるんだから、寺も坊さんも変わらないとね、という至極全うなお話でした。
    また『今までの』私というのに捕われるのでなく自分に取って本当に必要なことを考えて自由になりなさい、というお話もありました。これはとても考えさせられます。
  • 明和電機の方もご講演されていていました。ご本人が書かれたスケッチを提示して、アイデアは何度も何度も考えて初めて良いモノが生まれてくる、というようなお話でした。良いモノはパッとは出てこないという事みたいです。
  • などなど

アーティスト、と呼ばれる方はお話もうまいなあと思いました。仕事上、語りたい方が多いのでしょうか。難しい部分もあって付いて行くのが辛い部分もありましたが。
作っている人って、当然ただ作っているわけではなくて、いろいろ考えているのだなあと。
自分にそこまでの深慮があるだろうか、と思わずにはいられません。


2012-10-07

「CEATEC 2012」へ行ってきた

ここ数年は半分惰性で行っているかも知れないけど、CEATECに一応行ってきました。

去年に比べるとブースや人が少なく感じたのは気のせいでしょうか。去年だと有名どころのブースは立錐の余地が無かったような気もしたのですが。
それでも、並んでるところは並んでいるので、体験出来なかったものも多かったです。

あと、あっと驚くような新しい感はいつもより少なかった気もします(もちろん、自分の関心がある範囲内での話です)。それよりは今ある技術を色んなものと繋げる、という方向なのかなあと思いました。

感想、なんか辛口になってしまいました。

  • KDDI Smart Box
    • テレビとスマホ、タブレットでWii Uっぽいことが出来そうな
  • KDDI HTML5でマルチデバイス対応します、的な
    • 土曜日の一般参加者に説明されても、と思いました。所詮作る側の理論だし。逆に平日の参加者なら興味深いだろうと思います。
      本当にHTML5でマルチデバイスが簡単に作れるかというのは、最近は少し疑問です。
  • DOCOMO 視線のUI
    • 視線認識によるUI自体は、面白いし使い道もあると思いますが、タブレットに対して使えるかは疑問。体験出来ていないので、デモを見ただけの感想だけど、特にブックリーダを視線で操作するのは、正直めんどうな気がしました。
  • DOCOMO うつして翻訳
    • これは普通に便利そう。特に料理メニューとか。
  • 4Kテレビ
    • ソニーブースで2Kと比べて文字もくっきり、という展示をしてましたが、ドラマやアニメ等で雑な作りは出来にくくなるだろうなあと。
      3Dテレビは何処へいったんだろう?
  • TOYOTA
    • TOYOTAって車だけではなかったのですね。家と車のネットワークとかやってるみたいです。
    • Smart INSECTというスマホと連携する車の展示をしていました。その車の頭頂部にあるカメラが取ってもKinectっぽかったのは気のせいでしょうか(モーション認識のデモをしていた)。
    • 車とスマホをつなげたときのアニメーションとかはデモ用演出なのだろうけど、どれくらい使いやすいのだろうか?
  • 超臨場感コミュニケーション
    • という幾つか企業、大学のの研究が紹介ブースがあったのだけど、最近は視覚を利用した触覚の錯覚が流行っているのでしょうか?うまく利用するとおもしろ体験は出来るかもとは思います。

2012-09-29

「YAPC::Asia 2012」へ行ってきた

YAPC::Asia 2012へ行ってきました。YAPCは初めてでした。
感想は、Perlユーザ、アツいよ。

以下個人的な感想です。オレオレ脳内変換がまぎれている可能性もあります。

What Dose Your Code Smell Like?

Larry Wall氏のご尊顔を拝見しました。ありがたやありがたや。
タイトルと喋っている内容がだいぶ違う気もしますが、ソーティングを例に、Perl5で書かれたスクリプトをPerl6対応に書き換えていく、という内容でした。
なんかPerl5とPerl6って違う言語じゃん、って感じです。
所々、functional programmingという言葉が聞こえてきて、関数型言語を意識しているようです。もっとも、どの辺りが関数型なのか私にはよく分かりませんが。

Web::Security beyond HTML5

YAPCなのにPerlの話は無く、タイトルにHTML5とあるのにあまり関係ないという。。。
ブラウザにまつわる脆弱性やAjaxの話、そしてモダンなブラウザに含まれている保護機構に関する話でした。ブラウザの挙動も考慮してWebアプリはセキュリティ対策を考えて行く必要がある、との事でした。
Web開発者はかなりの知識を求められるなあと思います。こういう知識を少なくとも一人で片手間でで集めるのは限界があるだろうなあとも。会社にもこういうセキュリティを専門に扱う人達がきっと必要なのだろう。

リアルタイム通知システムの舞台裏

通知システムの構成に関するお話。push通信を実現するのは、notificationサーバの多重化やapplicationサーバとの連携を考えると難しい。Rabbit MQを利用することで、notificationサーバをクラスタリングして、client側からもapplication側からも多重化を意識させないように構成した、というような内容でした。
個人的にはWeb-DBぐらいのシステム構成しか触った事が無いので、新鮮なお話です。

Perl初心者が作った運用サーバ

自作の構成管理ツールToryoのお話。DSLでサーバのあるべき状態を記述して、サーバのセットアップやテストが出来る、というような内容でした。
インストール用のバッチスクリプトをメンテするのが楽か、DSL等の設定ファイルをメンテするのが楽かは、人によりけりな気はします。でも私はこういう仕組みは欲しいなあと思いました。

平均レスポンスタイム50msをPerlで捌く中規模サービスの実装/運用

Best Speaker 第3位をお取りになられたとの事です。技術的な内容もさることながら、アドネットワークの仕組みが興味深かったです。
SSP(Supply Side Platform 広告枠の販売を支援する仕組み?)とDSP(Demand Side Platform 広告主の広告掲載を支援する仕組み?)というのがあって、ページを表示する100ms程度の間に、DSP間で広告枠をオークション(RTB Real Time Bitting)が行われているそうです。
なかなか凄いな、広告業界。期待されるレスポンス時間が〜100msだなんて、比べる対象が違うけど、ソーシャルゲームよりもシビアかも知れないと思ってしまいます。
そんな厳しい制限を守る為に、出来るだけ外部通信しないとか、SSD使うとか、地道な対策が打たれているとの事です。立派なインフラは一日にしてならず、って所でしょうか。

「新しい」を生み出すためのWebアプリ開発とその周辺

Best Speaker 第1位をお取りになられたとの事です。サービスの企画の方法とそれの作り方のお話でした。
企画(何を作ろう?)は、哲学、アイデア、テーマ、コンセプト、デザインが一貫したものを考える必要がある、との事です。これがあればサービスがぶれないし人に説明する時も有効らしいです。この辺りはWebに限らずどんなサービスの企画でも共通する話かなと思います。
あと、実際にアプリを開発する時に、フレームワーク等の選択は、規模を考えて、それに似合ったものを選ぶのが良いらしいです(どんな最新の技術を用いても、対象の規模ではあまり意味が無い、的な事にならないように)。

Perl今昔物語

他の言語系カンファレンスに比べると(少なくともこの前のPyConに比べて)、インフラやプラットフォームに関する発表が多い気がしました。このセッションによると、YAPCでもインフラ系のネタはこの東京でのみ多く、他のところでは多くない、大手Webサービス業者がPerlを利用しているからかも、という話があった。そうなのかも知れません。
世の中的にインフラ運用ツールは何で書かれている場合が多いのでしょうか?大変気になります。

Perlで始める!初めての機械学習の学習

機械学習大盛り上がりらしい。リーダブルコードの本を差し置いて機械学習の本の売れ行きが高いとか。色んなところで(社内外を含めて)勉強会が行われているらしいので、自分も勉強したいなあと思ってます。ただ15000円はなかなか勇気がいります。


初めてのYAPCでした。面白かったです。
あとは、もっと周りの人ともお話し出来るようにならないと。。。
人に話しかけるの苦手なんです。

2012-09-17

「PyCon JP 2012」へ行ってきた

PyCon JP 2012へ行ってきました。PyConの前日には、AWS Summitへも少しだけ行っていて、いやあ、今月はイベントが多い。


1日目は全部出て、2日目は午後だけ参加しました。トラックの数が多くて、何を聞いて良いのやら悩みました。
ただ、行ってはみたものの、私のPython力は、たまに個人用ツールとして使っている程度で、また、Webフレームワークとも無縁なので、うまく理解出来なかったセッションも多かったのです。力不足を感じました。もっと通常時にPythonを使える機会を増やせば良いのだろうけど。
Sphinxの話はもっと聞きたかったけど、部屋に人が溢れかえってしまっていたため断念。残念です。
あと、お昼ご飯のサンドイッチがおいしかったです。。。

と,感想を書いてみたけど、何を言いたいのか分からない文章になってしまいました。

2012-09-09

HTML5 Conferenceに行ってきた

HTML5 Conference 2012へ行ってきました。参加人数1000人ってとんでもない数だなあ。午後以降はルーム移動の度に、入り口で待つ行列の長さが凄かったです。
会は大変為になるもので、スタッフ皆様に感謝申し上げます。

以下、気になったものを徒然なるままに書きます。

基調講演

  • 今後、Webアプリが簡単に拡張、他サービスと連携出来るように、Web Componentって技術、考えが重要になってくるらしい。
    • 現時点であまり想像がつかないのだが、おいおい勉強していこうと思う。
  • ブラウザに様々なAPIが追加されてきている。あくまで構想レベルだけど、中にはかなりローレベルな通信レイヤーを扱えるAPIもある。幅広いシステムに影響を与えかねず、故にこれまで以上に安心・安全に対する責任が出てくる、とのこと。登壇者がネットワーク系の会議でこの話をしたら、出席者の顔が曇っていったとか......。
    • 私も顔が曇る側の世界の人間だから、気持ちは分かる。まだまだアプリ屋とインフラ屋の溝は深い。

HTMLとかCSSとかAPIとか -2012秋編-

  • HTML5の後にも新たな機能追加は続き、あくまでHTML5ってある時点のスナップショットらしい。
    • ......さて、ついていけるだろうか?
  • Custom DOM Elementsってのが検討されていて、カスタム要素をAPI付きで定義出来るらしい。
    • なんかライブラリ作ったり使ったりする人だと便利そうかも。


豪華な3Dを扱うAPI: WebGL、そしてThree.js

  • WebGLは触ったことあるが、面倒くさいというのは同意。超絶技巧な3D表現を目指すなら、シェーダーを扱うことは必須だろうけど、とりあえず3DってことならThree,jsは便利そう。物理演算と合わせて遊んでみたいのだけど、重い腰がが上がらない。

ブラウザを介した新しいリアルタイムコミュニケーション

  • WebRCTの話。ビデオチャットが簡単に出来る(今のところビデオチャットしか出来ない)という話。
    • 実際はネットワーク周りの罠に嵌って、使うのは難しい気もする。実際に使用例が分からないが、どれ位使われるだろうか。
    • GetUserMediaは普通に面白そう。遊んでみたいが、重い腰が上がらない(汗)。

スペシャルセッション

えっと、頂いてしまいました、一番スペシャルな景品を......。
本当はクイズで2位だったので、別の景品だろうと軽い気持ちで壇下に来てみれば、一位の方が名乗り出なかったため、結果、繰り上げで私が頂いてしまいました。壇上では緊張して、まともな対応が出来ずスタッフの皆様、会場の皆様に申し訳なく思います。ごめんなさい。でも、あまりに予想外だったんです。

私が2位だったのは、きっと半分ぐらいの人が正解することより、早押しでランキングに表示されることに力を入れていた為かとwww。あと、回答はほとんど勘だったので運が良かったことかと(今年の運を使い果たしたかも)。APIとかjavascript系の話が出てたら、もっと酷い点数だったと思う。でも全くヤマ勘でもなく、今までのHTML5とか勉強会等で聞いた話が役に立った部分もあることは確かで、勉強会に参加した甲斐があったとも思います。

何はともあれ、素晴らしい景品ありがとうございます。嬉しい、と同時に、どう使えばいいのだろう......

2012-09-04

一瞬で心をつかむできる人の文章術」を読んだ

もう少し文章を書くのがうまくなりたいと思っていたところ(とりあえずブログもう少しまともに書けるようになりたい)、丁度近所の図書館で「一瞬で心をつかむできる人の文章術」という本を見つけたので、読んでみることにした。

本の半分くらいは文章を書く際に気をつけるところや、書き方の練習方法が書かれていた。もう半分くらいで、文章が書けることのメリットが語れていた。読んでいくと、頑張って練習したくなる気になってくる。お決まりのセールストークな面もあるだろうけど。

本の内容で特に気になったところは、一番重要なのは「考えること」で、そして書くためには準備が必要である、という部分だった。どれだけ自分の伝えたいことを考えて、書くための材料を集められるか、というのが重要らしい。
少し前に、会社でビジネス文書の書き方講座を受けた時も、同じような事を習った覚えがある。事前準備として、伝えるべきことはっきりさせて、材料を集めて、文書を組み立てる、という内容だったはず。やはり、事前準備重要、ということなのだろう。

事前準備の重要性は、文章を書くだけでなく、普段の生活でも感じることはある。例えば、仕事でサーバの監視運用なんてやっていると、事前(平時)に手順や情報を整理されていれば、いざ障害が起こった際、多少なりともパニック度が下がるだろうなあ、と思う(注:仮定法です)。

備えあれば憂いなし、ってやつかしら。
でも事前準備、考えることって一番難しいことのような気もする。

2012-08-31

pythonでsvm

PythonでSVMを使おうとするならどうしたら良いかと思っていたら、OpenCVにちゃんと関数があるじゃあないですかと、、

import numpy as np
import scipy as sp
import cv2

train_data = np.array(X, dtype=np.float32)
responses  = np.array(y, dtype=np.float32)
param = dict( kernel_type = cv2.SVM_RBF,
              svm_type = cv2.SVM_C_SVC,
              gamma = 1.0/(2.0*0.01),
              C = 1)
svm = cv2.SVM(train_data, responses, params = param)
predict_data = np.array([ int(svm.predict(v)) for v in train_data ]) 
print "Training Accuracy %f" % (np.mean(predict_data == y) * 100.0)

Numpyと一緒に使える。SVM関数に与えるデータもラベルもfloat32型にしないといけないらしい。

参考
  • http://stackoverflow.com/questions/8687885/python-opencv-svm-implementation
  • http://docs.opencv.org/modules/ml/doc/support_vector_machines.html

2012-08-19

旅行「新潟・金沢」

水と土の芸術祭金沢21世紀美術館に行くために、夏休みで帰省する前に、北陸方面をぐるっと回ってきました。

行程

1泊3日(?)のなかなかの強行スケジュールです。
  1. 東京から夜行バスで新潟
  2. 新潟市中心で水と土の芸術祭をぐるっと見る
  3. 高速バスで新潟から金沢へ
  4. 金沢で一泊
  5. 21世紀美術館とか兼六園とか
  6. 金沢から実家へ帰省
行く前の天気予報は曇り時々雨だったのですが、実際は金沢で少し降られただけで、ほとんどは良い天気でした。最近旅行の晴れ率が高い。。。

水と土の芸術祭

時間も車もないので、メイン会場と新潟市中心にある展示を見てきました。
会場は予想していたよりも人は少ない感じ。その分静かに落ち着いて見ることができました。メイン会場は良かったけど、日が暮れた夕方以降に行くとまた面白いかもなあと、思いました。
それ以外の場所は作品が疎らに点在するので、一点一点見に行くのが大変でした(大地の芸術祭ほどではないだろうけど。。。)。やっぱり車を利用するか、ツアーバスとかをうまく使った方が良いのだろうなあと。
人が少なかったのは、期間が長いので人が分散化されているのかそれとも、みんな大地の芸術さ、げほんげほん。あと街として盛り上がってるかなあと思っていたけど、それほどでもない気も。普通の美術館には無い、手作り感満載なのは良かったなあと。
芸術祭メイン会場


金沢21世紀美術館

一度は行ってみたかった、21世紀美術館。それ自体有名なのと、兼六園の隣にあるので、かなりの観光客が来ていました。有名作家の展示会でもないのに、美術館にこれほどの人が居るのを始めて見たかも。。。
中も噂通りの楽しさでした。プールの作品がおもしろかったです。雨が降るとプール上からは見る事が出来なくなるのだけど、当日は雨が降ったりやんだり。天気を確認してから行くといいです。
ただ、構造がとってもモダン(?)で、道に迷いやすいのと、人が増えると導線が分からなくなるのが、辛いかなあと思ったりもしました。
21世紀美術館、まだ午前中なのに人多い
レアンドロ・エルリッヒ <<スイミングプール>> 上から
レアンドロ・エルリッヒ <<スイミングプール>> 下から

そのた

折角なので兼六園とか、金沢城公園とか。広いです。金沢市内は半日では回れない、という事が分かりました。
兼六園
金沢城公園

今度は山口のYCAMに行きたい、けど遠い。。。

2012-07-08

「Mobageを支える技術」を読んだ

一部話題になっていたので、読んでみました。他の会社がどうやって仕事をしているかは当然気になるわけでして。。。

個人的にはPart2から3にかけてが、ただただ感服するばかりでした。比較的仕事内容が近い、という理由もあると思いますが。主に電車内で読んでいたのですが、あまりに唖然をして、端から見ると目が大きく口は半開きで、相当間抜けな顔をして読んでいたに違いありません。

ここって、日本有数のITインフラだと思いますが、一日にして出来たわけではなくて、地道な調査と改善の繰り返しで作られてきたのだなあと思いました。
あと、この本に挙げられたいくつものインフラ改善方法とかチューニング方法は、アプリ側とサーバ、ネットワーク側どちらか一方が頑張るだけでは十分でなくて、双方が密に連携しないとなかなか出来ないと思うのだけど、その辺が巨大インフラを支える上では重要なんだろうなあとも思いました。内情は如何ほどか分かりませんが、DevOpsという章(実体は監視の内容でしたけど)が設けられているので、大きく気にしているテーマの一つなのだろうと想像します。

Part4の分析技術も期待していたのですが、ちょっとMahoutの使い方に重点が置かれていて、実際にどういう場面でどのように使われているのかが見えにくかったのは残念です。まだまだこれからの分野なのかもしれないけれど。今後の情報に期待。。。



2012-07-06

「特撮博物館」見てきた


先行公開に当たったので、折角なので見てきました。

東京都現代美術館の企画展は結構ボリューミーな物が多いような気がするけど、この展示もかなりボリュームたっぷりだった。音声ガイドプログラムのポイントが70カ所近くあって(各ポイントの分量はピンキリだけど)、総計一時間近くあるという事で、これを聞きながら見ていたら、2時間以上かかってしまいました(平日にも関わらずかなりの人が居たという理由もあるだろうけど)。

内容は普通に面白かったです。自分は特撮現役世代じゃないけど(戦隊もの世代かもしれないけど・・・?)。
特に、家やビルなどのミニュチュアセットの展示が凄かったと思いました。精巧なミニチュアが展示されて(大人の事情と工夫で精巧に見える部分もあるかもしれませんが)、クリエイター魂と言うか、それを作る人達の熱意と言うか。「納期短くてやってられねえ」とかブツブツ言いながらそれでも楽しそうに仕事している職人(?)の姿が浮かんでくるようです(あれ、なんか某IT業界のようだ・・・?)。ものづくり心が疼いてくるじゃあないですか。
あと小さなミニチュアでいかに広さを感じさせるかとか、爆発シーンをいかにかっこ良くするかなどの撮影技術の方法が解説されていたところも面白かった。映像で見るとほんの数秒のために様々な努力と工夫がされているのだなあと感心しました。

カタログ買おうかと悩んだけど、結局ガチャポンフィギュアだけ。色はないのかしら。。(畜光版とのことです>情報感謝)


CGにおされて特撮の仕事が少なくなってきているらしいけど、どっちが良いとか分からないけど、特撮というものがフィギュアとかいろんな物に繋がっていそうな気もするので、これもまた日本の文化の一つかなあとは思います。

2012-06-21

円柱(ゴミ箱...)に映像を投影する

世の中的情報によると、平面に対しては簡単にプロジェクションマッピングっぽい事が出来る、とのことなので、曲面(円柱の横側の部分、さらに言ってしまえばゴミ箱。。。)に対して似たような事が出来ないか試してみました。






実際やった事は、平面を複数用意して、曲面を平面で近似しているだけなので、話自体はそんなに難しい事ではないです。ただこれが(数学的、物理的に?)正しいプロジェクションなのかは分かりません。


ソースコードは最後に掲載していますが、流れとしては、以下の通りです。プロジェクタを投影対象に向けて、投影対象とPCのモニタを見ながら頑張って位置合わせをしていきます。

  • 映像を表示させたい領域を大まかに選択します
    • 四角形の中に白と灰色の縞模様が現れるけど、個々の縞が曲面を近似する平面になります
  • 四角形の四隅をドラッグして表示領域の隅を決めます
  • aキーを押すと、四角形の周囲にある青い点を上下に動かす事が出来るので、これを使って表示領域を調整します
    • 形状を調整する青い点は、隅になるほど密度を増やしています(点の位置は決めうちのおおざっばです。もっと妥当な間隔にするのは面倒そうです)
  • dを押すと映像が表示されます
  • cを押すと表示領域をクリア出来ます

投影対象を直接見て位置合わせをする考え方はこの前遊んだmapamokを参照してます。角や辺が明確な直方体と違って、円柱は端が明確でないので、精度が微妙になるかと。
また対象が少しでもずれたり、プロジェクタが少しでもずれると残念な事になります。

もっとうまい方法があるんじゃないかなあと、思ったりします、、、
実際に車とか建物に投影する場合はどうやっているのか、大変気になります。カメラとか使用して、画像認識的な手法も使って効率化してるんでしょうか??うーん。

コードはProcessing。だんだん面倒くさくなって数字がベタ書きになっていきます。。。まどろっこしい書き方をしているので無駄に行も長いです。
久しぶりに使ってみると、ProcessingがJavaじゃなくて、PerlやPythonのようなもっとゆるゆるな感じで書けたらなあ、と思わないでもないです。もっとも、Javaを忘れつつあるだけなんですが。

float SPLIT_INTERVAL;
DisplayImageArea dia;

float showWidth;
float showHeight;

DisplayBallon db;
DisplayText dt;

// MODE
static final int MODE_AREA_SELECT   = 0x01;
static final int MODE_CORNER_ADJUST = 0x02;
static final int MODE_FINE_ADJUST   = 0x04;
static final int MODE_SHOW   = 0x08;
int mode;
int showMode = 0;
int NSHOW = 2;

// for AREA SELECT
float startX = -1;
float startY = -1;
float endX = -1;
float endY = -1;

// font
PFont infoFont;
PFont displayFont;

void setup() {
  size(screen.width, screen.height, P3D);
  SPLIT_INTERVAL = width / 40;
  
  // create font
  infoFont = createFont("SansSerif", 16, true); 
  displayFont = createFont("BrushScriptMT", 42, true);
  
  dia = new DisplayImageArea();
  mode = MODE_AREA_SELECT;
  
  
}

void draw() {
  background(0);
  
  switch (mode) {
    case MODE_AREA_SELECT:
      if (endX >=0 && endY >= 0) {
        rectMode(CORNER);
        noStroke();
        fill(255,255,255,128);
        rect(startX, startY, endX-startX, endY-startY);
      }

      break;
    case MODE_CORNER_ADJUST:
    case MODE_FINE_ADJUST:
      dia.drawSplitPattern(color(220), color(100));
      dia.drawFrame();
      dia.drawCornerPoints();

      PGraphics pg = createGraphics((int)showWidth, (int)showHeight, P3D);
      showWire(pg);
      dia.drawImage(pg);
      dia.drawCenterPoints();

      break;
    case MODE_SHOW:
      pg = createGraphics((int)showWidth, (int)showHeight, P3D);
      switch (showMode) {
        case 0:
          db.draws(pg);
          db.move();
          break;
        case 1:
          dt.draws(pg);
          dt.move();
          break;
      }
      dia.drawImage(pg);
  }

  if (mode != MODE_SHOW) {
    PGraphics infopg = createGraphics(width, 100, P2D);
    showInformation(infopg);
    imageMode(CORNER);
    image(infopg, 0, height-100);
  }
}

void changeModeAreaSelect() {
  frameRate(30);
  startX = -1;
  startY = -1;
  endX = -1;
  endY = -1;
  mode = MODE_AREA_SELECT;
}

void changeModeCornerAdjust() {
  frameRate(30);
  mode = MODE_CORNER_ADJUST;
}
void changeModeFineAdjust() {
  frameRate(30);
  mode = MODE_FINE_ADJUST;
}
void changeModeShow() {
  frameRate(10);
  showMode = (showMode + 1) % NSHOW;
  mode = MODE_SHOW;
  switch (showMode) {
    case 0:
      db = new DisplayBallon(10, showWidth, showHeight);
      break;
    case 1:
      dt = new DisplayText(displayFont, "Hello World!", showWidth, showHeight); 
      break;
  }  
}


void mousePressed() {
  
  switch (mode) {
    case MODE_AREA_SELECT:
      startX = mouseX;
      startY = mouseY;
      break;
    case MODE_CORNER_ADJUST:
    case MODE_FINE_ADJUST:
      int select = dia.selectNearCornerPoint(mouseX, mouseY);
      break;    
  }
}

void mouseDragged() {
  switch (mode) {
    case MODE_AREA_SELECT:
      endX = mouseX;
      endY = mouseY;
      break;
    case MODE_CORNER_ADJUST:
      dia.moveSelectedCornerWithPropotional(mouseX, mouseY);
      break;
    case MODE_FINE_ADJUST:
      dia.moveSelectedCornerAdjust(mouseX, mouseY);
      break;
  }
}

void mouseReleased() {
  switch(mode) {
    case MODE_AREA_SELECT:
      if (startX < mouseX) {
        endX = mouseX;
      } else {
        endX = startX;
        startX = mouseX;
      }
      if (startY < mouseY) {
        endY = mouseY;
      } else {
        endY = startY;
        startY = mouseY;
      }
    
      showWidth  = endX - startX;
      showHeight = endY - startY;
      
      dia.setRoughRect(int((endX-startX) / SPLIT_INTERVAL)+1, startX, startY, endX, endY);
//      dia.setRoughRect(1, startX, startY, endX, endY);
      changeModeCornerAdjust();
      break;
    case MODE_CORNER_ADJUST:
    case MODE_FINE_ADJUST:
      dia.clearSelect();
      break;
      
  }
}

void keyPressed() {
  switch (key) {
    case 'a':
      if (mode == MODE_CORNER_ADJUST || mode == MODE_SHOW) {
        changeModeFineAdjust();
      } else if (mode == MODE_FINE_ADJUST) {
        changeModeCornerAdjust();
      }
      break;
    case 'd':
      if (mode == MODE_CORNER_ADJUST || mode == MODE_FINE_ADJUST || mode == MODE_SHOW) {
        changeModeShow();
      }
      break;
    case 'c':
      changeModeAreaSelect();
      break;
  }
}

void showWire(PGraphics pg) {
  pg.beginDraw();
  pg.stroke(255);
  pg.strokeWeight(3);
  pg.line(0,0,showWidth,showHeight);
  pg.line(showWidth,0,0,showHeight);
  pg.endDraw();
}

void showInformation(PGraphics pg) {
  pg.beginDraw();
  pg.background(20);
  pg.textFont(infoFont);
  
  // mode display
  String s = "Current Mode: ";
  float sw = pg.textWidth(s);
  pg.fill(255);
  pg.text(s, 10, 20);

  pg.fill(255,180,180);
  switch (mode) {
    case MODE_AREA_SELECT:
      pg.text("Area Select", 12+sw, 20);
      break;
    case MODE_CORNER_ADJUST:
      pg.text("Corner Adjust", 12+sw, 20);
      break;
    case MODE_FINE_ADJUST:
      pg.text("Fine Adjust", 12+sw, 20);
      break;
    case MODE_SHOW:
      pg.text("Show", 12+sw, 20);
      break;
  }
  
  // key display
  pg.fill(255);
  pg.text("a: toggle adjust mode  d: toggle display mode  c: clear window", 12, 40); 
  
  pg.endDraw();
}

class DisplayImageArea {

  /*
   cornerLT            cornerRT
    0--2--4--6--...--(2*nsplit)
    |  |  |  |          |
    1--3--5--7--...--(2*nsplit+1)
   cornerLB            cornerRB
  */
  private CornerPoint[] CP;
  private CornerPoint[] CenterP;
  private int cornerLT;
  private int cornerLB;
  private int cornerRT;
  private int cornerRB;

  private int select;
  private int nsplit;
  
  public DisplayImageArea() {
    CP = null;
    select = -1;
    nsplit = 0;
  }
  
  private float calc_interval(float z) {
    if (z < 0 || z > 1) return z;
    return z*z*(-2*z+3);
  }
  
  public void setRoughRect(int nsplit, float x1, float y1, float x2, float y2) {
    int npoint = 2+2*nsplit;
    CP = new CornerPoint[npoint];
    CenterP = new CornerPoint[nsplit];
    this.nsplit = nsplit;

    float intervalX = (x2-x1) / nsplit;
    float intervalY = y2-y1;

    for (int i=0; i<npoint; i++) {
      if (i % 2 == 0) {
        CP[i] = new CornerPoint(x1 + calc_interval(1.0 * int(i/2) / nsplit) * (x2-x1), y1, i/2 * 1.0/nsplit, 0.0);
      } else {
        CP[i] = new CornerPoint(x1 + calc_interval(1.0 * int(i/2) / nsplit) * (x2-x1), y2, i/2 * 1.0/nsplit, 1.0);
      }
    }
    for (int i=0; i<nsplit; i++) {
      CenterP[i] = new CornerPoint(x1 + calc_interval((i + 0.5) / nsplit) * (x2-x1), y1+intervalY/2, (i + 0.5) * 1.0/nsplit, 0.5);
    }

    cornerLT = 0;
    cornerLB = 1;
    cornerRT = 2*nsplit;
    cornerRB = 2*nsplit+1;
  } 

  public void drawSplitPattern(color color1, color color2) {
    noStroke();
    for (int i=0; i<nsplit; i++) {
      if (i % 2 == 0) {
        fill(color1);
      } else {
        fill(color2);
      }
      beginShape();
      vertex(CP[2*i].getX(), CP[2*i].getY());
      vertex(CP[2*i+1].getX(), CP[2*i+1].getY());
      vertex(CP[2*i+3].getX(), CP[2*i+3].getY());
      vertex(CP[2*i+2].getX(), CP[2*i+2].getY());
      endShape(CLOSE);
    }
  }
  
  public void drawImage(PImage teximage) {
    noStroke();
    textureMode(NORMALIZED);
   
    for (int i=0; i<nsplit; i++) {
      beginShape(TRIANGLE_FAN);
      texture(teximage);
      vertex(CenterP[i].getX(), CenterP[i].getY(), CenterP[i].getS(), CenterP[i].getT());
      vertex(CP[2*i  ].getX(), CP[2*i  ].getY(), CP[2*i  ].getS(), CP[2*i  ].getT());
      vertex(CP[2*i+1].getX(), CP[2*i+1].getY(), CP[2*i+1].getS(), CP[2*i+1].getT());
      vertex(CP[2*i+3].getX(), CP[2*i+3].getY(), CP[2*i+3].getS(), CP[2*i+3].getT());
      vertex(CP[2*i+2].getX(), CP[2*i+2].getY(), CP[2*i+2].getS(), CP[2*i+2].getT());
      vertex(CP[2*i  ].getX(), CP[2*i  ].getY(), CP[2*i  ].getS(), CP[2*i  ].getT());
      endShape();
    }
    
    
  }

  public void drawFrame() {
    stroke(0, 255, 0);
    noFill();
    strokeWeight(3);
    beginShape();
    for (int i=0; i<CP.length; i=i+2) {
      vertex(CP[i].getX(),CP[i].getY());
    }
    for (int i=CP.length-1; i>=0; i=i-2) {
      vertex(CP[i].getX(),CP[i].getY());
    }
   endShape(CLOSE);
  }
  
  public void drawCornerPoints() {
    for (int i=0; i<CP.length; i++) {
      CP[i].drawPoint(i == select);
    }
  }
  public void drawCenterPoints() {
    for (int i=0; i<CenterP.length; i++) {
      CenterP[i].drawPoint(false);
    }
    println(CenterP.length);
  }
  
  public int selectNearCornerPoint(int x, int y) {
    for(int i=0; i<CP.length; i++) {
      if ( CP[i].isNear(x, y)) {
        select = i;
        break;
      }
    }
    return select;
  }
  
  public void clearSelect() {
    select = -1;
  }
  
  public void moveSelectedCornerPoint(int x, int y) {
    if (select >= 0) {
      CP[select].setXY(x, y);
      moveCenterPoint(select);
    }
  }
  public void moveSelectedCornerWithPropotional(int x, int y) {
    if (select == cornerLT || select == cornerRT) { // upper corner
      CP[select].setXY(x, y);
      moveCenterPoint(select);
      
      float tanx = CP[cornerRT].getX() - CP[cornerLT].getX();
      float tany = CP[cornerRT].getY() - CP[cornerLT].getY();
      for (int i=1; i<nsplit; i++) {
        CP[2*i].setXY(CP[cornerLT].getX() + tanx * calc_interval(1.0 * i / nsplit), CP[cornerLT].getY() + (tany*i)/nsplit);
        moveCenterPoint(2*i);
      }
    } else if (select == cornerLB || select == cornerRB) {
      CP[select].setXY(x, y);
      moveCenterPoint(select);
      
      float tanx = CP[cornerRB].getX() - CP[cornerLB].getX();
      float tany = CP[cornerRB].getY() - CP[cornerLB].getY();
      for (int i=1; i<nsplit; i++) {
        CP[2*i+1].setXY(CP[cornerLB].getX() + tanx * calc_interval(1.0 * i / nsplit), CP[cornerLB].getY() + (tany*i)/nsplit);        
        moveCenterPoint(2*i+1);
      }
    }
  }
  public void moveSelectedCornerAdjust(int x, int y) {
    float x1 = CP[select].getX();
    float y1 = CP[select].getY();
    float x2, y2;
    if (select % 2 == 0) {
      x2 = CP[select+1].getX();
      y2 = CP[select+1].getY();
    } else {
      x2 = CP[select-1].getX();
      y2 = CP[select-1].getY();
    }
    if (abs(x2-x1) < 0.0001) {
      CP[select].setXY(x1, y);
      moveCenterPoint(select);
    } else {
      float adjx = (x2-x1)/(y2-y1) * (y -y1) + x1;
      CP[select].setXY(adjx, y);
      moveCenterPoint(select);
    }
  }
  
  private void moveCenterPoint(int centerindex) {
    int index = centerindex/2;
    if (index - 1 >= 0) {
      int i = index - 1;
      CenterP[i].setX((CP[2*i].getX() + CP[2*i+1].getX() + CP[2*i+2].getX() + CP[2*i+3].getX())/4.0);
      CenterP[i].setY((CP[2*i].getY() + CP[2*i+1].getY() + CP[2*i+2].getY() + CP[2*i+3].getY())/4.0);
    }
    if (index < nsplit) {
      int i = index;
      CenterP[i].setX((CP[2*i].getX() + CP[2*i+1].getX() + CP[2*i+2].getX() + CP[2*i+3].getX())/4.0);
      CenterP[i].setY((CP[2*i].getY() + CP[2*i+1].getY() + CP[2*i+2].getY() + CP[2*i+3].getY())/4.0);
    }
  }

  public class CornerPoint {

    static final private float NEARSIZE = 10;
    // Position
    private float x;
    private float y;
    // Texture Coord
    private float s;
    private float t;

    public CornerPoint(float x, float y) {
      this.x = x;
      this.y = y;
      this.s = 0;
      this.y = 0;
    }
    public CornerPoint(float x, float y, float s, float t) {
      this.x = x;
      this.y = y;
      this.s = s;
      this.t = t;
    }

    public float getX() {return x;}
    public void  setX(float x) {this.x = x;}
    public float getY() {return y;}
    public void  setY(float y) {this.y = y;}
    public void setXY(float x, float y) {this.x = x; this.y = y;}
    public float getS() {return s;}
    public void  setS(float s) {this.s = s;}
    public float getT() {return t;}
    public void  setT(float t) {this.t = t;}

    public boolean isNear(int x, int y) {
      return abs(this.x - x) < NEARSIZE && abs(this.y - y) < NEARSIZE;
    }

    public void drawPoint(boolean select) {
      noStroke();
      if (select) {
        fill(255, 100, 100);
      } 
      else {
        fill(100, 100, 255);
      }
      rectMode(CENTER);
      rect(x, y, NEARSIZE, NEARSIZE);
    }
  }
}

class DisplayBallon {

  private Ballon[] blist;
  private float sizeW;
  private float sizeH;
  
  public DisplayBallon(int n, float sizeW, float sizeH) {
    blist = new Ballon[n];
    color cfrom = color(255, 200,  20);
    color cto   = color( 30, 200, 255);
    for (int i=0; i<n; i++) {
      blist[i] = new Ballon(random(sizeW), sizeH + random(100), random(0.4,1.8), lerpColor(cfrom, cto, i*1.0/(n-1)));
    }
    this.sizeW = sizeW;
    this.sizeH = sizeH;
  }
  
  public void move() {
    
    Arrays.sort(blist);
    for (int i=0; i<blist.length; i++) {
      blist[i].move();
      if (!blist[i].isLower(sizeW, sizeH)) {
        blist[i].setInit(random(sizeW), sizeH + random(100), random(0.4,1.8));
        println("reset " + i);
      }
    }
  }
    
  public void draws(PGraphics pg) {
    pg.beginDraw();
    pg.background(0);
    for (int i=0; i<blist.length; i++) {
      blist[i].drawImage(pg);
    }
    pg.endDraw();
  }
  
  class Ballon implements Comparable {
    private float x;
    private float y;
    private float z;
    private color c;
        
    private static final float ballonW = 20;
    private static final float ballonH = 30;
    private static final float ballonString = 30;
    
    public Ballon(float x, float y, float z, color c) {
      this.x = x;
      this.y = y;
      this.z = z;
      this.c = c;      
    }
    
    public float getZ() {
      return z;
    }
    
    public boolean isLower(float W, float H) {
      if (0 <= y + ballonH + ballonString) {
        return true;
      }
      return false;
    }

    public void setInit(float x, float y, float z) {
      this.x = x;
      this.y = y;
      this.z = z;
    }      
      
    
    public void move() {
      y -= 5.0/z;
    }
    
    public void drawImage(PGraphics pg) {
      pg.pushMatrix();
      pg.translate(x,y);
      pg.scale(1.0/z);

      pg.noStroke();

      pg.fill(255);
      pg.rect(-2, 0, 2, ballonH+ballonString);

      pg.fill(c);
      pg.ellipseMode(CENTER);
      pg.ellipse(0, 0, ballonW*2, ballonH*2);

      pg.popMatrix();
    }
    
    public int compareTo(Object obj) {
      return new Float(-this.z).compareTo(new Float(-((Ballon) obj).getZ()));
    }
  };
}

class DisplayText {

  private PFont font;
  private String showtext;
  private float x;
  private float y;
  private float sizeW;
  private float sizeH;
  
  public DisplayText(PFont font, String s, float sizeW, float sizeH) {
    this.font = font;
    this.showtext = s;
    this.sizeW = sizeW;
    this.sizeH = sizeH;
    this.x = 0;
    this.y = sizeH / 2; 
  }
  
  public void draws(PGraphics pg) {
    pg.beginDraw();
    pg.background(0);
    pg.textFont(font);
  
    pg.fill(255);
    pg.text(showtext, x, y);

    pg.endDraw();
  }
  
  public void move() {
    x += 5;
    if (x > sizeW) {
      x = random(-100,0);
    }
  }
}

bitbucketにも置いてみました

2012-06-02

ヤマハのアンサンブルフェスティバル

ヤマハの音楽教室(バイオリン)に通い始めて2年半ほどになるのだけど、今日、アンサンブルフェスティバルっていう発表会に初めて参加してきました。
2年に一度開かれているイベントらしく、1グループ100人近く集まって演奏するものです。
自分は、今回、バイオリンアンサンブルに参加して、「カッチーニのアヴェ・マリア」「愛の悲しみ」「愛の喜び」を弾きました。
弾いたと言っても、愛の喜びが難しくてちゃんとは弾けてない。。バイオリン歴2年そこその若輩者が弾く曲じゃない気がします。

全部合わせて15分に満たないのだけど、緊張している間にあっという間に終わった感がするのが、正直なところです。観客にはどんな風に聞こえていたのだろうかと気になります。

ホールが大きくてとっても響いたので、遠くの方で弾いている音が遅れて聞こえてきて、自分が遅れているか不安になりながら弾いてました。指揮者を見ている余裕はとても無い。。。

全部で10分少々の曲を弾くので精一杯で、(プロのコンサートだと標準的と思われる)2時間分弾くってのは半端ない努力と体力が必要なのだなあと改めて感じます。

次回がもしあったら、もっとうまく弾けるようになっているといいな

2012-05-27

Kinect SDK1.5 サンプル

せめてKincet SDK1.5のサンプルぐらいは動かしておこうと思ったら、嵌ったので、メモ。

嵌ったデモ名:
「Speech Basics」とかの音声認識系デモアプリ。

症状:
"could not find kinect speech recognizer"などと表示されて、recognizerが無いからインストールを確認しろと言われる(エラーの文言はD2DかWPFで微妙に違うけど言っている意味は同じ)。

原因と思われるもの:
SDK beta時代にインストールしたSpeech RecognitionのLanguage Pack(en-US)が残っていて、SDKインストール時に、新しいものがインストールされなかった。
Speech Recognition SDK本体はKinect SDKインストール時に消せと言ってくれたのに ><

対処:
Language Packだけ入れ直す方法が分からなかったので、古いLanguage PackとKincet SDKすべて一度アンインストールした後、SDKを入れ直した。無事新しいLanguage Pack(en-US)がインストールされていた。

デモアプリを起動したら、エラー文言が消えて、音声認識が出来るようになった。ForwardとBackがしょっちゅう間違えられるような、自分の英語力のひどさはまた別問題。

根本原因はSDK1.0を触っていなかった、なので、ここで嵌る人はほとんどいないのだろうと思われ。


2012-05-24

KinectのHuman Interface Guidelines

Kinect for Windows1.5がリリースされたみたいで、その中にHuman Interface Guidelinesというドキュメントが気になったので、開発文書読む前に、読んでみるという、また天の邪鬼な事をしてみた。

書いてある事は(開発、非開発問わず)Kinectを使ったことのある人なら大体受け入れられるような気がします。英語だけだと何言っているか分からなくても、絵が豊富なので何となく分かります。具体的な解決法や決まり事が事細かに書いてあるわけではなくて、あくまで作り方の指針が述べられている感じです。

構成として、

  • 原則
  • NUIデザイン全般に言える考え方
  • 個々の具体的なインターフェイスに対する指針
  • その他話題(音声とジェスチャーの組み合わせとか、複数人の扱いとか)

ぱらぱら見ていて気になった事をメモっておくと(ドキュメントに書いてある事はもっと多いです。あくまで自分が気になった事です)

  • インタラクションはシンプルに、簡単に学べるものにすべき。常にユーザに今何が起こっているかフィードバックを返す。
  • ユーザテスト重要
    • 設計→テスト→評価→再設計→。。。の繰り返しが必要
  • KinectゲームUIとKincetアプリケーションUIは同じではない
  • 異なる入力装置のためにデザインされたUI(キーボードとか)を直接適用してはだめ
  • 他の入力装置と違って、ユーザの意図を計るのが難しい
    • その動作は入力を意図した動作なのか??
    • ユーザの意図した事が行われているかフィードバックをする
  • 一言で動作と言っても人によってその動作は異なる
  • ジェスチャーと音声を組み合わせると、複雑な動作が削減出来る
    • 例:写真を送るタスク マウス等の場合、写真選択→送信コマンド選択。vs. ジェスチャーで写真選択するとともに音声で送信コマンド選択(こっちの方が動きは少ない)。
  • 人が複数いる場合
    • 誰か一人だけの動作を受け付ける
    • 複数の人の動作を受け付ける。音声、ジェスチャーを正しく結びつけるのが難しい
実際、何か作らなきゃ、って時に参考になるのと、Kinectなにそれ?って人が上流工程で設計したNUI仕様に対して、反論するための道具にもなるのかしら。。。

この辺もGUIやマルチタッチインターフェイスのように具体的なインターフェイスの部品が揃ってくると、より広まるのだろうなあと思います。


それよりも早くSDK本体を触れ、ってかんじですけど。

2012-05-01

十和田・青森の旅行

十和田市と青森市に旅行してきました。目的は十和田市現代美術館青森県立美術館を見に行く事。何故そこか?という問いには、雑誌かなにかでここが良いと見た気がするので、一度は見ておこうかなあと思って。

一日目

  1. 夜行バスでいきなり十和田市へ
  2. 十和田市現代美術館
  3. バスで三沢駅へ
  4. 三沢駅から青い森鉄道に乗って青森市へ
  5. バスで県立美術館・三内丸山遺跡
  6. 青森市へ戻る
十和田市は丁度桜が咲き始めた頃で(満開までは後少し)、桜祭りもやっていました。
十和田市現代美術館前の広場から
十和田現代美術館
十和田市現代美術館は、かなり良い感じでした。東京の美術館に比べたら建物自体はそんなに大きくはないのですが、中身は面白かったです。頑張って遠征したかいがあります。正直交通の便が良いとは言えないですが、それでも多くのお客さんがいるのも納得です。
常設展は内部・外部共に大型な作品が多く、内部は写真撮影不可なのでどんな感じか?はサイトでも見てください、ですけど。。。
企画展は栗林隆という方の展示がありましたが、この作品(最初は山脈のジオラマに見えるけど霧で覆われると地図が見えてくる)と似たものをどこかで見たなと思ったら、昔森美術館で見たと、家に帰ってから思い出した。。。
企画展合わせて900円ってのも安い(交通費は高いけど)!

青森県立美術館
移動時間が長くて、一日で十和田と回るのは微妙かなあと思っていたら、予想通りついた時間が閉館まであまり時間が無くなってしまって、消化不良になってしまいました。
企画展はフィンランドのデザインについて、時間がなくて、ざっとしか見れませんでした。
青森県立美術館
お約束のあおもり犬は写真が撮れました。
あおもり犬
バスが来るまでとなりの三内丸山遺跡をぶらっと見てきました。復元された建物は若干嘘くさい感じがしますが、保存された建物の跡を見れたのは良かったです。
三内丸山遺跡
2日目

  1. バスで国際芸術センター青森
  2. 徒歩でねぶたの里へ
  3. バスで青森市中心へ
  4. 新幹線で岐路
国際芸術センター青森
最初は予定になかったけど、折角だったので国際芸術センター青森にも行ってきました。青森市の中心部から遠いので、所々雪が残っていたり、暴風で道に木が倒れてしまい通行禁止になってしまった部分もあり全部を回る事は出来ませんでした。浅井祐介という方の個展が丁度開かれていて、壁一面に書かれた絵が圧巻でした。なんと泥を使って絵を描かれているらしい。これもわざわざ遠くまで足を運んだかいがあったかなあと思います。
国際芸術センター青森
バスまで時間があるので、、、ねぶたの里とやらに行って来ました。歴代有名なねぶたが保存・展示されているとの事。確かに間近で見るとなかなか迫力がある。
ねぶたの里にあったねぶた
どういう関係あるのかしらないけど、何故か成功哲学の道ってのがあって、成功に導く言葉が仏像とともに飾ってありました。雪が残っていて全部見れませんでしたが。願望って、思いっきり煩悩で、仏の対極のような気がしますけど。。。
成功哲学の道?

旅行中は移動がほぼバスで、しかもそれほど本数が多くないのが一番苦労したなあと。東京が特異的に公共交通機関が発達してるのだなあ。なので旅行行く時はバスの時間や間隔を調べていく必要があると痛感したのでした。。

2012-04-20

「リーン・スタートアップ」を読んだ

前回の流れで、折角なんで読んでみました。

自分用メモ(多分にして勘違いは多いはず)

  • 新しい製品開発において、特に今の時代、正しい事なんて最初から分かるわけが無いので、自分が正しいなあと思った事はあくまで仮説に過ぎない
    • 合っているかどうか分からない仮説の元で、大きなものを作ると多大な無駄を作ってしまう恐れがある
  • その仮説を検証するために、必要最小限なものと、評価基準を用意して、検証をしていく必要がある
    • 検証に必要ないものは無駄なもの
  • その検証結果から、もし仮説や最初のビジョンが正しくなかったのなら、変更していく必要もある
  • 仮説→検証のサイクルを限りなく短くしていく必要がある
    • 他との競争になった時、このサイクルを早くして学ぶ量が多いほど有利?
    • バッチサイズ(サイクル内でやる事の量?)が大きいほどサイクルが長くなってしまう
    • とか言ってスピード重視で品質をあまりに疎かにするとそれに足を取られて結局スピードダウンする恐れも → 5回のなぜで調整(?)
個人的には、評価基準の作成とその測定が、難しそうだなあと思ってみたり。本にもあったようにこれを適切に定めない(虚栄の評価値)と、プロジェクトメンバーが何れだけ優秀でもあさっての方向に行ってしまうわけだし。

本の全体として、事例が豊富だったのが良かったのだけど、何故か読みにくい部分も少しありました。議論の流れが不明瞭な部分があったのかも。

まあこんな本よんでも自分がこういうプロジェクトの責任者になるのは何時だろうと思いつつ。。。


2012-04-10

「イノベーションのジレンマ」を読んだ

普段あまりビジネス本は読まないのですが、別の本で紹介されていたので、今更ですが。。。自分、自他ともに認める10年遅れた人なんで。。。

以下、読んだ、とってもいい加減なメモ

  • 技術は「持続的技術」と「破壊的技術」に分類できる
  • ほとんどは、「持続的技術」に分類される。"今"の評価尺度のより良い向上を目指すもの
  • "今"の評価尺度というものを決めているのが、現在その企業が置かれている市場(バリュー・ネットワーク)の関係者・顧客の要望。
  • "優良"な企業は、より顧客の要望に応えようと、大きなリスクを取ってでも「持続的技術」を発展させていく。
    • 発展させればそれが利益なると分かっているから??
  • 「破壊的技術」は、"今"の評価尺度では既存技術に比べると低いが、別の評価尺度では勝っている。
    • なので、"今"の顧客にはあまり評価されないので、"優良"な企業ほど手を出しにくい。
  • 「破壊的技術」の持つメリットが活かせる別の市場を見つける事が出来れば、そこから継続的なイノベーションを行う事で、より上位の市場の要求を満たすことができ、他の市場でも優位に立てるようになる。
  • 企業は、新しい技術が「継続的技術」か「破壊的技術」かを見極めて、それに似合った戦略を立てていく必要がある。
    • 「継続的技術」なら今までの企業のプロセス、価値観を活用出来る
    • 「破壊的技術」なら、逆に今までの企業のプロセス、価値観がその発展を邪魔する可能性があるため、別の独立した組織を構築する必要がある
  • 「破壊的技術」が活かせる市場は誰も分からないので、"現在"の顧客に聞いても分からない
    • 市場を探すことは実験だと考えて、柔軟な軌道修正が出来るようにしておく
で、感想としては、

  • 顧客の言葉が絶対説と、顧客の言葉が必ずしも全部鵜呑みにすべきではない説、的な論争があったり無かったりするけど、後者の理論の拠り所になっている考え方なのかなあと、思ったりしました。
  • ただ顧客の要望が絶対ではないと入っても、それは”今”の顧客であって、「破壊的技術」の市場探しには、いろんな人達の言葉や意見に耳を傾ける必要があるみたいだから、どちらかというと、"今"の顧客だけの言葉を聞くのではなくて、"いろんな"顧客の言葉に耳を傾けよう、と言う事なのかなあ、と思ったりもしました。
  • この新しい市場探しは、実験的で、柔軟な軌道修正が必要という部分の話は、今度日本語版が出るらしい「リーンスタートアップ」に繋がるのかなあ、と勝手な想像をしてみた。この本も読んでみたい。


しかし、これらの本の内容を今の会社に当ててみたら、怖い事になりそうだ。。。

2012-04-01

mapamokで遊んでみた

YCAMのInterLabで公開されていたmapamokと言うツールを、気まぐれにプロジェクターを買ってしまったので、遊んでみました。
と言っても、チュートリアルの通りやってみただけです。

流れとしては、以下のような感じみたいです。

  • 投影したい物体のモデルをGoogleのSketchUpで作成して、mapamokに読み込ませる
  • mapamokの画面をプロジェクターで物体に投影させる
  • モデルの頂点と実際の物体の頂点をプロジェクターの光をみながら対応づける。対応付けの際にカメラやチェッカー模様のキャリブレーションパターンが必要ない
  • 対応づけたら、shaderでいろんなパターンを投影してみる

やってみた感じは、以下の動画です。
線画だとちゃんと物体に投影してるのか分からん、とか、何だあの箱は?的なツッコミはなしで。

やってみた感じは、
  • 対応付けが結構難しいかなあと思っていたけど、慣れるとさくさく出来ました。
  • と言う事で、多分一番大変なのはSketchUpでモデルを作る事。でも直方体数個レベルなら、大丈夫。モデル作成も動画撮影まで含めて3時間もかかってないはず。
  • 対象の物体は、白っぽいものの方がいいです(当たり前ですが。。。)。最初黒い箱でやったら、プロジェクターの光が全然分かりませんでした。。
  • シェーダがさくさく書ける人ならかなり楽しめそうな気がします

シェーダの勉強をちゃんとやりたくなります

2012-03-27

世界の終わりのものがたり

年度末恒例(?)有休消化するために休んで、折角なので科学未来館の企画展を見てきました。
なんか釣りなタイトルの気もしつつ。中身は至って真面目、展示はある意味答えの無い質問が沢山書かれていて、所々自分の考えを答えたりしながら、進んでいきます。ただこれを展示と言うのかは人によりけりな気がします。展示会そのものよりもその関連イベントのトークとかの方が面白いかも。。
一人で寂しく見るよりは、みんなでわいわいしながら見ていった方が良いかも。

隣で、NHKの大科学実験の展示も。これも面白い。ばかばかしい事に真剣にやってる感が面白い。。。金がかかっているかどうかは分からないけど、時間はかかっている番組だろうなあ。

ターミナル勉強会

人のターミナルの使い方が気になる今日この頃で、ターミナル勉強会へ行ってきました。

誰得(マニアック?)なコマンド、オプションが解説されたり、sshの便利な使い方などが内容でした。
普段定型的なコマンドしか使わない(使えない)ので、珍しいオプションなどが知れて面白かったです。sshの使い方は勉強になりました。
でもって結局最後はmanに聞け、なんだなあ、と。
OS(Linux, Unix, Mac??)によってオプションの意味が変わる場合があるので、両方の環境を使わないと行けない人達に取っては大変なのよねえ〜〜。でも、使い方自体はmanで知らべればいいけど、このコマンドで、こんな使い方も出来る!ということを知っておくのは重要だよね、と思います(でないと調べる気が起こらない)。

あと、devlove主催の勉強会には行ったの初めてでしたけど、結構静かだったなあと。本当はこういう勉強会の方が多いのかも知れないけど。

2012-03-11

インカ帝国展

国立科学博物館の「インカ帝国展」を見てきました。

毎度お決まりのって言ったら失礼なのだけど、壷らしきものやら服らしきものやら、さらにはミイラまでもが、一杯展示されていました。
今回一番面白いなあと思ったのが、スペイン征服後が描かれた絵画が飾ってあったのだけど、それがとっても西洋絵画で、描かれているものも、もう普通(?)のキリスト教っぽいものだった所です。展示パネルにも書かれていた気もするけど、征服されるってことが土地だけでなく文化も変えさせられるのだ、ということが印象的でした。
それだけ聞くと、スペインエグいなあという感じだけど、インカの征服を扱ったフロアの一つ前は、インカによって征服された国が、風俗が変えさせられた、という内容で、スペインがインカに行ったことは、インカがかつて他の国に行った事?、と、考えさせられる構成です。

3Dシアターなんてものもあって、マチュピチュのCGが上映されていました。石のテクスチャが平べったい感じだったけど(端の方で見ていたからかも・・・)、データは膨大だろうに、よく作ってるなあと思います。

マチュピチュは一度は行ってみたいなあ。

2012-02-26

コンピュータビジョン勉強会ハッカソン

コンピュータビジョン勉強会ハッカソンに行ってきました。
みんな黙々と作業していたので、実質3人しかつぶやいていなかったらしいtogetterはこれ

自分は、C++版のOpenCVをちゃんと使った事無かったので、C++版を触ってみることにしました。
具体的に実施したのは、http://opencv.jp/のcookbookの画像処理の部分をちょこちょこ覗きつつ、最終的にtemplate matchingの項をほぼ写経してみました。
template matchingの結果(類似度のマップみたいなもの)と、オリジナル画像に一致した場所を表示したもの結合画像はこれを参照にしてます。
下記のコードになります。C++的にこういう書き方が良いのか分かりませんが。

#include <opencv2 core.hpp="" core="">
#include <opencv2 imgproc.hpp="" imgproc="">
#include <opencv2 highgui.hpp="" highgui="">
#include <iostream>

cv::Mat mouseMat;
void onMouse(int event, int x, int y, int flag, void*) {
    if ((x < 0 && mouseMat.size[0] < x) || (y < 0 && mouseMat.size[0] < y)) {
        return;
    }
    switch (event) {
        case cv::EVENT_LBUTTONUP:
            switch (mouseMat.channels()) {
                case 3: {
                    uchar b = mouseMat.at<cv::vec3b>(y,x)[0];
                    uchar g = mouseMat.at<cv::vec3b>(y,x)[1];
                    uchar r = mouseMat.at<cv::vec3b>(y,x)[2];
                    std::cout << "(" << y << "," << x << ")" << int(r) << ":" << int(g) << ":" << int(b) << std::endl;
                    break;
                }
                case 1: {
                    uchar gray = mouseMat.at<uchar>(y,x);
                    std::cout << "(" << y << "," << x << ")" << int(gray) << std::endl;
                    break;
                }
            }
            break;
    }
}

void viewImage(cv::Mat img, std::string title) {
    mouseMat = img;
    cv::namedWindow(title, CV_WND_PROP_AUTOSIZE|CV_WINDOW_FREERATIO);
    cv::imshow(title, img);
    cv::setMouseCallback(title, onMouse, 0);
    while (1) {
        int key = cv::waitKey(0);
        if (key == 27) break;
    }
}

cv::Mat loadimage(std::string name, int flag=1) {
    cv::Mat image = cv::imread(name, flag);
    if (image.empty()) {
        std::cout << "can not open file " << name << std::endl;
        exit(1);
    }
    return image;
}

void templateMatching(std::string searchfile, std::string templatefile, std::string outputfile) {
    cv::Mat searchimg_orig = loadimage(searchfile);
    cv::Mat templateimg_orig = loadimage(templatefile);
    
    cv::Mat searchimg;
    cv::Mat templateimg;
    
    double s_factor = 320.0 / searchimg_orig.cols;
    cv::resize(searchimg_orig, searchimg, cv::Size(), s_factor , s_factor);
    cv::resize(templateimg_orig, templateimg, cv::Size(), s_factor, s_factor);
    
    cv::Mat resultimg;
    cv::matchTemplate(searchimg, templateimg, resultimg, CV_TM_CCORR_NORMED);
    
    cv::Rect answer(0,0,templateimg.cols, templateimg.rows);
    cv::Point max_point;
    double maxValue;
    cv::minMaxLoc(resultimg, NULL, &maxValue, NULL, &max_point);
    answer.x = max_point.x;
    answer.y = max_point.y;
    cv::rectangle(searchimg, answer, cv::Scalar(0,0,255), 3);

    cv::Mat combined_img(cv::Size(searchimg.cols + resultimg.cols, searchimg.rows), CV_8UC3, cv::Scalar(0,0,0));
    cv::Rect roi_rect;
    roi_rect.width = searchimg.cols;
    roi_rect.height = searchimg.rows;
    cv::Mat roi(combined_img, roi_rect);
    searchimg.copyTo(roi);
    roi_rect.x += searchimg.cols;
    cv::Mat resultimg_3c;
    cv::Mat tmp_img;
    cv::convertScaleAbs(resultimg, tmp_img, 255);
    cv::cvtColor(tmp_img, resultimg_3c, CV_GRAY2BGR);
    roi_rect.width = resultimg_3c.cols;
    roi_rect.height = resultimg_3c.rows;
    cv::Mat roi2(combined_img, roi_rect);
    resultimg_3c.copyTo(roi2);
    
    //viewImage(resultimg_3c, "template matching");
    
    cv::imwrite(outputfile, combined_img);
}

int main (int argc, const char * argv[])
{
    if (argc < 3) {
        std::cout << "bad argments" << std::endl;
        exit(1);
    }
    std::string imagefile = argv[1];
    std::string templatefile = argv[2];
    std::string outputfile = argv[3];
    std::cout << "inputfile   :" << imagefile << std::endl;
    std::cout << "tempatefile :" << templatefile << std::endl;
    std::cout << "outputfile  :" << outputfile << std::endl; 
    templateMatching(imagefile, templatefile, outputfile);
}

故あってskytreeの写真が100枚以上あったので、この写真に対して実行してみました(shellなりスクリプトなりでさくっと実行しました)。対象が分かりやすいので、晴れの日の写真はほとんどうまく場所が取得出来ました。
全結果をのせる事はできないので、うまく言ったものと失敗したものを載せておきます。

テンプレート画像
成功したもの
失敗したもの(曇りの時の写真だからしようがないか)
C++版の方がCに比べると書きやすい印象を持ったけど、肝心のC++がちゃんと書けないのよねえ・・・。

2012-02-23

なんちゃって赤外線カメラで

Wiredで暗視ゴーグルを通して「Kinect」を見る、という記事を見て、自分がかつて工作した赤外線カメラ(LogicoolのWebCamにIRフィルタを張っただけ)を使っても見えるんじゃないかと、試した結果が下記の写真。電気を消した状態で、Kinectを起動させて壁側に向けて、工作した赤外線カメラをKinctとほぼ同位置から壁に向けて撮りました。


上記記事のようなきれいな斑点はさすがに見えない。でもなんか不思議なパターンが出てるんだなあというぐらいは分かります。それだけです。
すでにほかでもいろいろやられているので、いまさら珍しくもないのだけど。
まあ。思わぬところで昔の工作が生きた(?)と。。。

2012-02-12

Inkscape

Mac LionでInkscape(バージョンは0.48)を使っていて、直線の矢印の部分を線の本体の色と合わせたくて、extensionsのModify Path>Color Markers to Match Strokeを選んだら、python-lxmlが無いと怒られた。
インストールしても怒られた。
http://forums.majorgeeks.com/showthread.php?t=250447
にあるようにpatchをインストールしたら、動くようになった。理由はさっぱり分からない。。。
#よく分からないままPatchを当てるなんて危険だなあとも思ったけど。。。

2012-02-09

HTML5の勉強会に行ってきた

行ってきました。久しぶりに。人気なのでなかなか枠に滑り込めない。。。
テーマは電子書籍。電子書籍には関わってないけど勤め先的には興味がある分野です。
凄い聞きがいのある勉強会でした。

いつも通りのソートも何もしていないざっくりなまとめと感想

  • iBook Autherが使ってみたくなりました
  • EPUB3のイメージが、HTML+CSS?からXML+HTML+CSSに変わりました。。。なかなか複雑な仕様のようです。リーダを作るってことはWebブラウザを作るってことに等しい気がしてきます。ブラウザベンダーに有利な展開です。
  • ↑とPDFやKindleのフォーマットなど百花繚乱な様相を呈してくると、ワンソースマルチユーズの夢を見たくなります。見る側のアプリも大変だけど、作る側のアプリはもっと大変なようです
  • 電子書籍は紙媒体のようにきっちりと固まったデザインではなく、デバイス依存になってしまう、と言うことを認めないと、作れない(コストだけがいたずらにかかる)とのこと。さもないと、今後ますますリーダが多種多様化して、Webアプリのブラウザ互換以上に、制作者にとって辛い戦いが待ち構えているような気がしてきました。
  • どうしてもレイアウトを崩したくないならEPUBではなくてPDFを使おう、みたいに目的に応じてフォーマットをうまく使い分けていく必要があるようです。
  • 電子書籍は、Webの有料化を推し進めたものである、という発想は無かったので新鮮です。
  • 生高橋メソッドが見れて良かったですww。
  • 以上のことを見てみると、まだまだ電子書籍の普及には長い道のりがありそうです。特に制作側。消費者側は比較的すんなり受け入れそうだけど、制作側の意識改革が必要になってくるのだろうと思いました。書籍と言う言葉に騙されて、単純に紙媒体の延長で考えると痛い目に合いそうです。似て非なるものだと思って、紙媒体だけでも、Webでも出せない、電子書籍特有の付加価値が付けていく必要があるのだなあと思いました。

2012-02-06

「複雑ネットワーク」とは何か

知り合いが、「スケールフリー」とかいう単語をさらっと言っているのがかっこ良かったので、「複雑ネットワーク」とは何か、という本を読んでみました。

内容的には、グラフとは何か?から始まって、「スモールワールド」(ノード間の距離がそれほど大きくなく、クラスタ性が大きいグラフ)や「スケールフリー」(ノードの次数の分布がベキ則に従う)の説明があって、伝染病や脳などの応用分野の話、という構成。

言葉がもてはやされるけど(もてはやされたのは一昔前??)、世の中も全てが全て、「スモールワールド」や「スケールフリー」では無いってことらしい。へえ〜。

自分、流行にのるのが数年遅れらしい。。。

2012-01-27

CROSSと言うイベントに行ってきた

niftyが主催していたCROSSというイベント、IT系の勉強会が沢山集まった会に行ってきました。
そこでデータマイニングCROSSのセッションを聞いてきました。ビックデータとかいう単語が流行って、会社でもやりたい的な話が漏れ聞こえてくるし、最近機械学習の勉強をしたので、気になっていました。

技術的な話というよりは、そもそもデータマイニングってどういうところでどういう風に使われているの?という内容で、パネルディスカッションも エンジニアよりも経営者寄りやマーケティング関係の方が多かった気がします。

色々話を聞いた感じだと、(特に2011年は)Hadoopとか基盤周りの整備が進んで、大規模データが解析出来る環境が整いつつあるけど、それをどう活用するかは今からだ、今後基盤技術の理解が出来る人(エンジニア寄り)とデータを理解出来る人(マーケティング寄り)が歩み寄って、真の(?)データ分析技術者のニーズが増えてくるだろう、と言うことだと思いました。(データ分析技術者が弁護士並みにもてはやされるってのは若干眉唾だけど)

また、データを解析した結果を、クライアントに分かりやすく納得出来る説明も重要、とのこと(解析技術の細かいこと言っても困るしなあ、、、と)。

Hadoopとかを整備して、大量データさえ用意すれば、ビジネスに利益をもたらすような情報が自然と抽出されるわけではない、ってことらしい。まあ当たり前だけど。。。目的を持って解析をしないとね、ってことなのだと思いました。
結局、基礎重要、って話に戻ってくるのだなあ。

2012-01-23

「ストーリー・ウィーヴィング」という本を読んだ

1/22に青山ブックセンターでイベントがあって、その中で、ストーリー・ウィーヴィングと言う話が出てきて、興味深く感じたので、ものの見事に本屋の策略に嵌り、上題の本を買った次第です。

講演の内容や本の内容から見るに、ものつくりの分野でプロトタイピングと呼ばれる、作りながら議論してより良いものを作っていこうと言う方針に対になるような考え方らしく、ものを作るためのコンセプトも最初に作ったきり(または後付け)ではなく、議論しながら(プロトタイピングしながら)より深めていこう、と言った感じの内容らしい。本には、ストーリー・ウィーヴィングの考え方とそれを実践するためのワークショップの記録の構成でした。

言われてみれば、当たり前のような気がするのですが(それ故によい考え方だなあと言えるのだけど)、その中でも良いなあ、と思ったのが、作者/否作者から、チームみんなが作者の状態にする、という部分と、コンセプトの幹と枝葉にわけて、幹は共有して、あとは個々人の解釈を許容する、という部分でした。

前者は、結構今の開発、ものつくりが、発注者/受注者、デザイン考える人/作る人みないな、非対称な関係で結びついているものを、フラット(行為者)にする考えなのかなあ、と思いました。それって、ITの開発で言われている、アジャイル(発注者を巻き込め的なプラクティスがあったような)にも近いものかも、と思ったりします。
後者は、結構一つの製品に対して、各々がかなり異なる考え方を示しているシーンなんかを間近で見たこともあって、こうなると、色々不幸な展開が待っていることが多く、幹をみんなで共有するってのが、重要だなあと思うのでした。

こういう考え方を、今の仕事にどうやって活かせていけるのだろうか。

2012-01-21

Kinect & Violin

https://bitbucket.org/ffuyyo/violin_kinect/overview
なんてものを書いてみました。
動作には、Kinect SDK beta2とFFTするためにAForgeというライブラリを使用しています。

KinectのSkeleton Trackingを使ったものは世の中的に結構あるのだけど、折角カメラセンサとマイクが一緒についているデバイスなので両方使うようなものを作ってみたかったのでした。
何故よりによってバイオリンか?というと、自分がバイオリンを習っているから。。。(教室に通い始めて早2年)

Kinectのカメラ上で左右逆に映っているだけで、決して左右逆に持っているわけではないのです

基本的な動作は右腕の肘と手首と肩の角度をみることで、弓の上下動作をトラッキングしている、ということにしています。上下運動が変化する時に、四角形やら丸の図形を表示させています。
また同時にマイクから音を拾って、FFTの値が一番大きい周波数の値に応じて図形の色を変化させています。周波数は変化もトラッキングして、変化すると5角形の図形が表示させているいるつもりですが、遠くから見ると四角形も円も5角形も似たような形なのでした。。。

やってみて分かったのですが、音を扱うのは難しいです。Skeleton Trackingのように直感的でもないし、処理も原始的なことしかやっていないので(て言うか、音声処理の専門家の方に見られたら、使い方がなってないと怒られそう・・・)、あんまりランダムに色を変えたりするのとさほど変わらない気もしてます。やっぱり音声認識以外は使いどころが難しいのかしら。

Skeleton TrackingのHeadを使って、顔を隠してプライバシーにも配慮してますが、自分の部屋の汚さと、バイオリンの下手さ具合(特に弓の動き、酷過ぎ!!)は筒抜けなのです・・・。


世の中的に(個人で出来る範囲では)やり尽された感を感じなくもないし、Kinectだけ知ってても面白いのは作れないということを感じるので、そろそろKinect以外の別のことも遊ぼうかなあ、、、

2012-01-10

商用版Kinectが発売されるらしい

予想していた人も居そうだけど(自分は昨日になってひらめいた)、CESでKinectの商用版が2月1日より発売される事が発表されたようです。

  • http://blogs.msdn.com/b/kinectforwindows/archive/2012/01/09/kinect-for-windows-commercial-program-announced.aspx
  • 冗長な↑のエッセンスを抽出した感じhttp://internet.watch.impress.co.jp/docs/news/20120110_503368.html
気になるところとしては
  • 小売り希望価格、249ドル。
    • Xtionに対する価格面でのアドバンテージが無くなったなあ。
    • 今後のMicrosoftの対応次第で、Xtion + OpenNI派に宗旨替えする人が出てくるかも
  • とりあえず数量限定
    • 何処で売り出されるの?最初は企業・研究機関向けの販売になるのかしら。一般人は手に入るのかしら??
  • ベータ提供は3年間提供延長
    • そもそもベータとの関係はどうなるのかしら。ベータはもう今後開発されず、(商用版=安定版、ベータ=開発版というような構図ではなく)商用版だけが開発されていくという認識で良いのかな?
    • 商用版Kinect買えない人はベータで我慢するってこと?
  • 1800万台を売るヒット商品
    • そのうちハック目的で買った人はどれ位いるのだろう。。。
今後出てくる情報に期待かしら。
Related Posts Plugin for WordPress, Blogger...