Akihiro Memo

開発関連のメモ、雑記

電通大生のためのディズニーシー解説

この記事は UEC Advent Calendar 2013 - Adventar の19日目の記事になります。

自己紹介

うるし@Ixion (U_Akihir0) on Twitter
TheWorld_JP (TheWorld_JP) on Twitter
漆原 明博 | Facebook


電気通信大学の情報理工学研究科M2で、普段大学ではコンパイラインタプリタなどの言語処理系の研究をしてます。LLVMが大好きです。研究で使ってて好きになりました。LLVM-IR はよほど難しいものじゃない限りは読めます。Clang が世を席巻する時代は近い。あと、ネット的には iOS 向けの Twitter クライアント、TheWorld for iOS 作ってる人ってのが一番有名だと思います。そんな僕ですが、ここではどうでもいい事は一切置いておくことにして、ここでは、僕が大好きな東京ディズニーリゾートの、ディズニーシーについて語っていこうと思います。名づけて「電通大生も好きになるクリスマスの東京ディズニーシー」です。

東京ディズニーシーとはなんぞや

東京駅から京葉線で二十分程、千葉の舞浜駅に構える巨大リゾート施設、東京ディズニーリゾート(以下、TDR)に構える二台看板であるテーマパークの一つ、それが東京ディズニーシー(以下、TDS)です。ついでにもう一つのテーマパークは東京ディズニーランド(以下、TDL)です。ここで敢えて遊園地と表現せずに、テーマパークと言ったのには訳があります。それは、TDS、TDL共に、大きな特徴として挙げられるのは園内全体として、雰囲気作りを非常に拘っている事が挙げられます、ディズニーの世界観を作り上げているのです、まさにテーマパーク。そのため、乗り物(アトラクション)が決して楽しみ方の中心という訳ではありません。


TDLが「魔法」をテーマにしてる一方、TDSは「冒険」をテーマにしています。TDLの中心には大きなお城、シンデレラ城が聳え立つ一方、TDSの中心にはプロメテウス火山が堂々とその存在をアピールしています。TDSを入り一望できる湖であるメディテレーニアンハーバー、その後ろにプロメテウス火山という景色は誰もがTDSで入って一瞬で「ここは違う世界なのだ」と、僕らに自覚させる瞬間でもあります。それこそが、TDS冒険のテーマパークなのです。

はじめに

TDL、TDS共に幾つかそのテーマパークで快適に遊ぶために知らなければいけないことがあります。まずはディズニーファストパスチケット(以下、ファストパスを省略してFP)の仕組みです。FPはアトラクションに優先的に乗れる仕組みです。FPに対応しているアトラクションでは、スタンバイ(通常の入り口)とファストパス(FP用)エントランスが存在します。それぞれが列になっており、アトラクションの案内を待つことになります。ファストパスエントランスでは対応するアトラクションのFPを持つ人のみが入ることが可能です。二つの列はアトラクションの開始手前で合流します。ファストパスエントランスから入った人達の方がの方が合流の際に優先されるので、実質的には大幅な待ち時間の短縮が可能です。スタンバイの待ち時間が120分待ちとかのアトラクションでも、FPさえあれば10分もたたない内に乗り物に案内されます。


FPをどうやって手に入れるかですが、FPに対応するアトラクションの前には、FPの発券機が存在します。テーマパークのチケットをかざす(バーコード部分を読み取らせる)と、FPが発券されます。FPには対応アトラクション及び、有効な時間帯、及び次にFPが取得できるようになる時間が印字されています。有効な時間帯はそのFPを用いれる時間帯のことで、五分刻みに変化し、1時間の時間幅が与えられます。(例:12:05 ~ 13:05)(時間幅の開始が閉園一時間未満の場合は閉園時間まで(例:21:35 ~ 22:00))更に、FPは無限に取得することは不可能で、一回取得毎におおよそ二時間程度のクールタイムが必要になります。それが最後に印字された次にFPが取得できるようになる時間です。また、FPはアトラクション各々につき発券できる限りが存在し、早い者勝ちになります。このFPをいかに運用していくかは、一種のディズニー攻略法になります。ですが安心してください。ディズニー未経験者の電通大生ために、簡単な案を紹介の中で提案していきます。


行く日程についてですが、折角電通大生は学生です。土日にディズニーに行く人達のためにも、平日に大学をさぼって行きましょう。特に今年(2013)のクリスマス・イブなんて平日です。オススメですよ? また、月曜日も極力避けるようにしましょう。月曜日も振替休日の方々がやってくる傾向が強く、土日並に混雑することがままにあります。火〜木曜日に行ければベストです。特に今年(2013)のクリスマス・イブなんて火曜日です。オススメですよ?

