2015年2月17日火曜日

夢の国の技術考察:「立体視」、結局どうなってんの?(1)

こんばんは。大学のレポートも落ち着き、ようやく春休みがやってきました。
ブログ始めた当初から「(覚え書き程度でも)書かないとなー」と思ってたネタをそろそろ。
まあ、ディズニーネタですね。これをちゃんと調べたのは2年前くらいになりますが、思い出しながら、もう一度まとめておきたいと思います。(主に自分のために)

(夢壊す要素を取り扱います。苦手な人は引き返して。)

 

東京ディズニーリゾートには、「ミッキーのフィルハーマジック」や、「マジックランプシアター」、過去には「ミクロアドベンチャー」、「キャプテンEO」などといったように、3D映画を映画館でよく見られるようになる前に3Dシアタータイプのアトラクションを運営していた経歴があります。

BtrxgcJCMAA01A6

最近では、ライドに3D映像を組み合わせたトイストーリー・マニア!や「スターツアーズ:ザ・アドベンチャーズ・コンティニュー」もスタートしました。

BtrXq0tCUAA4qes DSC_0642

とにかく、ディズニーと3D(立体視)はわりと切っても切れない関係にあります。ところで、立体視って結局どうやってやってるかご存じですか?
今回は立体視の手法に焦点を当てて、適当にメモしていきます。

立体視の原理?(ほぼおさらい)

立体視に用いられる手法は様々なものがありますが、基本的に原理はすべて同じです。人間の目は、網膜に映る像を認識するようになっていますが、2つの目でもってようやく3次元の物体を認知することが出来ます。
これはホイートストンのステレオスコープによって実証されていますね。
(実際の生活上には、それは立体であるという認識がすでにあるために、片目を閉じていてもモノが立体物であることを認知できるようです。立体視に使われるスクリーンは平面ですから、意識による奥行き感はないことになります。)

で、2つの目は物理的に数cm離れていますから、図(適当でごめんなさい)のように、網膜に現れる像に差が出ます。これを両眼視差といいます。
両眼視差が奥行き感を作り出している正体です。つまり、両眼視差どうこうの計算はともかく、手法的には、右目と左目で別の像を見せられればOKというわけです。
とりあえずはこんな感じで。今回は手法に焦点を当てるので、原理は別の像を見せられればいいということだけ覚えておいてくれればOKです。

image

手法にはどんなのがあるの?

今現在、映画館やディズニーリゾートなどで使われている立体視の手法には次のようなものがあります。

アナグリフ方式

一昔前の俗に言う「赤青メガネ」を用いるタイプです。ディスプレイにも、プロジェクターにも使えます。
欠点は、恐ろしく目がちかちかすることと、色がRとBの1色ずつしか各目に出ないので、色の表現が恐ろしく苦手です。
利点は、メガネが色つきプラ板だけでなんとかなるので、超安価だということ。
今では殆ど見なくなりました。

液晶シャッター方式

液晶を用いたメガネを使って、リアルタイムで通信を行うことで立体視させる方式です。XpanDやnvidia 3D visionなど。液晶・プロジェクターを問いません。
利点は、色情報が抜け落ちないので、きれいなままで映像がみれること。また、メガネの透明度が高めなので、基本的にシルバースクリーン(後述)が必要ない点。
また、方式の特性上、どうしてもちらつきやすいという欠点と、メガネに電池が必要だったり、赤外線通信用のエミッタが必要などの欠点があります。
あと、プロジェクタもかなり高速なフレームレートに耐えられるような、高価なものでなければなりません。その代わり、プロジェクタの台数は1台でOKです。

偏光方式

偏光の方向によって更に分類があります。TOHOシネマズのRealD方式(円偏光)や、IMAX 3D方式(直線偏光)などなど。
ある一定方向の波のみ通し、それ以外はシャットアウトする偏光板を用いる方式です。シアター系ではこれが主流です。なお、液晶では使えません。
利点は、メガネが偏光フィルタを用いるだけでつくれるので、比較的安価です。
欠点は、ゴーストと呼ばれる上手く焦点が合わないときに発生する残像が出やすいことです。そのため、映像に下処理をしておく必要があります。
さらに、シルバースクリーン(銀粉を均一に塗布したスクリーン)を用意する必要があります。これは、偏光フィルターを通したときに輝度が落ちるためです。ただし、このシルバースクリーン、通常のスクリーンの数十倍の値段がするそうで。あと、プロジェクターもL・R用に2台必要です。
(これは直線偏光の場合のみですが、頭が動くと立体視効果が薄れやすいようです)

