観客たちは打ち上げ花火を正面から見たかった。

 『打ち上げ花火、下から見るか? 横から見るか?』の劇場アニメ版を見てきた。
 1995年版の実写映画をhuluで配信していることもあり、実写版を予習しての鑑賞だった。
 
 先に僕の立場を明らかにしておくと、実写版の方が好きだ。
 これはどちらがより優れているということではない。芸術作品に客観的な優劣をつけるのはおよそ不可能だろう。だが、少なくとも僕の中では実写版の方が好きだったということだ。

 以下、自分がなぜそう思ったのかを考えてみたいと思う。重大なネタバレを含むことを予め言っておく。

 

 今回のアニメ版が賛否両論あることは知っていた。

 思うに、きっと多くの否定的な観客は花火を見に来たのである。

 

 アニメ版『打ち上げ花火』において、カギとなるのは何といってもあの石である。これは実写版にはない要素であった。主人公の島田典道は劇中で何度も石を投げる。「もしも、あのとき、こうなっていれば」と思いながら美しい紋様の入った石を投げると石の中で「if」の形をしたフィラメントが輝き、その分岐点へと戻ることができるのだ。
 だが、それは「現実」ではない。物語の中で、典道は「違う世界」と表現している。
 そして、典道は「違う世界」をヒロインの及川なずなと一緒にいるために作り出した。

 個人的な考察として、「違う世界」を「典道の空想」と捉えるか、「確かに存在する別の現実」と捉えるかによって、物語に対する解釈は大きく変わってくると思う。
 前者は「時間など戻るわけはない」という現実主義である。これは身も蓋もない。映画というのはそもそもフィクションであるため時間が戻ってもいい。この説を採用してしまうと前半、なずなが母親に手を引かれ、典道が「ちくしょう、あの時勝っていれば」からすべて空想ということになってしまう。
 それに、電車の中でなずなが典道の知らないはずの転校について語っていたことも矛盾する。
 このなずなは本当のなずなと捉えるしかない。
 
 だが、僕は典道の空想の方がよいのではないかとさえ思う。
 後者では都合がよすぎるからだ。

 後者ならば、典道は本当に別の現実に行ったのだ。記憶を引き継いだまま。
 最後に石が砕ける。そこには最初に水泳で典道に勝った安曇祐介がなずなと楽しそうに夏祭りを楽しんでいる姿も見える。きっと祐介がなずなを裏切らずに祭りに行った現実なのだろう。
 東京に行った未来も見える。二人で仲良くデートしている未来も。
 石によって見えた未来なのだから、きっと石を投げ続けていれば東京に行けたのかもしれない。
 なずなは最後に「次はどんな世界で会えるのかな」という。きっと「もう現実では会えない」ということの裏返しなのだろう。水面下から、ぼやけた花火を見て、そしてなずなは去る。おそらくこのぼやけた花火は本物の花火だ。本当の現実だからこそなずなは去って行ってしまう。

 なにが都合がよいのか、切ないエンディングではないか。
 それはやはり石の存在である。
 電車が急に海の上を走りださず、典道が石を投げ続けて東京に行って幸せに暮らすような展開になったとしたら最悪のご都合主義になってしまうが、石が砕かれなければそうなっていたかもしれないのだ。
 あるいは、最後に典道が教室にいなかったことから、最後の世界は駆け落ちが成功した世界なのかもしれない。

 また、石は砕けるまで典道の思うままに機能した。たとえ元に戻らなくてはいけなくとも、ありえないはずの現実を望むなんて卑怯なことだ。『時をかける少女』では回数制限により本当に必要な時に使えないという罰がある。だが、『打ち上げ花火』には罰が存在しない。石を使うことによる負の面の描写が全くない。卑怯なままの主人公に共感することはできない。
 


 話は戻る。
 きっと観客は物語と同時に花火を見に来たのだ。

 花火というのは花火大会で一時間そこらの短い時間、はかない美しさ、はかない夏、はかない恋を思って楽しむもの、というステレオタイプがある。観客はそのはかなさを求めて劇場へ足を運んだのである。
 だがしかし、結局最初から最後まで、花火は現実かどうかの判断方法としてしか使われなかった。
 これがこの作品の文学性を高めているところだろうし、おそらく観客が最も不満に思っていることだろう。
 
 映画では本物の打ち上げ花火を楽しませてはくれなかった。平べったい花火、変な形の花火、水でぼやけた花火。
 これは典道が石を投げて違う世界に行ってしまったためだ。なんの努力もせず、石を投げただけの卑怯な主人公。それも一度きりでなく、想定どおり行かなくなるたびに投げる。そのたびに今度は本物の花火を見られるのだろうか、と期待する。だが、結局見ることはできない。


 キャラクターに共感できず、切ない気分で花火を見ることすら叶わなかった観客が「つまらなかった」というのも無理はないことに思う。

 


 ここまで、散々に言っているが、実は僕はこの映画を楽しめた。
 それは実写版との違いを見比べるということでもそうだし、シャフトの映像表現も好きだし、詳しく語られないことを補完するという楽しみも十分にあった。


 では、ここからなぜ実写版の方が好きだと感じたのか、述べていく。
 ここからは実写版のネタバレも含むので、注意してほしい。

 


 実写版は「if もしも」という短編連作ドラマの一つとして撮影された。
 おそらくアニメ版とのもっとも大きな違いは、典道が負けた場合と勝った場合がどちらも純然たる現実であったことである。
 記憶の共有はないし、結局どちらが正しいということはない。
 そして、アニメ版の石のような魔法のような存在はない。
 登場人物は冷酷な現実を歩く。

 そのため、なずなの「東京に行って水商売でもする」というフィクション性を大きく高めているのだ。
 実写版ではなずなは初めから電車に乗る気などなかった。
 駆け落ちをするという夢物語は帰りのバスが来るまでの、現実への小さな反抗だったのである。そのため、なずなは切符すら買わずに電車が来ても「あ、帰りのバスが来てる」と言ってあっさりと帰ってしまう。

 アニメ版ではどうか。
 あの石がある。石自体が大きなフィクションになっているせいで、東京に行って水商売とかアイドルをする、というのが現実感を帯びすぎてしまう。
 中学生(実写版では小学生)が駆け落ちをするなんて、それだけでフィクションなのだ。それをわかっていて、なずなはそもそも電車には乗らない。

 実写版では自分が転校することさえ典道に言わなかった。
 なずなは典道にこう言う。

