admin

This user hasn't shared any biographical information


Posts by admin

[ネタバレ]インセプションみてきました

映画インセプションをみてきました。

CGを嫌うクリストファー・ノーラン監督のSF作品であり、いろいろと話題の映画です。

なにが話題かっていうと大きく分けて2つ。映像の迫力と内容の複雑さです。その内容の複雑さとは、説明が不十分であることも原因のひとつです。このエントリでは主に作品の夢に関する設定部分について、記憶をたよりにまとめていきたいと思います。メモを取る訳でもなく、一度見ただけですので勘違いも多々あると思われますがご容赦を。

以下ネタバレありです。

夢の中で夢を見て、さらにその世界でも夢をみる、夢の階層を軸としたSF映画。今いったい第何層にいるのかを認識しながら見ないと混乱してきます。また、その夢の世界を行き来するルールが作品中でじわじわと明らかになっていくために、見てる人はついていくのが精一杯になります。

ルール

  • 夢の中に入って、さらにそこでも夢の中に入れる
    例)第2層から第3層にいく
  • 1層深くなると脳の処理速度が20倍になるため、時間を20倍の長さに感じる
    例)第1層の1分は第2層の20分、第3層だと400分
  • 上の層に戻るためにはその層で死ねばよい
    例)第3層で死ぬ→第2層で目覚める
  • 上の層で刺激を受ける(キック)と下の層にいても目が覚める
    例)第2層で椅子から落ち水中に落ちる→第3層にいれば第2層で目覚める
  • 強力な薬の影響下では死んでも上の層で目覚めない→精神は虚無の世界へ

夢の中ではトーテムというアイテムを使い、自分が夢の中にいるのかどうかを判別します。コブ(レオナルドディカプリオ)のトーテムはコマ。

夢の世界へは専用の機械を使って行きます。アタッシュケースの機械からケーブルが伸び、それを手首に巻いてスイッチを押すと夢の世界へと意識がとびます。それ以上の細かい情報は劇中では語られません。夢の世界では誰かが中心となりほかのメンバーがその人の夢の中で活動することが出来ます。誰が中心となるかは指定できます。眠らされたのか、意識を持って眠ったのかによって夢の世界での認識・眠る前の階層の記憶の有無が異なります。夢の中では基本的には思い通りですし、年もとりません。ですが、夢と認識してないと年をとるのが当然と考えてしまい年をとってしまいます。中心人物が夢の世界を作るのですが、ゲストの意識も投影されます。

階層について

第1層:ユスフの夢(カーチェイス・橋)
第2層:アーサーの夢(ホテル・エレベーター)
第3層:イームスの夢(雪)
第4層:コブがモブと過ごした世界。
虚無:コブがモブと過ごした世界。

[推測]
虚無についてですが、薬の影響下で夢の中で死ぬと行く世界のようですが、深く深く階層を潜る事によって死ななくてもいけるようです。今回のミッション以前にコブとモルは深くもぐり虚無へとたどり着き、サイトー(渡辺謙)とロバート(社長の息子)は死ぬ事でたどり着いた世界のようです。その世界は現実世界での機械を共有していた為に虚無も共有されたようです。

嫁殺害について。

夫婦で夢の世界の奥深くへ潜っていったコブとモル(レオ様の嫁)。モルは現実の世界でも夢と区別がつかなくなり自殺。コブは殺人犯として追われる身となるが、かなりのトラウマを抱えることとなる。これは、夢の世界から帰りたくないと考えるモルに対して「これは現実ではない」というインセプションをコブが行ったために、現実の世界でも夢と区別がつかなくなったために自殺してしまったのです。

ミッション

    今回のミッションでは、第1層でロバートを誘拐し、第2層で夢の世界にいることを伝え信頼の獲得、第3層でインセプションを行うといったものになります。インセプションの影響で現実世界ではロバートが会社をつぶし、ライバル企業のサイトーはウハウハしたい訳です。嫁殺害として追われるコブは報酬としてそれをもみ消してもらって子供の待つ家に帰るためにミッションに挑みます。

    ところが、第3層にて大けがで死んでしまったサイトーと心配停止状態となってしまったロバートを救うべく、急遽コブとアリアドネ(設計士の女の子)は虚無へと向かいロバートを、一人虚無の世界に残ったコブがサイトーを助けます。

無事ミッションをクリアしたコブは家に戻り子供達と再会します。

戻りかた

落下の刺激によるキックによって戻ります。

[予定]

2層:エレベーター落下により雪山から戻す

1層:橋の上からの車両落下によりエレベーターから戻す

現実:飛行機の中