☆ディズニーリゾートでは、「ミッキーのフィルハーマジック」や、「マジックランプシアター」、「トイストーリー・マニア!」「ミクロアドベンチャー|キャプテンEO」(この2つはそもそも同じ建物)で採用されています。

分光方式

特殊なフィルター(フィルターホイール)を用いて色の波長を分解し、分光メガネを用いて左右に別々の像を送ります。こちらも液晶だと使えません。
色の表現がものすごくきれいですが、メガネとフィルターホイールがめちゃくちゃ高いです。しかし、プロジェクタが1台で済むなどの利点もあります。
この方式であれば、シルバースクリーンを用意するのも、赤外線エミッタも不要です。ただフィルターホイールを取り付けて、メガネを用意するだけでOKです。
☆ディズニーリゾートでは、「スターツアーズ:ザ・アドベンチャーズ・コンティニュー」で採用されています。

視差バリア方式

眼鏡がいらない、液晶TVなどに搭載されています。3DSや液晶TVなど。
あんまり詳しくないので書けない…

 

ぶっちゃけライド系のアトラクションについてではないので、ディズニーの技術っぽくないですが、(2)ではそれぞれの仕組みについてもーちょい書きたいと思います。
(続く)

References

原理端折りまくったので、この辺で補完していただければ。

http://www.kitakyu-u.ac.jp/env/_static/page/env/images/_p17-18.164ad101d6477f0956edc8e6d108389e.pdf
http://kagaku-jiten.com/cognitive-psychology/perception/depth.html

2014年12月23日火曜日

チーム開発とかでSlackを使うといろいろと捗る話

こんばんは。毎日更新してますが、暇って訳じゃないです。

最近は、Slackを使っていろいろとやっています。
Slackは、(ある程度は無料で使える)企業向けのチャットツールです。

Slackの特にすごいところは、「他のツールと連携(Integration)できるところ」ですね。これほんとすごい。
RedmineやBitbucketなど、わりと様々な開発で必要なツールが連携できます。

こういうツールには、AtlassianのHipChatとかもあるんですが、HipChatはチャネルごとに通知設定ができなかったりとわりと不便なところが多い。
最近HipChatは基本料無料化されましたけど、デザインがダサいちょっと受け付けない感じだったので(昔のIRCを想像してもらえるといいと思います)、Slackを導入するに至りました。

僕自身は、大学入ってからというもの、高校の友達数人とCakePHPで開発してみたりしているのですが、そのときにチャットツールにLINEを使用してました。
LINEはやっぱり既読でどれくらい読んでもらえたのかがわかるのがとてもいいところなんですが、如何せん過去ログが追いにくい(最近検索機能とかついたみたいです)、PCとの連携もなんか1台ずつで面倒、さらにはモバイルデバイスは1台のみという明らかに使い勝手が悪い感じで、どうにかならんかなーといった感じでした。
Skypeのボイスチャットも同時に稼働してましたが、やっぱりグループを作るのが面倒って感じでした。

あと、Bitbucketの課題ツールの運用が、ちょっと前に失敗してしまったのです。理由は「見ない」。遠隔地で開発をやってるからこそ起こりそうな問題に直面してました。

そこで、課題ツールの通知もみれたらいいねーという話になって、とても強いIntegrationを持つSlackを導入したわけですね。

Slackですが、残念なことにIntegrationを無料では5つまでしか利用できません。残念。
あと、メインで使い始めたCodebreakなんていう弱小あまり話を聞かないサービスのIntegrationなどあるわけがなく…と思っていたら、Slackの公式で紹介されていた「Hammock」なるツールがあるとのこと。こいつは、一言でいうとオレオレIntegrationを作るためのツールです。なんとピュアなPHPとSmartyという最近はあまり聞かなくなった構成で動きます。

Hammockのプラグインを書くことで、簡単にSlackのIntegrationを作ることができます。あと、こいつはIntegration上限には含まれないので、Integrationの数をけちれます。Webhook飛ばしてくるのはこいつにまとめてしまえばかなり便利です。SlackのAPIのブリッジになっているだけなので、Slackに実装されている「Incoming Webhook」を自前で実装することができます。

スクリーンショット_122314_092638_PM

まあ、実際にSlackではこんな感じでHookされてきた情報が表示されるわけです。大変便利。

Slackの導入方法とかは、検索すれば山ほど出てきますが、チームメンバーがわかんない!って言ったので、ちょっとマニュアルを作ったのです。今度公開しようと思います。
HammockプラグインでCodebreak Integrationを書いた話も今度。

OpenShiftでRedmineを設置して、Bitbucket連携を完璧にキメるまでの話