「今度会えるの二学期だね。楽しみだね」
 
 なずなは典道に再び夢物語を語るのだ。

 どういう気持ちでこの言葉を口にしたのか。茶目っ気なのか、自分の寂しさをごまかそうとしたのか、典道に楽しみだと思っていてほしかったのか。わからない。だが、切ない。途方もなく切ない。
 現実を自分だけで受け入れており、それはなずなと観客しか知らない。

 最後には花火が上がる。すでに典道はなずなと別れ、典道は下から、灯台へ行ったほかのメンバーは横から、花火を見る。
 切ない花火だ。典道はなずなともう会えないことを知らない。


 完璧な構成であると思う。

 

 最後に僕の感想として、これは少年少女が現実を知る物語なのだ。
 子供の力ではどうしようもない現実。

 

 花火はどこから見ても絶対に丸いし、子供はどんなに背伸びをしても絶対に子供なのである。

ソフトウェア第二のまとめ4/10~24

ソフトウェアの授業で学んだことを備忘録的にまとめます。

4/10 Linuxの使い方

  • Terminal
    Terminalの立ち上げは[Ctrl]+[SHIFT]+[T]

  • shellコマンド
    リダイレクト: 標準入出力をファイルから、あるいはファイルへ行う
      command > file でfileに標準出力(上書き)
      command >> file でfileに標準出力(追加)
      (標準エラー出力も共に切り替えるためには >&, >>& とする)
      command < file でfileから標準入力
      
    パイプ: 標準出力を別のコマンドの標準入力へ接続する
      command1 | command2 | …

  • Emacs, vi の使い方、ショートカットキー

  • Java, Perl, Python, Go のサンプルプログラム

  • Makefile の基本的な使い方

4/17 デバッグ

  • コメントを付ける

  • インデントをする

  • プリント文デバッグ
    正しくプログラムが動いているか、print文で記述する。
    print文を削除するためにプリプロセッサを用いるか、コマンドラインスイッチを用いる。

プリプロセッサ

//コンパイルの際に gcc -o test -DDEBUG test.c などとすると...部分が実行される。
#ifdef DEBUG
...
#endif

コマンドラインスイッチ

//実行の際に ./test -d などとすると...部分が実行される
int Debug = 0;

int main(int argc, char *argv[]){
    while(( argc > 1 ) && ( argv[1][0] == '-' )){
        switch (argv[1][1]){
        case 'd':
            Debug = 1; break;
        }
        argc--; argv++;
    }
    
    if(Debug){
        ...
    }
}
  • 対話型デバッガを利用する
    コンパイルの際に -g オプションを付けてgcc -o test -g test.cコンパイルする。
    デバッガを呼び出すときはgdb ./testとすると、行頭に(gdb)と表示されるプロンプトが出てくる。以下、コマンドを示す。
     run: 実行
     bt: 呼ばれた関数をバックトレースすることでプログラムの停止位置がわかる。
     up: 停止位置から関数をさかのぼっていく。
     break (関数名): 関数にブレイクポイントを設定する。この状態でrunをすると設定したブレイクポイントで停止し、print (変数名)で変数に代入されている値を見ることができる。
     next: ステップ実行する。(ステップの単位がよくわからない)
     continue: ブレイクポイントで止まっていた実行を再開する。再びブレイクポイントに差し掛かるとまた停止する。

  • 告白的方法によるデバッグ
    他人にプログラムを説明して解決(しばしば自己解決)する。

  • タイピングソフトtrrの導入
    Emacs用のタイピングソフトtrrを利用してタイピングを早くする。

