yoppa.org


「バードマン あるいは(無知がもたらす予期せぬ奇跡)」感想

たまには、ブログっぽい記事を。

映画「バードマン」が、なかなかいろいろ考えさせられる良い作品だったので、忘れないうちに感想を書いてみる。レビューなどという大層なものではなく、あくまで個人的な感想として。

以下、映画の結末に触れているので(いわゆる「ネタバレ」)これから観に行こうとしている方は読まない方がいいかも。

この映画をどう捉えるかは、最後のシーンをどう解釈するかによって大きく変化するように思う。あえて多様な解釈が可能にしてあるのだろう。

個人的には、延々と擬似的な長回しが続いた後、初めてカットが切り替わって以降の世界は、現実ではなく妄想や空想の中での話だと解釈した。そもそも冷静に考えると、いろいろおかしい。

  • 銃でこめかみを打ち抜いたのに、鼻が吹っ飛んだだけで済むなんて、しかも治療であっさり回復なんて都合の良い話すぎる
  • 落ち目の役者が舞台で自殺を図っただけで、一晩にしてヒーローになるわけがない
  • 劇の終演後、ほとんどの観客がスタンディングオベーションする中、静かに(悲しげに?)席を立った評論家が、その作品を激賞するのか?
  • 病室に置いてある新聞のタイトルが、“Birdman” になってる

などなど。つまり、リーガン(主人公)は既に死んでいるというのが素直な解釈なのだと思う。空を飛ぶ火の玉もそれを暗示している。

誰しも若い頃は自分は万能だと思っているけど、歳を重ねることで徐々に自分が凡庸で理想からほど遠い人間であることを思い知らされる。それでも理想を求めて葛藤する。リーガンもまた、自分は「バードマン」なんて子供騙しのキャラクターで終わる人間ではないと、本格的な役者として復活して人生を一発大逆転しようともがいている。

しかし、現実は厳しい。「演劇界」では所詮リーガンはヒーローを演じていたうすっぺらな映画業界人でしかなく、評論家からは、はなから相手にされない。

うっかり楽屋口から締め出され、パンツ一丁でブロードウェイを歩いた動画がネットでバズるという体験から転機が始まる。それまで、ネット上では存在すらしていなかった自分が、一夜にして有名人となる。ひさびさに、多くの人達から承認される喜び。拳銃で自殺するという突飛な発想も、世の中を悲観してというのではなく、さらにスキャンダラスな演出をすることでより、家族や世間から承認されたいという発想だったのではなかろうか。

この作品のテーマ、40歳を過ぎた自分にとっていろいろ身につまされて、心を揺さぶられる。多くの中年は、「俺はこんなもんじゃないはずだ」という心の中のバードマンと葛藤してる。スーパーヒーロになった自分を夢想しつつ、単調な現実を生きていく。なかなか重い。

ちなみに、劇中劇で使われるレイモンド・カーヴァーの「愛について語るときに我々の語ること」を読んだことがない。この作品の内容を知っていると、また感想は変わってくるのかもしれない。


Shadertoneで遊んでみた – 導入編

overtone-logo

Shadertoneで遊んでみたら、なかなか面白かったので、備忘録としてブログに書いてみる。

Shadertoneは、ソースコードがGithubで公開されている。

このリポジトリの要約をみると “A mix of www.shadertoy.com and Overtone” とある。理解してみるとなかなか的を得た要約なのだけれど、最初は何のことやらという感じだったのでここから解読してみる。

まず、shadertoyの方だけれど、こちらはGLSL(Shader)をWebブラウザ上で実行とコーディングする環境。GLSL sandbox に近い感じ。まあ、こちらは理解できる。

問題は、Overtoneのほうで、こちらはオフィシャルのWebサイトが用意されている。

ここの説明の、「SuperColliderとClojureをくっつけたもの」という部分が要点となる。SuperColliderは、コンピュータ音楽言語でありオーディオ生成エンジンとして、すっかりお馴染なので割愛。Clojureとは、Lispの方言の一つで、いま話題の「関数型プログラミング言語」のひとつ。Javaのバーチャルマシンの上で動作する。

つまり、ここまでを要約すると、

  • Shadertoneは、OvertoneとGLSLのライブコーディング環境をミックスしたもの
  • Overtoneは、ClojureからSuperColliderの音響合成を行うライブコーディング環境