当日前にすること

この記事を一通り理解しておいてください。それで不自由しないはずです。混みそうな日程の場合は事前にチケットを全国のディズニーストア等で購入しておくことをオススメします。最近はeチケットとかもできるみたいですが、苦労話しか聞かないので、普通にチケット買っておくのがオススメです。方向音痴な人は予めTDSのマップでも手に入れて大体の地理感を付けておくとよいでしょう。あと、テンションを上げておくこと。「楽しむぞー」って気持ちは何よりも大事です!!

当日

舞浜から入場

複数人数で行く場合、場所が合わない時は舞浜集合にせざるを得ませんが、初見さんの集合の場合、舞浜駅は混雑が想定され、かつ改札が広いため「改札前集合ね!」が通じません。具体的な位置を指定するか、誰かが我慢してみんなの知ってる東京駅等で待ち合わせするのがいいでしょう。さて、舞浜駅からTDSは若干の距離があります。舞浜駅改札をを出て左側、イクスピアリという商業施設の方面に、ディズニーリゾートラインというモノレールがディズニーリゾート内を巡回しています。それに乗るのが一番分かりやすく迷いませんのでオススメです。片道250円とちょっとお高いですが、ディズニー価格、これから/2された金額で見ていくといいでしょう。三駅目の駅がTDSに隣接する駅になります。この時から既に感じるディズニーの雰囲気。是非この時から色々見て雰囲気を感じてください。


チケットを当日購入する場合は、チケットカウンターに並ぶ必要がありますが、混雑時で無ければ多少の待ちで購入が可能です。ぱぱっと買いましょう。その後、手荷物検査を受けて、入場になります。始発で行く場合はここで暫く待つことになります。初見でそこまでしようと考える人は少ないと思うので、この時点で開園から30分後ぐらいを目安にいままでの時間を考えることをオススメします。

入場から最初のアトラクション

入場したら、大きな地球儀が見え、そこで記念写真撮ってる人もいます。たまにマーチングバンドをやっていたりもしますので、それなりに面白い場所なのですが、取り敢えず人の流れにそって、建物のアーチの中に入っていきましょう。建物はお土産やさんになっていますが、このタイミングでは取り敢えずスルーしましょう。そうしたら一望できる湖のメディテレーニアンハーバーとその後ろにプロメテウス火山。TDSにきたぞー!! ってことで一枚パシャリと写真でも撮ってみてじゃいかがでしょう?


入場したらやることはまず、ショーの時間帯の確認。どこかの人気アトラクションのFPを取る。抽選系のショーがある場合その抽選を行う。最後に、アトラクションに乗る場合はスタンバイで待つ。ということです。ショーについては後述します。人気アトラクションのFPを取る事についても、アトラクション紹介で後述しますが、現状恐らく取れるなら「トイ・ストーリー・マニア」になり、厳しいの場合「タワー・オブ・テラー」か「センター・オブ・ジ・アース」が順当です。開園時間から一時間以内の場合、ある程度待ち時間が少ないことが予測されるので、人気のあるアトラクションにならぶチャンスとも言えます。


オススメは「インディー・ジョーンズ・アドベンチャー:クリスタルスカルの魔宮」です。園内の奥に位置するアトラクションで、人気アトラクションの一つです。乗り物系のアトラクションですが、場所が奥地のせいか、開園した後は比較的混雑していない場合が多いです。FPの発券についても最近は割と終盤まで残っているのでオススメです。ジェットコースターが得意なら「レイジングスピリッツ」もオススメできます。「インディー・ジョーンズ」程の人気はありませんが、人気のあるアトラクションの一つで、FP対象のアトラクションでもあります。

基本的な園内の過ごし方

基本的によほど空いている日でなければ、人気のあるアトラクションはFPを用いて乗ったほうが良いでしょう。FPはおよそ三回程度発券できると考えて、その時間を見て行動することになります。FPを取り、次のFPが取得できる時間になるまで待ち時間の少ないアトラクションや、ショーを見たりして過ごし、次のFPを取得して、FPの時間帯になったらそのアトラクションに乗るということです。理系の電通大生なら、計算は得意だと思うので、比較的容易にスケジュールを組み上げることが可能かと考えます。しかし、TDS内はそれなりに広いので移動時間もちゃんと考慮に入れましょう。電通大構内よりも園内は勿論広いです。