劇中ではこのような予定でしたので、階層順に戻っていかないと行けないルールのようです。つまりどの階層にいても現実で刺激を与えれば目覚めるっていうわけでもないようです。

ポイント

第1〜3層の敵はロバートの夢対策によるもの。

第1層の列車はコブのトラウマの投影。

サイトーがおじいさんになっていたのは、虚無を現実と信じていたため年を取った。

サイトーは虚無で若いコブと会い虚無と気づいて拳銃自殺→そのまま現実の体に戻る。

コブとモルが虚無で年をとらなかったのは夢と知っていたから。

サイトーがミッションについてきたのに理由はない、ただの観光のようなもの。

虚無ではロバートは飛び降りで死亡→第3層でAEDで心肺蘇生。

過去の部分ではモルはコブからインセプションを受け、2人で列車自殺。

モルは現実に戻っても夢と区別がつかなくなり投身自殺。

疑問点

後で追加していきます。

最後のシーン

最後のトーテムは回り続けるか止まるかは、あなたの想像におまかせします。

わかりやすい画像をみつけたので追加。

http://www.forevergeek.com/2010/07/inception_timeline/

5. Google App Engine for Python でテンプレートを使う。

今回はテンプレートの使い方を試してみます。

WEBサイトを作るにあたって、デザイン部分とプログラム部分をわけることは管理をするうえで非常に重要なポイントとなります。サイトがシンプルなうちはまだいいのですが、複雑になるにつれメリットは大きくなります。このテンプレート機能はかなり充実してますが、全部を把握しょうとすると訳がわからなくなりますので、今回も最低限の機能だけ押さえます。

どのように分けるかというと、テンプレート部分でHTML上に変化される部分を置き、プログラム部分でその値を動的に変化をさせます。今回の出力結果は前回とまったく同じです。


#templateモジュールをインポートします。
import os
from google.appengine.ext.webapp import template

import cgi
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.ext import db

class Message(db.Model):
  name = db.StringProperty()
  comment = db.StringProperty(multiline=True)
  date = db.DateTimeProperty(auto_now_add=True)

class MainPage(webapp.RequestHandler):
  def get(self):

    messages = db.GqlQuery("SELECT * FROM Message ORDER BY date DESC LIMIT 10")

    #テンプレート上で置き換える部分です。データストアの結果をそのまま使います。
    template_values = {
      'messages': messages
    }

    #テンプレートファイルへのパスです。
    #今回は同じディレクトリにindex.htmlというファイルをつくります。
    path = os.path.join(os.path.dirname(__file__), 'index.html')
    #template.render(テンプレートファイルへのパス, 変換する内容)という使い方です。
    self.response.out.write(template.render(path, template_values))

class Addcomment(webapp.RequestHandler):
  def post(self):
    message = Message()

    message.name = self.request.get('name')
    message.comment = self.request.get('comment')
    message.put()
    self.redirect('/')

application = webapp.WSGIApplication(
                                     [('/', MainPage),
                                      ('/add', Addcomment)],
                                     debug=True)

def main():
  run_wsgi_app(application)

if __name__ == "__main__":
  main()

続いて、テンプレートファイルの内容です。


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title></title>
  </head>
  <body>

      {% for message in messages %}
        {% if message.name %}
          {{ message.name|escape }} :
        {% else %}
          nanashi :
        {% endif %}
        {{ message.comment|escape }}
        ( {{ message.date }} )
        <br />
      {% endfor %}

    <form action="/add" method="post">
    <div>
        name<br />
        <input type="text" name="name" value=""></textarea>
    </div>
    <div>
        comment<br />
        <textarea name="comment" rows="3" cols="60"></textarea>
    </div>
    <div>
        <input type="submit" value="submit">
    </div>
  </form>
</body>
</html>

for message in messages という部分でデータストアでの検索結果について、ひとつづつループ処理をして行きます。内容は前回と同じですが、message.name がある場合はそのデータを、データがない場合はnanashiと表示します。|escape という部分はテンプレートの機能でページの表示を壊す可能性がある部分を置き換えます。

http://www.djangoproject.com/documentation/0.96/templates/#escape

ESCAPE
Escapes a string’s HTML. Specifically, it makes these replacements:

“&” to “&”
< to "<"
> to “>”
‘”‘ (double quote) to ‘"’
“‘” (single quote) to ‘'’

最後に投稿フォームを表示して完了です。

テンプレート部分を別にすることによってデザインとプログラム部分の分離ができました。これにより保守も楽にできるようになるのではと思います。

4. Google App Engine for Python のデータストアを使って簡単なゲストブックを作ってみる。