ということ。

別の言語体系で、SuperColliderの音響合成エンジンで音を生成するというアプローチは、Sonic Piに似ている。それもそのはずで、OvertoneおよびShadertoneの作者Sam Aaronは、Sonic Piの開発者でもある。Sonic Piと同様、Overtoneもライブコーディングの機能を重視している。さらに、複数人でソースを共有しながらのライブコーディングも可能となる模様。Overtoneの実行している様子は、本人によるデモがわかりやすい。

Sonic Piが、どちらかというと簡易な文法でライブコーディングを体験できる教育用途に主眼を置いているのに対して、Overtoneはより本格的にゴリゴリとライブコーディングする環境という印象。さらにOvertone/Shadertoneは、インストールと環境構築がややハードルが高いのがちょっとやっかいな感じ。手元のOS X 10.3.3で動かした際の環境構築をざっと書き出してみる。

まず、Clojureを対話的に実行可能なテキストエディタを用意する必要がある。イケてるライブコーディング用エディタとして話題のLight Tableや、vimからでも実行可能なのだが、ここでは作者であるSam Aaronが使用しているEmacsで環境構築してみる。

まず、OS Xにいろいろインストールするのに便利なHomebrewの環境を用意する。Homebrewの導入はこちらを参照。

Homebrewの環境が整ったら、emacsを最新版(2015年4月現在だと、24.5)にしておく。

次に、Clojureのプロジェクト生成を自動化してくれるLeiningenという環境を入れる。これもHomebrewをつかうと楽。

次に、Emacsをライブコーディング用にチューンナップする。Sam Aaron自ら、自分の環境をパッケージングしてEmacs-Liveという名前で公開している。こちらもターミナルから1行コマンドでインストール可能。

次に、GithubからShadertoneをZipでダウンロード、もしくはCloneする。

Shadertoneをダウンロードしたフォルダに移動して、emacsを起動

すると、Emacs-liveでバキバキにチューンナップされたEmacsが起動する。

screenshot_902

まずは、Shadertoneのサンプルを試してみる。emacsから、example/00demo_intro_tour.clj を開いてみる。

screenshot_903

サンプルを開いた状態で、emacsで以下のコマンドを実行

これで、Shadertoneを対話的に実行する環境が起動する(起動にはしばらく時間がかかるので注意)。

このあとは、それぞれの行の末尾に移動して、

を入力するとその行が評価される。例えば、

の末尾に移動して C-c C-e をすると、ウィンドウが起動してShaderが表示される。ここから先は下記の映像を参照してみてほしい。

こんな感じで、どんどんライブコーディングしながら音と映像を同期していける。なかなか素晴らしい。

だいぶ長くなってきたので、続きはまた今度。


2015年のMac OS XでGNU Emacs

screenshot_817

最近は、OS Xで動くテキストエディターは、Sublime Text、Atomなど、モダンで高機能なものが多数出ている。なので、個人的にはほとんど起動しなくなってしまったemacs。思い返してみると、初めて使用した本格的なテキストエディタは、emacsだった。一時期は、emacsで文章を書き、コードを書き、メールの読み書きやターミナルでの作業もemacsでやってた。そんなわけで、たまにはemacsも使ってみるかという気分になり最近の事情を確認してみた。

もちろん、OS Xにはターミナル内で動くemacsは最初から入っているので、ターミナルないでちょこっとテキストを編集するならこれで問題ない。しかし、せっかくならCocoaの環境の中でアプリとして使いたい。

Mac OS Xでemacsといえば、Carbon Emacsパッケージが定番だった。しかし、開発がストップしてここ5年ほど更新はない。さすがにソースからコンパイルするのは面倒くさい。なので、AquaEmacsを導入することに。ホームページはこちら。

この、何ともいえないテイストのWebページが、なんだか懐しい感じ。Emacsのバージョンは、24.4だそうだ。まずは、ここからEmacsをダウンロードして、/Applications 以下にインストール。

以前は、日本語の設定が面倒で途中で挫折したような記憶があるのだけれど、再度挑戦してみたらそうでもなかった。

