日記

更新頻度はあまり高くはありませんがネタがあったら書いていこうと思います。

映画 ターミネーター: ニュー・フェイト 感想(ネタバレあり)

先日ターミネータの新作を見てきてすごく面白かったから、どこが面白かったかを書きたいと思います。

登場人物が役に見事にハマっている。

特にハマっていたのは未来から来た強化人間グレースを演じたマッケンジー・デイヴィスと今作の敵キャラのREV-9を演じたガブリエル・ルナが本当にはまり役でした。

マッケンジー・デイヴィスは体型、髪型、服装、メイクがすべてグレース役にピッタリでまさにはまり役だと感じました。
特に髪型は長い髪の映像も見ましたが、あの役の髪型のほうが似合ってると思いました。また、身長も高く、ダニー役の女優との対比でとても強そうに見えました。

次に敵役のガブリエル・ルナは人間のふりをしているときと戦っているときのギャップがとても良かったです。特に、最初の玄関先での挨拶シーンは本当にいい笑顔過ぎてびっくりしました。ターミネーター2のT1000も一般人になりすますシーンが有りましたが、より人間的というかフレンドリーでそのギャップが逆にサイコパス感を演出していて良いと思いました。

アーノルド・シュワルツェネッガーリンダ・ハミルトンの演技。

どっからどう見てもおじいちゃんとおばあちゃんでしたが、貫禄のある演技でかっこいいと思いました。
T1では敵でT2では味方と因縁の関係ですが、喧嘩しながらも仕方なく共闘しているという微妙な空気感がとても良かったと思います。
しかし、ターミネーターと家族同然に付き合えるようになるとは驚きましたね。

あと、敵のREV-9の2体に分裂して戦うという発想も面白いと思いました。

ストーリーはともかく、出演者を好きになれるかで評価が変わる映画なのかなと思いました。

映画 天気の子 感想 (ネタバレあり)

本日、映画 天気の子を見てきましたので、感想を書きたいと思います。ネタバレがありますから、見ていない方はブラウザバックをお願いします。

全体的には面白かったです。しかし、ストーリーの部分で君の名は。を超えられていないと感じました。
作画とか演出にこだわる人はそれだけで見る価値はあると思います。
特に背景の描写が素晴らしかったです。東京に住んでいる人はよく分かると思います。あと、雨のシーンが多かったですがそこも良かったです。
また、演出も良かったです。普通の会話だけではなく印象深い心の声があるところとかが新海監督っぽくてよかったです。
音楽との組み合わせも良かったです。

ただストーリーに関しては無難でしたが、最後が微妙だと感じました。
大体の流れは、題材が違うだけでほぼ君の名は。と同じに感じました。

  1. 出会う。
  2. 盛り上がる。
  3. 消える。
  4. 再開する。

という流れですね。
ただ君の名は。と違うところは最後が完全なハッピーエンドではないと感じてしまったところです。
ここは見る人にとって意見が分かれるのではないかと思います。

映画の最後で「僕らは大丈夫」というセリフがありますが、「おめぇらは大丈夫でも東京は大丈夫じゃねーだろ」と突っ込みたくなりました。
現実主義者なので考えてしまうのですが、首都圏水没で毎日雨とか大災害もいいところだろう笑 被害総額何億円だよ。
しかもそれを主人公の判断でやってしまうという…
更に女が消えた原因も調子に乗って能力使いまくったからという。
まぁ、それだけ自分が必要とされていることが嬉しかったんでしょうけど。ここはこの映画で描きたかったことの1つだと感じました。
要は、親を失って生きるための生活を強いられていたところに、主人公が人のために自分の能力を使える場を作ってもらえたという展開ですね。
ここは共感できました。

しかし、親が死んだところの詳細がなく、どういう状況だったのかわかりませんが、普通中学生で児童養護施設に行かないで働くことになりますかね。
なにか理由があったのならちゃんと映画にうつしてほしかったです。
そこを指してもともと狂ってるって言ってたのかな?

もう少しいいまとめ方はなかったんでしょうか…
君の名は。の時間トリックがよかっただけにそこがちょっと残念でした。

本田翼についてはそこまで違和感はありませんでした。多分PVのところは本編で嘘をついているところなのでそこだけ取り出したせいで変な感じに写ったのだと思います。

まとめ

1人の人間のために大勢を犠牲にするか、大勢の人間のために1人が犠牲になるかというお決まりの展開で、
この映画では1人の人間の方を取った形で、大勢に被害はあったが意外とうまく行っているという曖昧なまとめ方になってしまっています。

しかし、よくよく現実的に考えてみると実際にそのような状況(首都圏水没)になったときに、私自身が「本当に意外とうまくいくか?」という疑問を持ってしまいました。
そう疑問に思わない方にはハッピーエンドなのかもしれませんが、私にはどうしてもすべてがハッピーではなかったのではと感じてしまいました。