ショーのタイミングになった時は注意が必要です。メインのショーはメディテレーニアンハーバーにてお昼に「レジェンド・オブ・ミシカ」が、夜には「ファンタズミック!」が行われます。ショーを観覧する場合の注意点は幾つかありますが、個人的に初めてのTDSでお昼のショーの観覧は避けてもいいでしょう。お昼のショーを見るよりは、個人的にオススメの「ビッグバンドビート」を見ることをオススメします。これを見る場合、お昼のショーとその待ち時間が被るケースがありあます。その時に並ぶと人が少ないのでオススメ。15:00ぐらいの開演の回です。ただし「ビッグバンドビート」についても注意点があります。ショーの項目にて説明します。

終盤

お土産は閉園時間が少し過ぎても買えるので、閉園時間まではしっかり遊びつくしましょう。(迷惑)夜のTDSは雰囲気があっていいので、あまり室内のアトラクションはオススメできません。室外のアトラクションで夜景と共に楽しみましょう。


アトラクション

ここではTDS内にある幾つかの有名なアトラクションについて説明します。

アメリカンウォーターフロント内
タワー・オブ・テラー(FP)

タワー・オブ・テラーはフリーフォール形式の落ち物系のアトラクションです。ゲスト(お客さんのこと)はホテルハイタワーと呼ばれるホテルのエレベーターに乗り込み、そこで怪事件に合うという設定。待ちが終わった後、ホテルハイタワーについての説明を受けた後、エレベーターに乗り込む前にまた少し並びます。ホテル内の奇妙な作り物は一見の価値あり。視差を利用してかなり落ちるように見せかけています。アメリカンウォーターフロント内にいると、タワー・オブ・テラーからよく悲鳴が聞こえてきますが、それは大抵が録音なのでご心配なく。それでも若干怖めなので、苦手な人はいるかも。FPのオススメ度は微妙。説明を受けた後の待ちがあるので、お得感が微妙ですが、そもそも待ち時間が長い傾向にあるため、FP取ってもいいかも。

トイ・ストーリー・マニア(FP)

最近出来た乗り物。子供でも楽しめるインタラクション系のアトラクションです。ゲストは3Dグラスをかけ、乗り物にのりこんで、画面に表れる様々なターゲットに向って、手元にある大砲?を打ち、ポイントを稼いでいきます。最後に獲得したポイントが表示される熱い乗り物です。グループとかで行くと、その特典競争になったりして面白いかもしれません。注意点としては、それなりの時間大砲を打ち続ける事になるので、序盤に力を入れ過ぎないこと。終盤の方が得点効率が良くなってくるので、終盤に体力をいかに残せるかが、体力のない電通大生にとっては大きな勝負の一因になります。20万点を超えればなかなか凄いです。是非頑張ってください。FPについては、現状(2013/12)非常に取るのが困難です。開園30分以内に入れれば取れるとは思いますが、時間帯が午後でしかも遅い時間帯なんてことがザラなので注意してください。スタンバイについては、100分待ちは超えるのがザラなので、正直オススメ出来ません。ポケモンバトルしたいなー、って思ったら並べばいいんじゃないでしょうかね?(適当)

ヴェネチアンゴンドラ

ヴェネチアの雰囲気で作成されたメディテレーニアンハーバー内を人力で漕ぐゴンドラに乗って水路を行くアトラクション。お兄さん、お姉さんがゴンドラを本当に漕いでくれる。妙に馴れ馴れしい上に、皆が皆このゴンドラは最高ですと言う。また、イタリア語での挨拶を幾つか覚えさせられるのも面白い。向かいのゴンドラに対して「チャオ~」というのはお約束。またメディテレーニアンハーバーを水面から見渡せるのは絶景だったりもする。また終わる前に、橋の下に入ったらお兄さん、お姉さんが歌ってくれるので目を瞑ってお願いごとをしましょう。という電通大生、コミュ障にはチョッとつらい乗り物。だけど凄い楽しいのでオススメ。ショーの最中には運行していなかったりするので、ショーの時間を避けて行こう。

ミステリアスアイランド内
センター・オブ・ジ・アース(FP)

センター・オブ・ジ・アースは地底探検に出かけて、そこで変な生き物に出会って脱出するという設定の、ジェットコースター(?)系のアトラクション。乗り物に乗り込んで、暫く地底の生き物とかを眺めた後に、火山活動が活発になったとかで、目の前に変な威圧的な生き物が現れ、急加速して一気に地底を後にします。急加速した後に、プロメテウス火山の中腹から飛び出るのですが、そこが一番の恐怖ポイント。安全バーもありますが、少しお尻の浮く怖い感覚を味わうことができます。プロメテウス火山の中腹からみる景色はなかなかに絶景なので、余裕がある人は景色も是非堪能してみてください。並んでいる時に展示されている小物は中々に見どころがあるので、そこにも注目。FPはオススメできます。FP合流ポイントはエレベーターに乗る前なのですが、エレベーターに乗った後も少し待ちがあります。といってもタワー・オブ・テラー程ではないので、待ち時間が長い時はお得感があります。