まずは、日本語の入力環境。(ことえりやATOKを使っている方は以下は参考になりません。すみません…)普段つかっているAquaSKKをそのまま使用できるといいのだけれど、どうやらいろいろ面倒らしい。なので、本家SKKを受け継ぐDDSKK(Daredevil SKK)を入れる。やりかたは、こちらのサイトを参考にした。

まずは、2015年3月現在最新の、ddskk 15.2をダウンロードして展開。展開したフォルダに移動。

Emacsの場所を指定して、インストール。

以上でOK。楽ちん!

あとは、~/.emacs.d/init.el を編集して、入力環境やフォント環境を整えるだけ。こんな設定にしてみました。

これで、”Control-\” でSKKが起動して快適に日本語入力のできるEmacsになったはず。さすがに普段使いはしないけど、たまには気分転換に使ってみるか。

DDSKKの入力モードによってカーソルの色が変化する機能は、わかりやすいな。AquaSKKでも使えると良いのになあ…


コーディングリハビリ – 球とパーリン・ノイズ

年末年始、ボーっとしてたらなんだか頭が呆けてきそうになったので、コーディングのリハビリ。

ofShperePrimitiveって、getMesh()メソッドを使うと生成した球のメッシュが取得できる。これを活用すると球をいろいろ歪ませて遊べるんじゃないかということで、球にパーリン・ノイズをかけてみた。ちなみに、パーリン・ノイズを考案したのはパーリン(Ken Perlin)さん。フォンシェーディングを発明したのはフォン(Bui Tuong Phong)さん。豆知識な。

ノイズの強さをサウンド入力のパワーで変化させると、音に反応する球になったりして面白そう。

ofApp.h

ofApp.cpp


C++の疑問: 値渡し、参照渡し、ポインタ渡し

※ 末尾に追記あり。

C++、いろいろ未だにわからにことだらけなのだけれど、関数に値を送る場合の

  • 値渡し
  • 参照渡し
  • ポインタ渡し

の違いがいまだにすっきりと整理できていない。

C++、自分の場合はoFで使うことがほとんどなので、oFのコードで実験してすっきりしてみようとシンプルなコードを書いてみた。

力をベクトルで与えると運動するParticleというクラスを以前から作っていたいので、これはそのまま流用。長くなるのでコードの内容は割愛。

Particleを操作するためのMoverというクラスをつくってみた。このMoverクラスは3種類の方法でParticleのインスタンスを受けとることができる

  • A: 値渡し
  • B: 参照渡し
  • C: ポインタ渡し

Mover.h

Mover.cpp

これを、ofAppから呼びだしてみる。

ofApp.cpp

実行結果はどうなったかというと

  • A: 値渡し → 動かない
  • B: 参照渡し → 動かない
  • C: ポインタ渡し → 動いた

Aの値渡しが動かないのは、まあ予想内の挙動。そして、Cのポインタ渡しでは狙い通りofAppのParticleのインスタンスもMoverから更新され、無事動いた。

解せないのは、Bの参照渡しの挙動。参照渡しはオブジェクトの実体ではなく、あくまでその参照として渡っているので、ofApp側のインスタンスも連動して更新されると考えていたのだが、このコードではそうならなかった。うーん、何故なんでしょう。

C++はムズカシイネ…

プロジェクト全体は下記にあります。

【追記】: Facebookでコメントしていただき、参照渡しがうまくいかなかった原因判明。Mover.cppの11行目で、”particleB = p;”と代入している。ここでpをparticleBにコピーしてしまっていて、その結果参照から外れてしまったということのようだ。うーん、なるほど。参照渡しはクラスのメンバとして扱うのは難しいですね…

こう修正したら、参照渡しでも動きました。クラス変数を参照渡しするには、コンストラクタの初期値として渡す必要あるみたい。ううむ、扱い難しいですね。

Mover.h

Mover.cpp

ofApp.cpp


Swiftメモ – PlaygroundのスケッチをOS Xのネイティブアプリへ

Swift OS X native app test from Atsushi Tadokoro on Vimeo.

PlaygroundでSceneKitをつかって3Dでいろいろ遊んでいるうちに、このスケッチをOS Xのアプリにしてみたい、という欲求が高まってきた。実際にやってみたら、思いの外簡単だったので、メモとして記録。

まずは、Playgroundでプログラムを作成。この段階で、ライブコーディングで色や大きさ動きなど細かなパラメータの調整を終えておく。まさにスケッチする感覚。