4/24 EmacsEmacs Lisp

  • バッファとミニバッファの利用
     Emacsを起動すると*scratch*というバッファが起動する。これはLispインタプリタとなっている。実行は行末で[Ctrl]-Jを打ち込む。
     setq: 変数宣言、代入
     defun: 関数の定義。(defun <関数名> (<引数>) <処理>)の形で定義する。
     cond: 複数の条件分岐をする場合に用いる。(cond (<条件1> <処理1>) (<条件2> <処理2>) ... )という形で用いる。常に条件を成立させるためには<条件>をtとする。
     if: 場合分けが二つの場合に用いる。(if <条件> <条件が真のときの処理> <条件が偽の時の処理>)の形で用いる。

  • 線形再帰と線形反復
    線形再帰再帰の元の関数へ収縮しなければ戻り値を渡せないもので、後で実行するものを覚えておかなければいけない。
    線形反復は渡された値から最終的な戻り値が導けるため、覚えておくべき変数が少ない。

  • スコープ
     let: (let (<ローカル変数の定義>) <処理>)の形で用いる。このローカル変数はletの内側でのみ値を保持する。

  • 反復プロセス
     while: (while <条件> <処理>)の形で用いる。  do: (do (( i 0 (+ i 1))) ( >= i 4 ) <処理>)のような形で用いる。Emacs Lispで用いるためには(require 'cl)とする必要がある(らしい)。  dotimes: (dotimes (i 4) <処理>)のような形で用いる。

  • 非ローカル脱出 catch と throw
    (catch <タグ> <処理>)(throw <タグ> <戻り値>)の形で用いる。catchの処理の中で同じタグを持つthrowが出てきたとき、catch の戻り値はthrowの戻り値となる。タグは'(タグの名前)と書く。ここで、'(quote関数の略記)は評価しないことを指示する(らしい)。参考
    同じタグを持つthrowが出てこなかったときは、処理の最後に出てきたタグの名前を返すのだろうか? よくわからない。

  • 無名関数、クロージャ
     lambda式: 名前を持たない関数を定義できる。(lambda (<引数>) <処理>)の形で用いる。
    (setq f #'(lambda ...))や、(funcall #'(lambda ...))など#‘(fanction関数)を用いて評価しないことを指示する。役割としてはquote関数と同じだが、コンパイルするときに便利(らしい)。さらに言えばlambdaはquoteする必要がない(らしい)。参考
    また、funcallは関数を呼び出す関数で基本的にquoteを付けて利用する(らしい)。

  • 手続きの抽象化
    関数を作ってブラックボックス化することで利用しやすくする。
    手続きを扱う手続きを高階手続きという。

  • データの抽象化
    データを組み合わせた合成データを作ることでデータを抽象化する。(具体的には線形結合において、有理数複素数多項式など、さまざまな種類の線形結合を一つの関数で行えるようにできるなどのメリットがある)

  • List
    Emacs Lispでは、
     car: リストの第一要素を取り出す。
     cdr: リストの第一要素を除いたリストを返す。
     cons: リストの合成を行う。(cons 1 '(2 3 4))などの形で用いる。この例では(1 2 3 4)を返す。
     reverse: リストを非破壊的に逆順にする。
     nreverse: リストを破壊的に逆順にする。
     dolist: リストの要素を順にとる。(dolist (x '(1 2 3 4)) <処理> )などの形で用いる。
     mapcar: リストの要素に対し、それぞれ関数を適用する。(mapcar #'car '((1 2) (2 3)))のような形で用いる。pythonでは同様の関数としてmapが存在する。
     reduce: 二つの引数をとる関数を利用して、リストの要素に対して前から順に畳み込みをする。
     mapcan(Emacs Lispでは cl-reduce, cl-mapcan): 引数のリストに対して関数が返した要素のみから新たなリストを作る。pythonではfilterと呼ばれる。

 全然まとめ終わらなくて非常につらいです。

ご挨拶

saramechです

 機械を作ったり情報を操ったりする大学生をしています。

 もうすぐ夏休みなので、長期休暇中のモチベーションを保つためにブログでもやるかと思い立ち、始めることにします。

 おそらくプログラミング関連の話題が多いと思います。
 あとは思ったこととかを唐突に書くかもしれません。

 よろしくお願いします。