海底二万マイル(FP)

原作が好きな人には好きなんじゃないかな? 二人用の椅子が三つある六人乗りの変な乗り物に乗り込んで海底を探検するアトラクションです。それなりに人気ですが、乗り物好きにとってはちょっと楽しめるものではないと思います。途中手元にあるライトで海底を探索できるのですが、反応が悪く全然思うように動かないし、気付けば終わってるというよく分からん! って言いたくなるレベルで残念感がある。しかしカップルにはオススメできるかもしれない。なぜかって? カップルが二人暗く狭い乗り物の中で…。おっと、あとはご想像にお任せするゾ? FPはあるけど取るな。超混んでる時でも100分待ち程度。空いてる時だと5~15分待ちで、そもそもFPを実施してない場合もある。紙勿体無いしね。

アクアトピア

個人的に超推してる。アクアトピアは水の上をホーバーして進んでいく(設定)三人乗りの変な乗り物にのって、渦潮に任せてぐるぐるする乗り物。一見子供だましで残念感が漂って見えるが、実は人気アトラクション。乗ってると妙にテンションが上がる。乗る度に進路が異なるので、複数回乗ろう。また外に設置された屋外アトラクションなので、外の景色に合わせて感じ方も異なってくる。複数回乗るのがオススメ。朝トピア、昼トピア、夜トピアまである。しかしぐるぐる回るので、食後に乗るのは厳禁。最後に忠告。これで終わりかと思って油断してると、後頭部をやられるぞ。FPは非対応。待ち時間の目安は10~30分程度。それ以上の場合は混んでると思っていい。

ストームライダー(FP)

ストームライダーは映像系のアトラクションで、数十人が座れる劇場的な所で、臨場感溢れる空の旅の映像を見る。ストーリーは台風に変なミサイルを打ち込んで消すというもので、そのミサイルを打ち込む役の主人公が例によってチャラい感じの奴で、酷い操縦をしながらもなんとかなるという感じのストーリー。劇場自体が揺れたり、水滴が降ってきたりと、臨場感溢れる仕組みになっているので、雰囲気にのめり込める人はそれなりに怖いらしい。FPはあるけど、基本的には売れ残り感満載なので、オススメはできない。取るものがなかったら取り敢えず取るというスタンスのFP。

ロストリバーデルタ内
インディー・ジョーンズ・アドベンチャー:クリスタルスカルの魔宮(FP)

インディー・ジョーンズ・アドベンチャー:クリスタルスカルの魔宮は、主人公が若さの泉を求めて、クリスタルスカルの魔宮を探検するというストーリー。12人乗りのバン?に乗って、魔宮を所狭しと駆け回る。速度はそれなりにあり、左右に揺られる。が、別にそこまで怖いということはなく、怖い乗り物が嫌いな人でも、雰囲気の作り込みが凄い! と最後には感心していることだろう。最後にインディーがロープに捕まっているシーンあり、そこを下った時に写真スポットがあるので、忘れずにアヘ顔ダブルピースをするのが電通大生の嗜み。まわりのカップルの写真を汚してしまおう。FPは合流ポイントが乗り物にのる手前なので、非常にオススメできる上に、比較的最後までFPが残っているので、二、三回目のFPにコレというのがオススメな感じ。

レイジングスピリッツ(FP)

レイジングスピリッツはジェットコースター系のアトラクションで、ジャングルの中をコースターに乗って疾走する?という設定のアトラクション。一回転する部分があり、そこがそれなりに面白いという、一見派手目のない単純なジェットコースター系のアトラクションに見え、実際はそうである。単純にジェットコースターとして乗るのがいい。絶叫好きには物足りないし、だからといってディズニーらしい作り込みがあるわけでもない、というちょっと微妙なアトラクション。室外アトラクションなので、夜に行くと景色が綺麗なのでそこは確かにオススメできる。電通大生なら、眼鏡が落ちる事を心配して手でおさえてたらアトラクションが終わってました、なんてこともあるかもしれない。それでもジェットコースターとして単純に人気があり、それなりに待つ。FPはオススメだが、待ち時間次第といった所。インディー・ジョーンズとレイジングスピリッツは日時により、どちらかに人気が傾いたりするので、それを判断しながらFPを取るのが良策。どちらも乗るつもりなら、基本的には待ち時間の長い方でOK。