このスケッチを、OS Xのアプリ化したい。最近のXcodeには、便利なテンプレートがいろいろ用意されていて、これを利用していきたい。SceneKitを使用した3Dのプログラムは、“Game”というテンプレートをつかうと簡単にできるみたいなので、活用してみる。

まずは、Xcodeで、メニューから File > New > Project… で新規プロジェクトを作成する。テンプレートを選択する画面から、OS X > Application > Game を選択。

screenshot_250

“Next”ボタンを押して次に進むと、プロジェクトの詳細設定画面になる。ここで、Product Nameなどは適当な名前をつけて、LanguageをSwiftに、Game TechnologyをSceneKitに設定する。

screenshot_254

さらに“Next”ボタンを押すと、Projectを保存する場所を聞いてくるので、適当な場所を選択して保存すると、新規プロジェクトが生成される。

生成されたプロジェクトのファイルリストをみると、いろいろなファイルが自動的に生成されてる。試しにこのままビルドしてみる。ちょっとチープな戦闘機が、くるくる回転するアプリケーションが出来上がる。このアプリを改造して、先程Playgroundで作成したアプリを移植したい。

screenshot_252

ファイルリストの中で、変更するファイルは “GameViewController.swift” のみ。早速開いてみると、以下のような内容。

このコードが、飛行機の3Dモデルを読み込んでSCNSceneで表示しているようだ。ここを、先程のPlaygroundのコードに差し替える。View(SCNView)に関しては、“GameView.swift”で定義されているので、SCNSeneに関する部分のみを移植する。

こんな感じになった。

早速ビルドしてみると、最初のPlaygroundのスケッチが、ネイティブアプリとしてウィンドウで表示された! 表示速度も速い!

screenshot_253

しかし、Swift以降、OS Xのアプリケーション開発のハードルも、だいぶ下がったんじゃなかろうか。Playgroundとあわせて、いろいろ試していきたい。


Swift + Playgraoundメモ 3 – SceneKitで3Dライブコーディング!

注意: Swiftのソースは全てXcode 6 Beta 6で確認しています。それ以前のバージョンでの動作は確認していません。また今後のXcodeのバージョンで動く保証もありませんので、ご了承ください。

Generative 3D with Swift Playground from Atsushi Tadokoro on Vimeo.

Swift + Playgraoundメモ 1 – SpriteKitでアニメーション」、「Swift + Playgraoundメモ 2 – SpriteKitで物理シミュレーション」に続く、Swift + Playgroundシリーズ第3弾。今回は、3DCGに挑戦してみた。

2Dのグラフィクスの表示やアニメーションには、SprikeKitをつかったのだけれど、3Dではその代わりにSceneKitというフレームワークを使うらしい。説明を読むと、OpenGLなどと比べると、より上位のレベルで、シーンの中の物体とその動きを記述できるとのこと。早速、Swift+Playgroundの環境で使ってみたい。

まずは、SpriteKitのときと同様に、Viewを定義して、そこにSceneに追加する。3DのSceneには、SCNSceneを使用する。

ここにまずは背景色と照明(ライティング)の設定をしたい。こんな感じでコードを追加。Playgroundのタイムラインでの表示のためのコードも追加している。

次にカメラを配置する。3DCGは、三次元の情報を二次元平面に投影して、あたかも奥行があるように見せているものなので、どこから物体を見るのかという「視点」の設定が必須となる。

SceneKitでは、まずカメラを生成したあと、それをシーンのノードとして登録して追加するという手順を踏むようだ。こんな感じ。

これで、環境の準備ができた。さっそく3Dの物体を表示してみたい。まずは、シンプルに立方体を置いてみる。立体感がわかるよう配置したあと、ちょっと回転させて斜めから見るようにしている。

これで、既にリアルな物体として表示される。マテリアル(質感)はデフォルトでも既に設定されているようだ。

screenshot_241

次にこのデフォルトのマテリアルから独自なものに変更してみる。

最後にこの立方体にアニメーションを適用してみる。アニメーションにはCABasicAnimationクラスを使用する。いろいろな動きの定義が可能なのだけれど、ここでは、クルクルと回転させる動きにしてみることに。