PS.
映画館で隣の人が汗臭くて辛かったです。至近距離で2時間耐久は流石に辛いです…
明日は我が身で気をつけなければならないと感じました。

docker-composeでLet's Encrypt SSL,HTTP2通信対応Nginxリバースプロキシサーバを構築する

お久しぶりです。

最近CoreOSのサーバを構築しました。WebサーバとしてNginxを動かしたのですが、docker-composeを使った方法がすごく簡単にLet's Encryptを使ったSSL対応のNginxを動かせたので皆さんにも使っていただきたく記事にしました。

Let's Encryptは無料のSSL証明書で簡単にサーバをSSL対応できますが、証明書の更新をcronに登録したり、ドメインごとに設定しなければならず少し面倒でした。しかし、Dockerを使えば自動的にこれらの作業を行わせることができます。Nginxの設定を自らいじる必要もありませんでした。

それでは、手順を紹介したいと思います。

リポジトリのクローン

まずこちらオープンソースをクローンします。

git clone https://github.com/evertramos/docker-compose-letsencrypt-nginx-proxy-companion.git

以下のdocker-compose.ymlが今回利用するものです。

version: '3'
services:
  nginx:
    image: nginx
    labels:
        com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy: "true"
    container_name: nginx
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ${NGINX_FILES_PATH}/conf.d:/etc/nginx/conf.d
      - ${NGINX_FILES_PATH}/vhost.d:/etc/nginx/vhost.d
      - ${NGINX_FILES_PATH}/html:/usr/share/nginx/html
      - ${NGINX_FILES_PATH}/certs:/etc/nginx/certs:ro

  nginx-gen:
    image: jwilder/docker-gen
    command: -notify-sighup nginx -watch -wait 5s:30s /etc/docker-gen/templates/nginx.tmpl /etc/nginx/conf.d/default.conf
    container_name: nginx-gen
    restart: unless-stopped
    volumes:
      - ${NGINX_FILES_PATH}/conf.d:/etc/nginx/conf.d
      - ${NGINX_FILES_PATH}/vhost.d:/etc/nginx/vhost.d
      - ${NGINX_FILES_PATH}/html:/usr/share/nginx/html
      - ${NGINX_FILES_PATH}/certs:/etc/nginx/certs:ro
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - ./nginx.tmpl:/etc/docker-gen/templates/nginx.tmpl:ro

  nginx-letsencrypt:
    image: jrcs/letsencrypt-nginx-proxy-companion
    container_name: nginx-letsencrypt
    restart: unless-stopped
    volumes:
      - ${NGINX_FILES_PATH}/conf.d:/etc/nginx/conf.d
      - ${NGINX_FILES_PATH}/vhost.d:/etc/nginx/vhost.d
      - ${NGINX_FILES_PATH}/html:/usr/share/nginx/html
      - ${NGINX_FILES_PATH}/certs:/etc/nginx/certs:rw
      - /var/run/docker.sock:/var/run/docker.sock:ro
    environment:
      NGINX_DOCKER_GEN_CONTAINER: "nginx-gen"
      NGINX_PROXY_CONTAINER: "nginx"

networks:
  default:
    external:
      name: webproxy

必要であれば、編集してください。
自分は使っているdocker-composeがバージョン3に対応していなかったので、version: "2"にして、CoreOSは自動アップデートのときに再起動を行うので、restart: unless-stoppedrestart: alwaysに変更しました。

Dockerネットワークの作成

次にnetworkを作成します。

docker network create webproxy

設定ファイルの用意

.envファイルを用意する。 docker-compose.ymlと同じディレクトリに以下の内容の.envファイルを用意します。

NGINX_FILES_PATH=/path/to/your/nginx/data

これはdocker-compose.ymlの環境変数を設定するためです。このパスにはnginxの設定ファイル等が保存されます。

コンテナ起動

コンテナの起動 コマンドを入力してコンテナを起動しましょう。

docker-compose up -d

これでLet's EncryptによるSSL対応のNginxリバースプロキシサーバの起動できました。このコンテナでは証明書の自動更新なども行ってくれるので自分で設定する必要はありません。

ブラウザでサーバにアクセスするとNginxの503エラーページが表示されるはずです。

アプリケーションサーバの用意

次に動かしたいWebアプリのサーバを作成します。 こちらもdocker-composeで動かすようにします。Dockerfileはご自分で作成してください。注意点としては80番と443番のポートをEXPOSEしてください。あとAPPサーバは80番、または443番をListenするようにしてください。

EXPOSE 80 443

そして起動するためのdocker-composeファイルを作成します。例えば以下のように作成します。アプリに応じてDBサーバの設定などを書いてもいいです。