こんばんは。OpenShift楽しくて、ドはまりしています。
さて、先日Redmineを2.6にして、インストールしましたが、次のような問題があります。

  1. プラグインのGemfileが自動読み込みされなくなった
  2. GitにOpenShiftからのSSHができなくて困る
  3. Redmine_Bitbucketを入れたときに、デプロイするごとにリポジトリがすっ飛ぶ
とりあえず、これらの問題を解決しないと、残念な結果になること間違いなしです。
設定にはそこそこの時間と工夫を要したので、メモしておくことにします。

1.プラグインのGemfileが自動読み込みされない

OpenShiftでは、デプロイ時にはGemfile.lockを参照するようになっています。というわけで、Gemfile.lockを自動で変更させていきたいのですが、なかなかそうは行かない。
前回は、応急処置的に、Gemfile.lock.ruby-1.9をbundle install --no-deploymentで作成したGemfile.lockの内容に書き換えればいいとかいいましたが、やはりオリジナルからGemfileをもって気やすいようにしたいところです。
ここは考えて、.openshift/action_hooks/pre_buildをいじって対応します。

===.openshift/action_hooks/pre_build===
pushd "$OPENSHIFT_REPO_DIR" > /dev/null
#[ ! -f Gemfile.lock ] && cp -f "Gemfile.lock.ruby-$OPENSHIFT_RUBY_VERSION" Gemfile.lock
cp config/database.yml-$OPENSHIFT_RUBY_VERSION config/database.yml
popd > /dev/null
======

まあ、cpでrubyバージョンごとのGemfile.lockを作らないようにしてるんですな。んじゃあデプロイするには、この状態でどうするかというと、
  1. Rubyプラグインぶち込む
  2. rm ./Gemfile.lock
  3. bundle install --no-deploymentでGemfile.lockを作る
  4. 作られたGemfile.lockをGitリポジトリにぶち込む
これで、プラグインのGemfileが取得できて、Gemfile.lockに反映されるはず。あんまり頭のいい方法じゃないね。
注意点は、Gemfile.lockがgitgnoreで例外化されている場合があること。これはもうgitgnoreいじるしかない。

2.GitのOpenShiftからのSSHができなくて困る。

ここをみてわかったのですが、どうやらOpenShiftには秘密鍵のアクセス権がなかったりで、どうもGitに向いてない模様。
しょうがないので、Git-syncの時にも使った、GIT_SSH環境変数に再度ご活躍いただきます。やってることは前回と同じ、SSHコマンドをラップしてあげるだけです。
しかし、配置場所は、{$OPENSHIFT_DATA_DIR}にしなければなりません。それ以外のフォルダに関しては、デプロイですべて消し飛ぶ可能性があるので、使用しないことを推奨されています。


次のファイルは、{$OPENSHIFT_DATA_DIR}に配置する必要があります。リポジトリに放り込んでも意味がありません。(もちろん秘密鍵、公開鍵はssh-keygenで発行させます)
  • {$OPENSHIFT_DATA_DIR}ssh/git-ssh.sh (モード700で)
  • {$OPENSHIFT_DATA_DIR}ssh/id_rsa
  • ({$OPENSHIFT_DATA_DIR}ssh/id_rsa.pub)
これで、SSH-GITを使う準備はOKなのですが、hookしたときに、リポジトリが取り出せなくて詰みます。理由は、Redmine側に、GIT_SSHのコマンドを使うための用意がないからです。というわけで、「Redmine Bitbucket Plugin」に追記します。(こんなことしなくても、configuration.ymlのscm_git_commandを設定すればいいだけという。あとは、bash_profileにaliasでもいいみたいだけど、個人的に同名コマンドにaliasを張るつもりないからなあ)

===plugins/redmine_bitbucket/lib/bitbucket_rb.git===
class BitbucketGit < SystemCommand

  #GIT_BIN = Redmine::Configuration['scm_git_command'] || "git"
  GIT_BIN = "GIT_SSH="+ENV["OPENSHIFT_DATA_DIR"]+"ssh/git-ssh.sh git"

  def self.scm_class
    Repository::Git
  end
…
======

まあ追記して、Git-sshを実行できるようにしたわけです。とりあえず、GitへSSHはこんな感じで実装します。

3.Redmine_Bitbucketを入れたときに、デプロイするごとにリポジトリがすっ飛ぶ

Redmine Bitbucketのリポジトリは、APPROOTの直下にフォルダが作成されて、そこにmirrorするようになっているようですが、Openshiftでは例外なく吹っ飛ぶので、設定が必要です。
ポピュラーな設定として、Symbolic linkがあるので、とりあえずそれで利用します。
まずは、bitbucket_reposというフォルダを作っておいておくことを言い忘れておりました。
作ってから作業スタートです。