これで、アニメーションつきの3Dグラフィクスプログラミングの完成!! 簡単!!

screenshot_243

最後にすこし応用的なサンプル。3Dの図形を立方体からトーラスに変更し、for文でくりかえして大量に描画する。さらに回転するアニメーションの速度を乱数で変化させて、いろいろな速度で回転するようにしてみた。

たったこれだけのコードで複雑な3D図形が生成された。楽しい!!

screenshot_244


Swift + Playgraoundメモ 2 – SpriteKitで物理シミュレーション

注意: Swiftのソースは全てXcode 6 Beta 6で確認しています。それ以前のバージョンでの動作は確認していません。また今後のXcodeのバージョンで動く保証もありませんので、ご了承ください。

Swift + Playground phyisics from Atsushi Tadokoro on Vimeo.

前回の「Swift + Playgraoundメモ 1 – SpriteKitでアニメーション」の続き。今回は、物理シミュレーションをやってみようかと。

まず、SKViewでビューを生成してそこのSKSceeのシーンを追加するところまでは、前回の通り。

おそらくゲームなどの用途を想定しているのか、SpriteKitにはあらかじめ物理エンジンが用意されている。Box2Dなどの物理エンジンを使用したことがあれば、さほど違和感なく使える感じ。

Box2Dでもそうだが、まず物理法則が適用される世界(World)を生成して、そこで重力や摩擦などのパラメータを指定する。そこに、物体(Body)を配置して、あとはエンジンの演算に丸投げというのが基本的な使い方。SpriteKitでは、世界(World)のためのクラスとしてSKPhysicsWorld、そして物体(Body)のためにSKPhysicsBodyというクラスをつかう。

SKPhysicsWorldとSKPhysicsBodyは、新規にインスタンスの生成などする必要はなく、あらかじめSKSceneのプロパティとして存在している。例えば、SKSceneのインスタンスがsceneだとすると

  • SKPhysicsWorld : scene.physicsWorld
  • SKPhysicsBody : scene.physicsBody

にパラメータを設定してやれば良い。

さっそく、まずはSKPhysicsWorldを追加。下向きに1の強さの重量を設定している。

ここに、まずは運動させる形(SKShapeNode)を追加する。今回は、四角ではなく丸にしてみる。

これで(200,300)の位置に半径6の円ができあがる。

screenshot_216

いよいよここに物理法則を適用してみたい。やり方は実にシンプルで、作成したShapeを、SKSceneのphysicsBodyにするだけ。

これで、配置した円が重力にひっぱられて下に向かって落ちていくはず。簡単!!

ただし、この円は画面の枠からはみ出してすぐに見えなくなってしまう。これではつまらないので、画面の四隅に壁を設定してみる。こんな感じでOK。

これで、壁でバウンドするようになったはず!

screenshot_217

この方法で、いくらでも物体は追加できる。例えば円を100個に増やしてみる。乱数の生成にはarc4random_uniformという関数を利用。

きちんと、100個の丸が相互に衝突判定している。

screenshot_218

さらに、それぞれの円に物理的なパラメータを設定してみる。ここでは以下のパラメータを設定してみた。

  • friction: 摩擦 → 0.1
  • restitution: 反発力 → 0.99
  • mass: 質量 → 1.0

screenshot_219

これで完成!! 30行ちょっとのコードでここまでできてしまうので、Swift楽しいなあ。しかもライブコーディング。


Swift + Playgraoundメモ 1 – SpriteKitでアニメーション

注意: Swiftのソースは全てXcode 6 Beta 6で確認しています。それ以前のバージョンでの動作は確認していません。また今後のXcodeのバージョンで動く保証もありませんので、ご了承ください。

最近は、XcodeのPlaygroundのようなライブコーディング環境が、これからのプログラミングの姿になっていくのではと勝手に期待しているところもあり、少しずつ勉強していきたいと考えているところ。こうやってブログにメモ的に残すことで自分の知識も整理されるかも、ということで、まだまだ試行錯誤中なのだけれど、現状でわかってきたところなど書いてみる。

Swiftの基本文法は、現状で一番まとまっているのは、やはり本家Appleの資料みたいだ。

現状は、ここ資料を見つつ、あとはStackoverflowなどでググりながら、いろいろ探っている段階。