Google App Engineも第4回です、いよいよ今回はデータストアを使います。
しかし、Googleのドキュメントを読んでたのですが難しくてよくわかりません><

ですが最低限必要な知識だけでなんとか動くものを作る、それくらいだとなんとかなるものです。
本当に必要なものだけを使って簡単なゲストブックを作りたいと思います。ゲストブックに必要なものは「名前・コメント・時間」、これだけあればなんとかなります。目指すはこのシンプルなゲストブック!

スクリーンショット

Googel App Engineのデータストアでは、プログラムの中で定義をして利用するといった使い方になります。

それではデータストアに保存されるデータの定義部分です。

class Message(db.Model):
  name = db.StringProperty()
  comment = db.StringProperty(multiline=True)
  date = db.DateTimeProperty(auto_now_add=True)

db.Modelを継承したMessageクラスです。
また、データストアのデータオブジェクトをエンティティ、それぞれのデータの種類が設定された値をプロパティと呼びます。これらの用語の意味がわからないならスルーしても問題ありません。続けていくことによって、いつか「こういう意味なのか!」って瞬間がくるとおもいます。ぼくもよくわかってません><
StringProperty()、DateTimeProperty()などでそれぞれのデータを定義します。
multiline=Trueは改行を許可する、auto_now_add=Trueは現在時刻を自動で登録するなどのオプションとなります。

プログラムは、データとフォームを表示するMainpage部分とデータを追加するAddcomment部分です。


import cgi

from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app

#DBモジュールをインポートする
from google.appengine.ext import db

#モデル部分
class Message(db.Model):
  name = db.StringProperty()
  comment = db.StringProperty(multiline=True)
  date = db.DateTimeProperty(auto_now_add=True)

#データとフォームを表示する部分です。
class MainPage(webapp.RequestHandler):
  def get(self):
    self.response.out.write('<html><body>')

    #登録済みのデータの取得部分です。
    #SQLに似たGQLを使います、最新の投稿を10件取得します。
    messages = db.GqlQuery("SELECT * FROM Message ORDER BY date DESC LIMIT 10")

    #返って来たデータを一件ずつ処理して行きます。
    for message in messages:
      #もし名前が登録されていれば、その名前を表示。
      #登録されていなければnanashiと表示させます。
      if message.name:
        self.response.out.write('%s :' % cgi.escape(message.name))
      else:
        self.response.out.write('nanashi:')

      #コメントと日付を表示します 「名前:コメント(日付)」といったふうに表示されます。
      self.response.out.write(' %s ' % cgi.escape(message.comment))
      self.response.out.write(' (%s) <br />' % message.date)

    #登録済みのデータが表示されたら、フォームを表示します。
    #それぞれの項目名はモデルのname,commentと連動しています。
    self.response.out.write("""
          <form action="/add" method="post">
            <div>
                name<br />
                <input type="text" name="name" value="" cols="60"></textarea>
            </div>
            <div>
                comment<br />
                <textarea name="comment" rows="3" cols="60"></textarea>
            </div>
            <div>
                <input type="submit" value="submit">
            </div>
          </form>
        </body>
      </html>""")

#投稿されたデータをデータストアに登録する部分です。
class Addcomment(webapp.RequestHandler):
  #メソッドはPOSTです。
  def post(self):
    #messageはモデルクラスのインスタンスです。
    message = Message()

    #投稿されたデータを対応させます。
    message.name = self.request.get('name')
    message.comment = self.request.get('comment')
    #データの登録はput()だけですみます。すごい!
    message.put()
    #登録がすむと、通常ページにリダイレクトします。
    self.redirect('/')

application = webapp.WSGIApplication(
                                     [('/', MainPage),
                                      ('/add', Addcomment)],
                                     debug=True)

def main():
  run_wsgi_app(application)

if __name__ == "__main__":
  main()

データストアが出てくると、とたんに用語が増えて混乱してきます><
ですが、データを扱えるようになると世界が広がります。すこしづつ、すこしづつやって行きたいと思います。今回のエントリも用語の使い方について自信ありませんが、それでもなんとか動くものが作れました。まだまだGoogle App Engineの入り口にたったばかりです。なんとか、がんばります。

3. Google App Engine for Python でユーザからの送信されたデータを処理する。

google app engine。
3つめのエントリではユーザからの送信されたデータを表示するという単純なものです。
「<,>,&」が送信された場合に、そのまま表示してしまうとページが崩れてしまう恐れがありますので、pythonの標準ライブラリからCGIモジュールを使って置き換えをしています。

#pythonの標準ライブラリからcgiモジュールをインポートする。
import cgi