アラビアンコースト内
シンドバッド・ストーリーブック・ヴォヤッジ

イッツ・ア・スモールワールドのTDS版といえば事足りる説明だが、シンドバット版に改めるついでに演出がかなり強化されており、マスコットの質も高い。がインタラクション性は一切ないため、まあぼーっと眺めているだけのアトラクションではある。眠くなってしまうかも知れないが、それなりに見るところはあるので、是非起きていて欲しい。また、このアトラクションを終えると、イッツ・ア・スモールワールドと同様に、心のコンパスとか、そんな感じの歌に汚染されるので注意が必要だ。心のコンパスに従っていては、単位は取れない。気をつけよう。

マジックランプシアター(FP)

本来の区分だとアトラクションなので、コチラに区分。時間が決まっているわけではなく、ずっと公演され続けているショーの一つ。待つ室内でストーリーを聞かされて、そのストーリーに沿った舞台が展開される。ジーニーが出てくるも、外伝的なストーリー。3D眼鏡を公演中に装着し途中からはシアター上部にある画面を見ながら楽しむことになる。それなりに楽しいしオススメできる。FP対応だが、待ち時間が少ないのでご察し。海底二万マイル同様にFP自体やってない時も多い。

マーメイドラグーン内
マーメイドラグーンシアター

マーメイドラグーン内にある大きなシアターでアリエルとその仲間たちの舞台を見ることができる。数百人規模の大きなシアターなので、待ち時間は最悪でも公演一回分(20分)というのが持ち味でもある。上を見て、海に見立てた空中で繰り広げられるいきいきとしたキャラクターショーは見所満載。途中に出てくる悪役も巨大で迫力、雰囲気共に抜群。地上を舞うヒトデは格好良い。シアターに入ったら、宝箱の正面。入って正面奥を陣取りたい。電通大生としては、何故さっきまで日本語喋ってたのに、曲になると英語で歌い出すのかということを疑問視するのかもしれないが、気にしてはいけない。雰囲気を楽しむのだ。オススメのショー。FPの待ちを有意義に過ごせます。

ショー

ショーは一部を除き、基本的には一時間前ぐらいから席取りをしないと本当にいい場所では閲覧できません。なので、初回ディズニーの人にはチョッと敷居があります。朝のショーとかは割愛。挨拶なんてされても電通大生は喜ばないし、どう返事していいか分からない。

レジェンド・オブ・ミシカ

お昼のショー。タマゴを載せた幾つかの船と、ミッキーが乗る中央の船があり、それぞれメディテレーニアンハーバーの各所に配置され、ダンス等によって盛り上げます。音がキーになって、最後は手拍子なんかをゲストと一緒にしよう! みたいな感じになったりします。説明難しいな…。船から人やキャラクターが降りて来て場を盛り上げるのですが、ミッキーだけは陸に降りません。彼は特別です。このショーは大体14:00から行われます。以前から長い期間行われているので、TDSに行ったことある人は既にご覧になったかと思います。あ、そうだった電通生でしたね、ごめんなさい。

ファンタズミック!

夜のショー。魔法使いとなったミッキーの夢の世界?での出来事を最新の技術で演出する。ファンタズミック!では様々なプロジェクション技術を用いて、その演出を行う。例えば、気球?バルーン?に内側から映像を投影したり、霧を噴射して、霧に映像を投射したりと、理系的にワクワクする感じがあります。ミッキーの乗る船は円柱のようになっており、映像がその側面から流されます。その特徴から、正面でないとその映像の内容が殆ど分からないという欠点があります。本気でその映像を見たいなら、競争地区であるTDSの入り口正面を狙うのがオススメ。近くから単純に見たいのであれば、浮島のリドアイルを狙うのが良し。18:00からの開始が一般的。ショーが終わった後、花火があるので、いい場所を取ったのに焦ってそのまま帰らないこと。

テーブル・イズ・ウェイティング

アメリカンウォーターフロントにあるコロンビア号前で行われるショー。世界各国の食をディズニーのキャラクター達がおかしく紹介してくれる。人気はあまりなく、ショーが始まるギリギリ前に行っても席があったりするので、オススメ。様々な格好をした女性男性が踊りを繰り広げる。奇抜な衣装やそのデザイン性は一見の価値あり。また、座ってみる以外にも実が色んな場所で閲覧することができる。一度見たらそんな場所を探して見てみるのもいいかもしれない。

ミスティックリズム