===.openshift/action_hooks/post_deploy===
...
ln -sf ${OPENSHIFT_DATA_DIR}files ${OPENSHIFT_REPO_DIR}files
ln -sf ${OPENSHIFT_DATA_DIR}bitbucket_repos ${OPENSHIFT_REPO_DIR}bitbucket_repos
======

こんな感じで、bitbucket_reposにシンボリックリンクを張っておくと吹き飛ばなくてすみます。
あと、どうやらこのプラグイン、pushされたタイミングじゃないと読み込みがされないようで。厳しいのう。なんで、作られてなくてもとりあえず落ちつてDeployすればいいってことですね。${OPENSHIFT_DATA_DIR}filesフォルダがないなら、ちゃんと作っておきます。

おまけ:/bin/bash^M

改行コードエラーだったようです。LinuxでWindowsの改行コードを使用すると、この出力とともにシェルスクリプトが反応しなくなります。要注意。

総括

やっぱり、いろいろなことしないと正常に動かない印象。スマートな方法が欲しいなあ。

2014年12月22日月曜日

Gitのリモートリポジトリ間で単方向の同期をとる

こんばんは。最近はブログ書きまくってますね。いい調子。

さて、最近はクラウド型のCIツール(Werckerとか、Shippableとか)が何かと流行ってますが、使おうと思ったときにBitbucketやGithubを強制されるんですよね。プライベートな開発で、Bitbucketのコラボレーション制限とかが邪魔をして、ちょっと人数のいる開発とかをやろうとすると、CIツールが使えないという大変残念な結果に。

しょうがないので、他のGitホスティング(あまり評判よくないけどCodebreakとか)と、Bitbucketを同期をとって、CIツールでデプロイするときはBitbucketを参照し、自分たちがプッシュする先はCodebreakにするってことをやってみました。

まあ、とりあえず方法としては、CodebreakにもあるWebhookを利用して、プッシュされたら外部サーバーにHookして、Bitbucketと連携させるスクリプトを書いてみることにしました。

Web言語は何にしようかなーと思ったりとかはしたんですが、サーバーであっさり動くし慣れ親しんでるのでPHPで動かすことにして、シェルスクリプトをたたくだけにしてみました。

肝心のGitとの同期ですが、--mirrorオプションを使ってサクッとクローンして、--mirrorなbareとして動作させています。その方が楽だしね。

あと、スクリプトを置く場所で、SSH秘密鍵を共有したくなかったので、GIT_SSH環境変数を使って、sshコマンドをラップして、任意の秘密鍵を用いるようにしました。秘密鍵の生成はssh-keygenで場所を指定して生成すれば全然問題になりません。

毎度毎度コマンドがりがりのくせに、今回ばかりは成果物ができたので、成果物をGithubに放り込んでみました。もしよければ使ってやってください。あまり検証してないので、セキュリティ的にヤバイかも?
https://github.com/litols0816/git-sync

2014年12月20日土曜日

OpenShiftでRedmineを動かそうという話

こんばんは。前回に引き続きRedmineをアレコレしています。

前回、さくらサーバーでの動作が悲惨だったので、今回はPassengerをタダで使えることを前提にして、いろいろと調べてみました。
やっぱりVPSやIaaSなどを借りるほどでもないので、PaaSを使ってRubyをデプロイできる環境にすることに。
最初は、Herokuとか思いつきましたけど、容量問題でGitリポジトリブラウザが使えなかったり、DB1万行も尾を引きそうだったので、RedmineをOpenShiftというRedhatが提供するPaaSサービスを利用することにしました。
OpenShiftを用いる理由として、

  • Redmineの高速インストールができる
  • 1GBのデータ領域
  • SSHでガチャガチャしたりやりたい放題できる
などなど、様々な理由があります。
しかし、案の定日本語のドキュメントが少なかったので、英語とコード(Ruby歴3時間)との戦いを強いられたのでメモを残します。

1.OpenShiftで試しに高速インストール

Redmineをインストールするのは、超簡単で、OpenShiftのアカウントを作ってログインしたら、まず[ Add Applications...]というボタンをおして、検索窓に「Redmine」と入力して、URLを設定したら、あとは[Create Application]を押すだけ。
数分すると、Redmineのインストールが完了してもうすでに動いています。
URLにアクセスすると、Redmineにログインできるので、ID=admin PW=adminでさくっとログインして使えます。
標準でSSLにも対応しているようです。