version: "2"
services:
  app:
    build: .
    command: /app
    environment:
      - VIRTUAL_HOST=example.com
      - LETSENCRYPT_HOST=example.com
      - LETSENCRYPT_EMAIL=example@example.com
    restart: always

networks:
  default:
    external:
      name: webproxy

必ず設定しなければならないのは、環境変数VIRTUAL_HOST,LETSENCRYPT_HOST,LETSENCRYPT_EMAILと、Docker ネットワークの設定だけです。

アプリケーションサーバの起動

docker-compose up -d

アプリケーションサーバを起動すると、自動的に先程起動したNginxコンテナが起動を検知しLet's Encryptの証明書を取得し、Nginxの設定ファイルを生成します。これは先程設定したNginxの設定ファイルのディレクトリを見ればわかります。

しばらくまって、ブラウザでドメインにアクセスするとSSL通信できるようになっています。

まとめ

以上でNginxのSSL対応リバースプロキシサーバとアプリケーションサーバが構築できました。また別のサービスを立ち上げた時は、docker-composeファイルを作れば、リバースプロキシやSSLの設定は自動的に行なってくれるのでとても簡単です。是非使ってみてください。

追記

ちなみに通信はHTTP2になるようです。

コマンドの終了をSlackに通知するコマンドを作った。

コマンドの終了をSlackへの投稿で知らせるコマンドを作りました。DeepLearning等の機械学習の学習はとても時間がかかり、GPUを使っても数時間かかるのが当たり前なので終了通知を何らかの方法でうけとりたい。そこでSlackでその通知を受け取れるようにした。

使い方は簡単、まずホームディレクトリに.exslackrcというファイルを作成し以下のように書き出す。

{
  "webHookURL": "https://hooks.slack.com/services/X..../Y....",
  "destination": "@rompei",
  "logFile": "/home/rompei/joblog.txt"
}

webHookURLはSlackのincoming-webhookのURLで、destinationは通知したいユーザかチャンネル。もしコマンドの出力が必要ならlogFileを設定すればコマンドの出力をそのファイルに出力してくれる。またlogFileコマンドラインオプションの-logでも設定できる。

そして実行しいコマンドが並んだファイルを作成する。

./test1.sh xyz
./test2.sh abc

あとはコマンドの並んだファイルを引数にして実行するだけ。

Command ./test1.sh started on 2016-06-26 15:16:19.363573005 +0900 JST is done in 5.61877ms

Command ./test2.sh started on 2016-06-26 15:16:20.761145297 +0900 JST is done in 10.125984ms

このような感じでSlackに通知が来る。
また、ログファイルを設定すると

exslack: 2016/06/26 15:16:19 Command ./test1.sh started on 2016-06-26 15:16:19.363573005 +0900 JST is done in 5.61877ms

 == Output start == 

test1 test1arg1


 == Output end == 

exslack: 2016/06/26 15:16:20 Command ./test2.sh started on 2016-06-26 15:16:20.761145297 +0900 JST is done in 10.125984ms

 == Output start == 

test2 test2arg1


 == Output end == 

こんな感じで出力を確認ファイルから確認できる。

github.com

ディープラーニングで画像を超解像するwaifu2xをGoで実装してみた。

Web+DBとい雑誌で少し前にディープラーニング入門の記事があったので読んでいたら、waifu2xというディープラーニングの技術を使って画像の解像度を上げるソフトウェアがあることを知りました。

このソフトウェアの様々な言語での実装ができていたので、今回はGoで実装してみることにしました。実装した部分は学習済みモデルを使って画像の解像度を上げる部分です。

参考にしたプログラムはPythonで書かれているこれを使わせて頂きました。ただ本家と1つだけ違うのは畳み込みではなく自己相関関数を使いました。これが利用したモデルです。本家のLuaで書かれたwaifu2xを使うと新しいモデルを作れるみたいです。このモデルは本家のものとニューラルネットの形状が若干違っていて、最初の入力が本家のものはRBG(三原色)の3チャネルなのに対し、Python実装のものはY(輝度)の1チャネルになっていました。

Pythonと違い数値計算ライブラリが発展途上のGoなので結構たいへんでした。行列演算にはgonum/matrixというGoogle製のオープンソースを使いました。
画像は本家のものと同じmiku_small.pngを使い。

f:id:PeeeeRON:20160223182525p:plain

これを2倍に拡大しました。
まずは普通に近傍補完法で拡大した画像がこちらです。

f:id:PeeeeRON:20160223182652p:plain

明らかにジャギっています。
次にwaifu2xで拡大したものです。

f:id:PeeeeRON:20160223182745p:plain

若干縁のギザギザが小さくなっているのが分かります。
なぜか保存してみると画像が左上に移動してしまっていますが、超解像に成功しています。
コードはGithubにあります。

github.com

画像が左上のずれるバグが直っていないので、プルリク送って頂けると助かります。

↑治しました。