自然の精霊に扮した人達が音に合わせ、水と炎を駆使して所狭しと駆けまわるショー。迫力満点で、アクロバティックな演出も見られる。よくもまあ、水滴で濡れた床の上で、あんなアクロバティックな動きができるもんだと、つい感心してしまう。人数がそれなりに入る劇場なので、開演ギリギリに行ってもなんとか間に合うケースが多い。場所はお察しな感じですが…。劇場は正面を取れなかったら、右手の席がオススメ。というかその順番で案内される。子供のウケはあんまり良くないかも知れないが、大人なディズニーを楽しむなら欠かせないショーの一つ。

ビッグバンドビート

アメリカンウォーターフロント内にあるブロードウェイ・シアターで公演されているブロードウェイミュージカル。実際に一部外国人がキャストに参加しており、その質の高さは折り紙つき。絶対に見たい公演。その雰囲気から、最後に登場するミッキーのマルチタレントっぷりは圧巻の一言。男性がディズニー好きになる瞬間はまさにココだろうと僕は個人的には思っている。ただし、注意点として、混雑が予想される日などには、ビッグバンドビートの一部席は抽選になる。メディテレーニアンハーバー内にあるビリエッテリーアという場所に行くと、人数を指定して抽選を行う。当たると券が貰えて待ち時間無しで見られるが、落ちる場合ももちろんある。落ちた場合、公演によっては2階席が自由席になる場合があり、抽選に落ちた人がブロードウェイ・シアター前で列を作る場合がある。混雑時だと、開演一時間前でもう人数一杯になり見られない場合がある。抽選で落ちた場合は一時間以上前から並んで見ることをオススメする。絶対に見ろ、いいな絶対だ。

お食事

食事は重要です。下手な場所を考えると時間を食ってしまうので、注意が必要。オススメのスポットを幾つか上げていきます。お昼は食べ歩きでもいいかもしれないので、正直どこでもいい。

ザンビーニ・ブラザーズ・リストランテ

安定。席数が広く料理も安定して美味しいし、値段もそこそこ。ただし、位置が悪いので、上手く移動アトラクションを用いて立ちまわることが重要

ニューヨーク・デリ

お昼をぱぱっと食べるなら、ここがオススメ。席数もまあまあ。位置がそこそこいい場所なので、混雑する時は素直に別の場所へ。

ホライズンベイ・レストラン

ファミリー向けな感じで夕食を食べるならここ。セットで色々な組み合わせを選択することができる。値段はそこそこ。

レストラン櫻

日本食のレストラン。夕食向けだと思う。安心して美味しいと思うのは日本人だからだろうか。並ぶので注意。プライオリティ・シーティングと呼ぶレストラン予約システムがあるので、スマートな電通大生を自称するなら使ってみよう。

セイリングデイ・ブッフェ

TDSにあるビュッフェ形式のお店。90分制。質も良く満足できること間違いないが、TDSまできてビュッフェ形式のお店に入ってたらふく食って動けないってなるのはかっこ悪いので注意。プライオリティ・シーティングあり。

おわりに

TDSは楽しんだもん勝ちです!!

彼女なんて必要なかったんだ!!!

Emscriptenの論文読んだ。Webの賢い選択。

大学院に入学するとともに、無職になりました。新しい仕事場を探しています!といってもインターン先ですが!という挨拶も程々に、Emscriptenの論文を読みましたので、その内容について少し。