2.Redmineをバージョンアップしたら動かなくなった

さて、これでインストールされるRedmineはV2.4と古めです。なんで新しいRedmine 2.6を当ててみます。

まずは、Gitの設定をしておきます。SourceTreeあたりで、OpenShiftのコンソールに表示されているGitのURLをコピペしてcloneしておきます。

次にRedmine2.6をダウンロードです。
http://www.redmine.org/projects/redmine/wiki/Download

ダウンロードしたら、ファイルを展開して、Redmineの2.6をクローンしたリポジトリに放り込んでPushします。
まあこれでとりあえず、Internal server errorが出て動かなくなります。

というわけで、SSHして直接いじります。

$ cd app-root/repos
$ bundle install --no-deployment

(追記 2014/12/25)rakeすんの忘れてた。
$ rake generate_secret_token
$ rake db:migrate RAILS_ENV="production"
$ rake redmine:plugins:migrate RAILS_ENV="production"


これで、インストールされているGemを吹き飛ばして、Gemfileに沿って最初からダウンロードされます。このとき、Railsのルートに「Gemfile.lock」というファイルが用意されるのですが、こいつがわりと重要になります。

OpenShiftのリポジトリの中には、「.openshift」というフォルダがあるのですが、これはOpenShiftの環境系ファイルの塊です。そのうち、「action_hooks」というフォルダがあるのでみてみると、pre_○○とか、明らかにビルド前後に実行されそうなスクリプトが並んでます。
そのうちのpre_buildをみてみると、

pushd "$OPENSHIFT_REPO_DIR" > /dev/null
[ ! -f Gemfile.lock ] && cp -f "Gemfile.lock.ruby-$OPENSHIFT_RUBY_VERSION" Gemfile.lock
cp config/database.yml-$OPENSHIFT_RUBY_VERSION config/database.yml
popd > /dev/null
cpでGemfile.lockをRubyバージョンに合わせて再生成してます本当にありがとうございました。
あと、ついでとばかりにdatabase.ymlもコピッてつくってますね。
とりあえず、detabase.ymlのOpenShiftのRubyバージョンは考えなくてもよさそうなので、放っておきます。
わかったことは、(最近作ったGearなら、)Gemfile.lock.ruby-1.9をbundle install --no-deploymentで作成したGemfile.lockの内容に書き換えればいいわけですな。

総括

RedmineをOpenShiftでインストールしようとすると、さくっとできるけど、変更を加えたりするのがとても大変な感じですね。
Gemfile.lockを手作業で変更するのはとても大変なので、わざとコケさせてGemfile.lockを作らせるのが吉っぽいです。

(追伸)
Blogger使いにくいでござる。面倒だし、なんか別のブログサービスみつからないかなあ…


2014年11月28日金曜日

Redmine2.xをなんとかして最近のさくらのレンタルサーバー(スタンダード)に導入した話

お久しぶりです。
最近は何かとばたばたしていたせいで、ブログなんて書いてる余裕、どこにもありませんでした。

さて、今年はCakePHPでチーム開発を実際に経験したり、大学のプログラムでオセロゲームを作って某ゲーム開発バイトをしているEさんや、院生の先輩NさんとAIでやり合ったりと、なかなか充実した日々を過ごしていた次第です。最近はFPGA始めました。
高校からずっとそうですが相変わらず数学はできません。

ところで、CakePHPを使ってチーム開発をしていたとき、BitbucketのIssueを使っていたんですが、どうも超不定期活動という僕らのスタイルにBitbucketのIssueはとても面倒だと感じたメンバーが多かったようで、大変不評でした。

ツールを変えるのもそれはそれで面倒だったのでそのときは廃れていくBitbucket Issueを眺めていたわけですが、次のチーム開発や、自分用にRedmineとかあったら捗るだろうなあと思った次第です。

というわけで、やってみました。
自分用の記録的要素がとても強いので、完全に殴り書きです。ごめんね。

2013年12月23日月曜日

Oracle Database Express Edition 11g をUbuntu13.10(64bit)にインストールしようとしてひどい目にあった話

どうもどうも。久しぶりです。
学校の課題でOracleのDBを使っていたのでいっそ家でもできるようにとマイUbuntuにインストールしようとしたらひどい目にあいました。ただそれだけの話。

Ubuntu13.10を使ったインストール例が殆ど無いので、完全に手探りだったのですが、そのせいもあって5時間程度格闘することに。もうやりたかない。

後にこの無謀なチャレンジをする人たちのためにヒント的なまとめを記録しておこうと思う。自分のメモ書き的意味も含めて。