from google.appengine.api import users
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app

class MainPage(webapp.RequestHandler):
  #メソッドがgetの場合
  def get(self):
    #出力
    self.response.out.write("""
      <html>
        <body>
          <form action="/sign" method="post">
            <div><textarea name="content" rows="3" cols="60"></textarea></div>
            <div><input type="submit" value="Sign Guestbook"></div>
          </form>
        </body>
      </html>""")

class Guestbook(webapp.RequestHandler):
  #メソッドがpostの場合
  def post(self):
    self.response.out.write('<html><body>You wrote:<pre>')

    #cgi.escapeでポストされたcontentの「&,<,>」を置き換えて出力。
    self.response.out.write(cgi.escape(self.request.get('content')))

    self.response.out.write('</pre></body></html>')

#URLリクエストによって振り分ける。
#http://アプリケーションのURL/の場合はMainPage、
#http://アプリケーションのURL/signの場合はGuestbook。
application = webapp.WSGIApplication(
                                     [('/', MainPage),
                                      ('/sign', Guestbook)],
                                     debug=True)

def main():
  run_wsgi_app(application)

if __name__ == "__main__":
  main()

CGIについてはpythonのサイトに詳細が載っています(英語)。
http://docs.python.org/library/cgi.html

Convert the characters ‘&’, ‘<' and '>‘ in string s to HTML-safe sequences. Use this if you need to display text that might contain such characters in HTML.

get()とpost()の2つを定義することで、それぞれのリクエストメソッドに対応した動作をすることが出来ます。

このデータをDBに登録すると、例えば掲示板やチャットのようなアプリケーションが作成できます。

2: Google App Engine for Python でUsersライブラリを使ってみる。

前回からだいぶ時間が空いてしまいました><
趣味のひとつとして、無料で遊べるGoogleAppEngineでプログラミングの勉強をしていきます。まったくわかんない状態からなんとか頑張ります。今回はUsersライブラリについて。

Google App Engine はUsersライブラリを利用すると Google Acountと連携できます。
Googleの解説ページを見ながらさっそくやってみます。
http://code.google.com/intl/ja/appengine/docs/python/gettingstarted/usingusers.html

Userライブラリはローカルの場合はテスト用の動作になるので注意が必要です。

#usersライブラリを使えるようにするためにインポートする。
from google.appengine.api import users

from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app

class MainPage(webapp.RequestHandler):
  def get(self):

    #get_current_user()はGoogleにログインしていればUserオブジェクトを返す。
    #ログインしてなければNoneを返す。
    user = users.get_current_user()

    if user:
      #ログインしている場合

      self.response.headers['Content-Type'] = 'text/plain'
      #user.nickname()はニックネームです。
      #アカウントのメールアドレスとアプリケーションのドメインが一致しているかどうかで値が変わる。
      self.response.out.write('Hello, ' + user.nickname())

    else:
      #ログインしていない場合はログインページへとリダイレクトする。

      #self.request.uriを指定することで、ログイン後にこのページへと戻ってくる。
      self.redirect(users.create_login_url(self.request.uri))

application = webapp.WSGIApplication(
                                     [('/', MainPage)],
                                     debug=True)

def main():
  run_wsgi_app(application)

if __name__ == "__main__":
  main()

Userには次のメソッドがあります。

  • nickname()
  • email()
  • user_id()

nickname()はアプリのドメインとメールアドレスのドメインが同一かどうかで返す値が変わります。同一の場合は@の左側のみ、異なる場合はメールアドレス全体が返ってきます。
email()はメールアドレスが返ってきます。
user_id()は一意のIDを返します、これはユーザがアドレスを変更した場合でも変更されません。

Usersライブラリを利用すると、簡単にGoogleAcountを利用したサービスの作成が可能となります。

次:3. Google App Engine for Python でユーザからの送信されたデータを処理する。

ちゃんぽん@長崎亭。

tohima posted a photo:

ちゃんぽん@長崎亭。

うまー!560円。

蒸した。魚とパプリカ。

tohima posted a photo:

蒸した。魚とパプリカ。

マヨネーズと味ぽんでいただきます。

ラーメン!ラーメン!

tohima posted a photo:

ラーメン!ラーメン!

沖食堂@久留米。これで380円とか安すぎ><

ひまわり買ってきた。夏が部屋を彩る。

tohima posted a photo:

ひまわり買ってきた。夏が部屋を彩る。

すてき。こないだ買ってきたのは枯れたから捨てる。なんで枯れるの。

ひまわり買った。

tohima posted a photo:

ひまわり買った。