JIT関連の論文を読んでいて、これは難しいと思い悩んできたところ、友達が卒研の参考文献であげていたプロジェクトがOOPSLAで発表した(正確にはSPLASH '11)よー、ということなので、じゃあこれしかないということで読み始めました。


サイトや論文は以下(正確には自分が読んだのはSPLASH '11版)
https://github.com/kripken/emscripten/wiki


Emscripten とは、LLVM-IR(LLVMにおけるプログラムの内部表現)をJavaScriptに変換するものです。前回の記事で投稿したものとは変換方向が逆になります。Emscriptenは、主に他の言語で書かれたコード資源をWebに移植使用という目的の元、制作が行われました。LLVM用のフロントエンドがある言語ならもちろん、それらの言語で書かれた処理系がある言語なら、Webで動作することがわかります。サンプルを見れば分かる通り、キャンバスを用いることで、ゲームを行ったり、PDFのレンダリング、レイトレースを行なっていたりもします。


論文には例があるので追ってみましょう。以下のC++のコードを変換していきます。

#include <stdio.h>
int main(){
    int sum = 0;
    for (int i = 1; i < 100; i++)
      sum += i;
    printf("1+...+100=%d\n", sum);
    return 0;
}


なんか、プログラムがちぐはぐだけど、あくまで変換する対象なので、どうでもいいとして、これをClangをもちいて、LLVM-IRに変換すると、以下のようなコードになります。たしか、$clang file.c -S -emit-llvm -o - とか打てばできます。clangが無いって? いやいや、何言ってるんですが、むしろ素のGCCなんてオワコンじゃないですか、せめてllvm-gcc使いましょうよ。ってことで、改めてLLVM-IRは以下のようになります。

@.str = private constant [4 x i8] c"%d\0A\00"

define i32 @main() {
  %1 = alloca i32, align 4
  %sum = alloca i32, align 4
  %i = alloca i32, align 4
  store i32 0, i32* %1
  store i32 0, i32* %sum, align 4
  store i32 1, i32* %i, align 4
  br label %2

; <label>:2
  %3 = load i32* %i, align 4
  %4 = icmp slt i32 %3, 100
  br i1 %4, label %5, label %12

; <label>:5
  %6 = load i32* %i, align 4
  %7 = load i32* %sum, align 4
  %8 = add nsw i32 %7, %6
  store i32 %8, i32* %sum, align 4
  br label %9

; <label>:9
  %10 = load i32* %i, align 4
  %11 = add nsw i32 %10, 1
  store i32 %11, i32* %i, align 4
  br label %2

; <label>:12
  %13 = load i32* %sum, align 4
  %14 = call i32 (i8*, ...)*
        @printf(i8* getelementptr inbounds
        ([14 x i8]* @.str, i32 0, i32 0), i32 %13)
  ret i32 0
}


なんて分かりやすい! というか、言語としての抽象度はCに毛が生えた程度で、非常に理解しやすいと思うのですがどうでしょう? LLVM論文ではMIPSライク! とか言ってましたが、アセンブラーから見ればなにいってんだ糞が! と言われても可笑しくありません。簡単に解説すると、Label2より前がfor文の初期化まで。Label2がfor文の分岐、Label5がsum+=i;、Label9がi++;をしている部分であり、Label12が最後の印字を行う部分です。そこまで分かると読みやすいとおもいます。必要な値をload命令でレジスタにロードして、それらを計算し、store命令でメモリに書き戻す。基本的に計算はこのパターンです。そして、さらにそれをEmscriptenでJavaScript(最適化無し)変換すると、以下のようになります。

function _main() {
  var __stackBase__  = STACKTOP;
  STACKTOP += 12;
  var __label__ = -1;
  while(1) switch(__label__) {
    case -1:
      var $1 = __stackBase__;
      var $sum = __stackBase__+4;
      var $i = __stackBase__+8;
      HEAP[$1] = 0;
      HEAP[$sum] = 0;
      HEAP[$i] = 0;
      __label__ = 0; break;

    case 0:
      var $3 = HEAP[$i];
      var $4 = $3 < 100;
      if ($4) { __label__ = 1; break; }
      else    { __label__ = 2; break; }

    case 1:
      var $6 = HEAP[$i];
    var $7 = HEAP[$sum];
      var $8 = $7 + $6;
      HEAP[$sum] = $8;
      __label__ = 3; break;

    case 3:
      var $10 = HEAP[$i];
      var $11 = $10 + 1;
      HEAP[$i] = $11;
      __label__ = 0; break;

    case 2:
      var $13 = HEAP[$sum];
      var $14 = _printf(__str, $13);
      STACKTOP = __stackBase__;
      return 0;
} }


このように、単純にメモリをHEAPという配列に仮想的に作成し、その配列内にデータを格納しています。また、制御においては、__label__変数と、while,switch構文により、LLVM-IRで見られたような構造が垣間見えます。このように、馬鹿丁寧に変換をまず行います。この後、HEAPを用いないように変数を書き換えたり、 Emscripten独自のRelooperアルゴリズムで以下のようなJavaScriptプログラムまで最適化します。

function _main() {
  var __label__;
  var $1;
  var $sum;
  var $i;
  $1 = 0;
  $sum = 0;
  $i = 0;
  $2$2: while(1) {
    var $3 = $i;
    var $4 = $3 < 100;
    if (!($4)) { __label__ = 2; break $2$2; }
    var $6 = $i;
    var $7 = $sum;
    var $8 = $7 + $6;
    $sum = $8;
    var $10 = $i;
    var $11 = $10 + 1;
    $i = $11;
    __label__ = 0; continue $2$2;
  }
  var $13 = $sum;
  var $14 = _printf(__str, $13);
  return 0;
}


色々冗長ですが、らしいプログラムまで変化しました。更にこのコードに既存のJavaScript最適化ツールである、Closure Compiler をかけてやると、不要な変数やコードの削除や、関数インライニング等、様々な基本的な最適化を施してくれます。結果、以下のようなJavaScriptにも変わります。

function K() {
  var a, b;
  b = a = 0;
  a:for(;;) {
    if(!(b < 100)) {
      break a
    }
  a += b; b += 1;
  }
  _printf(J, a);
  return 0;
}


ここまで変化すれば、元のプログラムと遜色ないといっても過言ではないでしょう。すごいEmscripten、これはいい!!


以上で変換の過程は終わりですが、余談として、1つ気になった点として、この関数は必ず同じ結果を返す関数であり、LLVMの最適化機構を用いて最適化すると、以下のようなコードになります。

@.str = private unnamed_addr constant 
[14 x i8] c"1+...+100=%d\0A\00", align 1

define i32 @main() nounwind uwtable {
  %1 = tail call i32 (i8*, ...)* @printf(i8* getelementptr 
    inbounds ([14 x i8]* @.str, i64 0, i64 0), i32 4950)
  ret i32 0
}


要するに何が言いたいかというと、アンローリングと定数伝搬を行えば、結果の定数値が求まり、そもそも計算する必要が無いということです。まあ、当たり前の結果なのですが、while,forの無限ループはアンローリングできませんし、Emscriptenのループの復元方法が若干あれな気がしてならないです。以上です! 公式サイトには WebGL等を用いた様々なデモがあります。Web系の人はぜひこのEmscriptenを使った、未来のWebを作ってみてください!!


以下使用例

物理エンジンを移植した例(With OpenGL
http://www.syntensity.com/static/box2d.html

様々な言語処理系を移植しWebで実行
(Ruby, Python, Lua...)
http://repl.it/#:languages

これが飲まずにやってられるかー!

この度、春から大学院生になるにあたり、ブログを書くことを決めたプログラマー「うるし」といいます。というのも、別に週何度も更新するつもりは毛頭無く、個人的なメモや思考を残し、かつ知りたい人の為に公開する目的です。

 

話は変わりますが、3月末をもって、今インターンとして働いている会社をやめることを考えています。いま振り返ると、やめる動機は「このままだと、ただ会社の良いように使われるだけで、自分自身の成長に繋がらない」と考えたからでした。会社の人達には数え切れない程の感謝があります。こんな、コピペプログラマーを大事に扱ってくれただけで感謝です。しかし、現状社内はiOSのプログラマーが不足していて、その案件が4月からも大量に僕に降ってきそうな予感がしていました。会社の歯車としての活躍が期待されていたわけです。

 

当然、どんな会社でも、個々の役割は歯車です。しかし、仮にも「インターン」として会社に在籍するにあたり「給料」よりも「成長」という要素が重要であり、「技術的な成長」を望んでいた僕にはミスマッチでした。給料よりも、様々な経験を積ませて貰える職場が僕には必要だったわけです。

 

そんな理屈を組み立てた一方で、何故、この会社だけ、妙に会社の歯車であることを意識させられるのだろうと考えました。それは単純な理屈でした。僕がやめる理由も恐ろしく単純でした、「あるべきものが当然のように無い」からでした。

 

今の会社に無いのは、社員同士の個々の繋がりです。要は、人としての繋がりが無かったということです。今の会社は遅型で12時から23時まで仕事をしています。不思議だとは思いませんか? インターンとして半年も一緒に働いている仲の良い学生達と、食事にも、飲み会にも一緒にしたことがないんです。

 

もちろん彼らのことは、ある程度理解はしていますが、僕は「仕事中の彼ら」しか知りません。半年間付き合っても、化粧を取った素顔の彼女を知らないのと同じ。そんな状態の人間関係だけというのは、非常に苦しいものがあります。

 

今の会社には言葉に尽くせない程感謝しています。だからこそ、このような環境の会社を放置しておくのはいけないと言いたい。

 

「これが飲まずにやってられるかー!」

 

そんな会社の社員を見て、今の会社は笑って言います。

「会社で好きな事をしてないんだな、可哀想に」

 

好きなことを仕事にして食べていけるのであれば、この世に仕事は存在しません。二律背反するその理は絶対であり、苦労しない仕事など無いのです。彼らが飲んでいる理由は簡単、友人等の他人と意気投合したいからです。会社帰りにお酒を買って、家で一人で飲んで、明日の元気は得られません。

 

会社のみんな、僕が退社する前に、ぜひ飲みにでも行きましょう!