まずは、SwiftとPlaygroundで、Processing的なアニメーションをつくってみたいなあと思ってちょっと調べてみると、iOSやOS XのSDKには、SpriteKitというのがあって、これを使っていけばSDKの機能を利用しながら効率的にアニメーションが作れそうな感じ。

とりあえず、やってみた。

まずは、Xcodeで新規にPlaygroundプロジェクトを作成。そこに必要なライブラリをimport。SpriteKitとあわせて、Playground用のライブラリXCPlaygroundも入れておく。

ここにまずビュー(View)というのを生成する必要があるみたい。SpriteKitでは、SKViewというクラスで実装されている。Processingでいうところの size() 的な感じで、幅と高さを指定してSKViewを生成する。

これで、もう画面が生成されている。楽ちんだ!

screenshot_211

ビューを生成したら、ここにシーンを追加してあげる必要があるようだ。シーンはSKSceneで定義する。ここで背景の色なども設定可能。背景を黒にして追加してみる。

screenshot_212

これで背景色黒のシーンが生成できた。いよいよ形を描いてみる。形を追加するにはSKSpriteNodeというクラスで形を定義して、最後にシーンにaddChild()すると良いらしい。ちょっとActionScript3風味。

これで青い四角形が画面中央に配置される。文法もさほど難しくない感じ。

screenshot_213

この形をアニメーションしてみたい。SpriteKitに配置したSKSpriteNodeは、SKActionクラスをつかうとあらかじめ用意された動きを簡単に付加できるようだ。試しに四角をぐるぐる回してみる。

まずは、1秒で1回転させてみる。こんな感じ。

ずっと回転させ続けるには、SKActionのrepeatActionForeverというメソッドをつかうと良いみたい。

これで、永遠にぐるぐる回る青い四角形のアニメーションが完成。まだまだ、手探り状態だけれど、なんとなく雰囲気はつかめてきた。

screenshot_215

(たぶん)つづく…


Github製エディター、Atomがすばらしい

screenshot_144

テキストエディター何を使うかという問題、常に議論(炎上)の種になりがちなテーマでいろいろ断言すると反応が怖いのだけれど、ここしばらく使用してみてGithubで開発されたAtomが素晴しいということで、紹介記事を書いてみる。

これまでのエディター遍歴を思い返してみると、最初に習った本格的なテキストエディターがEmacsだったので、かなり長いことEmacs派として過ごしてきた。今でもEmacsキーバインドが使えない環境にはストレス感じる。かな漢字変換もSKKに無理矢理馴染んでみたので、他の変換を使えない体になってしまった。

そういう事情もあり、個人的にテキストエディタを選ぶ基準として、

  • できるだけオリジナルに忠実なEmacsキーバインドが使える
  • SKK系のかな漢字変換が使用可能

また、最近になって構造的な文章を書く際はMarkdownで記述することが多いので

  • Markdownモードがあり、簡単にプレビューできる

という基準が必須となりつつある。

そういった基準を満たすエディターとして、Sublime Textは良くできてると思う。ただし、有料なので大学の授業などで一斉に採用というのもちょっと難しい。あと、Aqua SKKとの相性がちょっと微妙な感じもした。

で、最近登場したAtomに乗り換えてみたのだけれど、最初のうちはちょっと設定が落ちつかず四苦八苦することもあったのだが、ここにきて大分落ち着いてきた。個人的な感想としては、Sublime Textの代替として十分使用可能なんじゃないかと感じてる。

さらに、Sublime Textと比較しても良いかと感じたのは

  • フリーソフトウェア (MIT License)
  • GitHub Markdownとの相性が良い(Github純正なので)
  • Emacsキーバインドをかなり忠実に再現可能
  • パッケージの管理が楽

といったあたりか。

いろいろ設定してみて、個人的に必須かと思ったパッケージはデフォルトで同梱されるパッケージを除くと

ここらへん入れると、だいぶ快適になった。

ちなみにキーマップは

こういう設定で、Xcode風にControl+iで自動インデントをするように。また、Control+jの機能を殺すことで、SKKとのバッティングを防いでみた。

そんな感じでAtom素晴しいので、これからもいろいろ試していきたい!

ちなみに、この投稿の原稿もAtomで作成。Markdownで書いたのを、HTMLに書き出してWordpressにコピペした。らくちん!