2020年10月28日水曜日

劇場版ヴァイオレット・エヴァーガーデン見た感想

ヴァイオレット・エヴァーガーデン、すごく評判良くて
映画館とか5年くらい行ってないので久しぶりに行くかー
と思ってたので先週末見に行きました。


結論から言うとかなりよかったです。

久しぶりの映画館は鬼滅の刃ばっかりやっていて鬼滅キッズで溢れていてロビーが密でした。
僕が入ったシアター自体はちょうど埋まってる座席がちょうど半分くらい。
快適に見ることができました。

映画の設定ですが、
舞台は外国のどこかで、ヨーロッパのどっかなのかなーみたいな景色でした。
主人公のヴァイオレット・エヴァーガーデンさんは郵便局に務め、
当時の識字率がそれほど高くない世の中で、手紙や文章が書くのが得意でない人の代わりに文書の代筆をする、自動手記人形の仕事をしています。
依頼主の伝えたい意図をよく汲み取って非常にいい手紙や文章を書くことで高く評価されています。
そんな彼女も実は暗い過去がありました。
戦争中、ヴァイオレットさんはある軍人一家の兄弟に拾われ、幼くして戦場に駆り出されていました。
そんな中、弟である少佐はヴァイオレットさんのことをかわいがり、まだ幼くして感情をなくし、戦闘マシーンと化していた彼女に、勉強や情緒などたくさんのことを教えてあげていました。
戦争が激しくなり、お互いボロボロになりながら離れ離れになってしまった少佐のことを、ヴァイオレットさんは人気自動手記人形として活躍しながらも忘れられずにいた…
という設定でした。

あんまりにネタバレしてもあれなので、ざっくりよかったところをいうと、
はじめに人気自動手記人形として活躍するヴァイオレットさんを見せて華やかな感じになりつつも、暗い過去の説明で一度下げる、さらに吉報を受け取りまた感情が高ぶって、そうストレートにはうまくいかない…とまた下がる。クライマックスに向けてさらにもう1段上げて下げて…というメリハリが効いた感情の起伏があり、主題の合間合間に挟まれるサブエピソードも相まって非常に見ている人を引き込みます。
それぞれのシーンでヴァイオレットさんのひたむきさを感じることができ、感情移入してしまいます。

そのシーンを引き立てているのが背景で、心象風景が非常に効果的に使われています。
肝心のシーンでは背景がものすごくきれいで、説得力を高めています。

ちなみにどのシーンもヴァイオレットさんかわいいです。ちびヴァイオレットさんもかわいいし、真剣なヴァイオレットさんもかわいいし、すっごい喜んでるヴァイオレットさんもかわいい。

そして、登場人物の人柄もいい。慈愛に満ちています。
同僚はヴァイオレットさんを慕い、強かながら弱い部分もあるヴァイオレットさんを温かく支えています。登場人物全員いい人です。
一人ひとりの登場人物のヴァイオレットさんとの関係性がまた、この作品からにじみ出る優しさや暖かさを作っています。

映画を見ながら、自分もこんな仲間が欲しいなぁと何度も思いました。
仲間を想い支える側としても、よくわかり合って本当に必要なときにそばにいてもらう側としても、こんな仲間がいればどんなときもやっていけるだろうなと。
テーマは、「大切な人のことを思い出して、大切な人に伝えるべきことを伝えているか?」
ということのようですが、友達がいないのでまずその大切な仲間がほしいなと思ったのでした。。。


追記
サブスク系ではNetflix独占配信のTVアニメ版と外伝もそのためにNetflix入って観ました。
ヴァイオレットさんが持っているブローチ、手袋、傘など
ひとつひとつにもエピソードがあったのですね…。
それに、同僚との関係性も、徐々に作り上げていったものだったのを知って
ヴァイオレットさんのひたむきさに涙腺崩壊でした。
ヴァイオレットさんが、少佐の言った「あいしてる」の意味をどのようにして知ったのか、
映画から入った人もぜひTVアニメ版も見てほしいですね

2020年9月21日月曜日

GoToを使って帰省してみた(JR東日本 びゅうトラベル使用)

 GoToトラベルとかいう謎企画やってるじゃないですか。

やり始めてすぐはまだ厳重に警戒してる人も多くて批判もされてましたが、

結局のところ、主たる完成経路は飛沫か接触でしょうということになり、

どちらも起きにくい状況であれば別に移動しようが何しようがいいんじゃね?

という流れになりつつありますね。僕もそういうものかーと受け入れて

5月の連休、盆休みともにしてなかった帰省をGoToトラベルを使ってやってみました。

GoToを使うとなると旅行パックになるので交通宿泊費合計から補助が出る感じです。

帰省はするけど実家に泊まらずホテルに泊まって顔だけ出すのもこの状況だしありかなと思い、連休前の木曜日に調べてみました。


埼玉在住、実家は新潟なので、移動経路は新幹線です。

ちょうど検索したらJRのびゅうトラベルのサイトが出てきたので

その中で4連休中に使えるプランを探してみました。

https://www.jre-travel.com/lp/goto/?utm_source=go&utm_medium=sea&utm_campaign=goto&utm_content=goto&gclid=Cj0KCQjwnqH7BRDdARIsACTSAdtXItBCDPBBtDkuKDg6HyltX-ZTO2exB7sIc9xXkitn9k_bYlTNP8kaAii2EALw_wcB

もともと東京から新潟まで1万円くらいする新幹線ですが、プランを見ていくと、

連休中でも1万9千円を切る価格で往復新幹線代と宿泊費が込みのプランがありました。

宿も素泊まりのプランですが、数年前にできた新潟駅南口に直結されているJRが運営しているきれい目のビジネスホテルです。

新潟帰ったらまず実家に泊まるしここに泊まる機会なんてそうそうないだろうなと思っていたのでいい機会だしと予約ボタンをぽちぽち。

注意事項が複雑で、またパックなので合計金額しか出ておらず内訳が不明で本当にこの料金だけでいいのかな?など何度も確認しつつ、行き帰りの新幹線の時間を設定。

旅程表というのがPDFで出てきて、これを印刷して旅行中持ち歩けと出ていましたが、

結局一度も使う機会はありませんでした。

もし新幹線乗り遅れ、時間変更が必要になったさいなど、

みどりの窓口に駆け込んだ際に必要になるかもなので、携帯でPDFをダウンロードしておいたり、予約番号を控えておいたりはしたほうがいいかもしれません。


旅行当日、出発駅の新幹線の切符が出せる券売機でチケットを発券します。

いつも指定席予約を受け取るときのとおりインターネット予約のえきねっと予約の受け取り→予約したクレジットカードで受け取るってやったところ、そこからは受け取れなかったようで、カードをお返ししますと出てしまいました。

取り消しボタンを押して最初の画面に戻って、インターネット予約の受け取り→JR東日本国内ツアーの受け取りというボタンがあったので、そこから予約したクレジットカードで受け取るというボタンを押したところ、往復分の切符がでてきました。

https://www.eki-net.com/travel/guide/payment/mv.html

ここに受け取り方が書いてありました。僕のような心配性の人は見といて損はないと思います。

「クーポン2枚の発券があります」と予約画面で出てましたが、この企画マーク付き切符がそれのようです。

とりあえず発券したので昼食を食べ、いい時間になったので新幹線乗り場へ。

3時間弱で新潟へ着き、

実は目的の一つだった、まんがタイムきらら展 in 新潟を見に新潟市マンガ・アニメ情報館へ。

市内出身で地元とは言え学校と家の往復ばかりの引きこもりだったのであまり街中を歩いたことがなく、実は土地勘がない新潟駅東口エリアを歩くこと20分くらい。

万代シティバスセンターのすぐ近くビルボードプレイスとかいうなんか都会的でおしゃれっぽい名前の建物の中にありました。2階が映画館になっていて、1階が漫画アニメ情報館みたいですね。

入り口では手のひらを使った非接触検温、手指のアルコール消毒ののち、入場料を支払いチケットを受け取っておー入れるーと思ったらもう一段階あって、注意事項の説明がありました。これがなかなか長い説明で、おお…これ全員に対して読み上げるのキツそうだなぁと思いながら聞いて、アッハイわかりましたーって進もうとするとまだ続きがある…、30秒くらいだったと思います。ちゃんと聞きましょうね。

きらら自体は漫画はあまり読んだことがなくて、先日も書きましたが単行本全部読んだのはひだまりスケッチくらいでしょうか。ただきらら原作のアニメは刺さるものが多くてNEWGAME!などそれなりにハマっているものも多かったので来れてよかったです。

撮影禁止のメインの展示エリアでしたが、これまでの発刊されたきらら誌がずらーっと並んで飾ってあるところでは、

ひだまりスケッチもまだ始まってないころなんだこれ!とか、

おおーこのへんでNEWGAMEアニメ化した!とか、

最近やっぱりひだまりスケッチ載ってないけど載ると必ず表紙って聞いてたとおりなんだな

とかいろいろ見られて面白かったです。

あとは僕はあまりソシャゲー自体が合わなくてやってないですが、

きららファンタジアキャラクターの等身大パネル的なものを見て、

えっ、キルミーベイベーのやすなってひだまりのゆのっちより背低いの!!

など驚きながら、

展示を出た後に物販コーナーでささやかながら戦利品を手にして一度ホテルへ向かいました。

ホテルに入りチェックイン。はてさてGoToの場合だと何か特殊なことがあるのかしらとか思って帰りの新幹線の切符や持ち歩いてくださいと書いてあったPDFの印刷を用意してフロントに行き、予約した(苗字)です~って言ったら、フルネーム様ですねって言われて、ほかのビジホでやるように宿泊票に連絡先書いてカードキー貰って終わりでした。

会計のときにまた何かあるのかなーと思いながら部屋へ。

さすがにできて数年しかたってないのできれいな部屋でした。禁煙室だし。

本当にタダで泊まっていいのか…と思いながらベッドにぱふ。普通のビジホのベッドって感じですがあまり外泊しないのでちょっとプレミアム感を感じます。

日が暮れてきておなかもすいたので再び夕食のために外出。

入居しているビル自体の耐震工事のため一時閉店してましたが復活したというバスセンターのカレー(名物 万代そば)を試食しました。

 ソウルフードロスからの解放ということで、メディアにもたくさん取り上げられたようで閉店時刻間際でしたがそれなりにお客さんが入っていました。

立ち食いのスタイルですが女子高生のような感じのお客さんもいて流行ってんなーと。

僕は前述のとおり街中詳しくなかったので最近知って初めて食べに来ました。

色的にボンカレー的なものかなと思っていましたが、

中辛と辛口の中間くらいでわりとそれなりの辛さがあるルウで、

ぶ厚めに切った肉がコロコロと入ってました。

量も、女性がミニを頼んでいてサイズを見たら小さかったので、

普通盛りにしましたがこれだと結構多め。440円でこれはかなりの高コスパです。

確かに近くにあったらしょっちゅう来る感じ。

そして歩き疲れておなかすいていたのでそれだけでは飽き足らず


これも市民のソウルフードのみかづき「イタリアン」

ベーシックなものではなく期間限定の麻婆豆腐味というのが出てたので買って帰りました。

完全にオーバーカロリーですがたくさん歩いたのでいいでしょう…

わずかながらでも地元にお金落とさないとだし…ね?

うちはあまり外食とかしなくて実家に帰ってしまうと実家の飯しか食べないので、この機会にジャンクフードでちょっとした観光気分を味わってみました。

宿に帰り、ゆっくり休んで翌朝チェックアウト。

チェックアウトも拍子抜けで、ありがとうございましたー。とカードキーを返却したら「お会計はお済でございます。ありがとうございました。」とコインパーキングみたいなことを言われて終了でした。

びゅうトラベル、コミュ障には最高のサービスですね。

ほとんどコミュニケーションをしなくても旅行ができる。マジ最高です。

そこから実家へ向かい、数時間の間実家に滞在しました。

食事以外はマスクをつけたまま最近の話を聞いたりして、17時すぎの便でまた東京へ。

そんな感じで新しい生活様式の規制をGoToトラベル制度を使ってやってみました。

連休なので新幹線往復普通に取るより1000円ちょっとしか変わりませんでしたが、

平日だと1万5千円くらいで圧倒的に普通に新幹線乗るより安く、

しかも宿泊付きになったりするので、

たとえば金曜日、あるいは月曜日だけお休みして、お盆に帰省できなかった分、

少しだけ家族に会いに行くのもいいのではないかと思います。

2020年7月13日月曜日

Nginxを使って素の状態のブラウザで視聴可低遅延ライブストリーミングをしてみる(Nginx-http-flv-module)

コロナ禍で!
コロナ禍でライブ配信が注目されてますね。ええ。コロナ禍と言いたかっただけです。
ZOOMのようなビデオチャットや、Youtube Live ニコニコ生放送のような
1対多の生放送アプリまで、実際に集まって行う会議やイベント、
あるいは授業なんかもライブ配信で済ませている。そんな時代が一気に訪れました。
ここではWebRTCなどを使った双方向のビデオチャットではなく、
いわゆる映像配信と言われる1対多のストリーミングサービスの話題が中心です。

そんな中、セキュリティの関係もあり自分でライブ配信プラットフォームを作れないか
という相談が寄せられた人もいることでしょう。
これまでは、Adobe Media ServerやWowzaを動かしてそこにRTMPで打ち上げ、
Flash Playerで視聴といったアプリケーションが一般的でしたが、
ライセンス料をはじめ、非常にサーバーのコストがかかりました。
また、映像送信側では現役で使われているRTMPも、
現在では視聴環境側のブラウザでは、
RTMPの受信に必須であるFlash Playerのサポートを打ち切られているなど
すでに終わった技術になりつつあります。
RTMPで打ち上げるのはいいけどじゃあどうやって見るの?という話になるわけです。

いくつか方法があり、
・サーバーでHTTP Live Streaming形式に変換し、
HTTPプロトコルでのストリーミング視聴を可能にする
・同じくMPEG-DASH形式にしてHTTPプロトコルでのストリーミング視聴を可能にする

主に使われているのはこの2種類です。

どちらも仕組みとしては、配信したい映像を一定時間に区切ったTSファイルにして、
TSファイルの構成を示したプレイリストと一緒にブラウザでダウンロード、
プレイリストにしたがって再生、プレイリストを逐次更新して
また新しいTSファイルをダウンロードという形で、
HTTP GETを繰り返ししていくことにより映像をつながった状態で見られる仕組みです。

RTMPで打ち上げた映像をそのままHLS形式に変換してくれる機能まで持ったのが、
Nginx-RTMP-moduleです。
https://github.com/arut/nginx-rtmp-module
WebサーバーとしてはおなじみのNginxのモジュールで、
設定をするとRTMPサーバーとして動作、
HLSファイルの生成をONにしてWebサーバーでホストするとTSファイルと
M3U8プレイリストを生成して、HLSの配信環境も作ることができます。

これはすでに試している方も多いと思います。
HLSはサポートしているブラウザも多く、スマホでもPCでも安定して視聴できます。
しかし、先に述べた仕組みなので、
TSファイルの長さ分、録画した動画ファイルを生成してからプレイリストに乗せて、
ブラウザがダウンロード、再生ということでその分遅延が大きくなります。
このへんは調べるか、実際にやってみるとよく分かると思います。
僕が限界までチューニングした結果3秒くらいの遅延までは縮められましたが、
回線が遅くなったりするとすぐ映像が途切れてしまうピーキーな感じになってしまいました。

毎回前置きが長いですが、そこでタイトルのNginx-http-flv-moduleの出番です。
https://github.com/winshining/nginx-http-flv-module
まずはサクッとインストールから。

環境: Ubuntu 20系 (NTTArena Indigo VPS)
nginx/1.20.2 使用
追加モジュール以外はapt-getでインストールされるNginxと同じビルドオプションに
Nginx-http-flv-moduleを追加

sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get install build-essential libpcre3 libpcre3-dev libssl-dev zlib1g-dev -y

Nginx-flv-moduleモジュールレポジトリをダウンロードしてビルド
git clone https://github.com/winshining/nginx-http-flv-module.git
wget http://nginx.org/download/nginx-1.20.2.tar.gz
tar -zxvf nginx-1.20.2.tar.gz
cd nginx-1.20.2/
./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock \
--http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp \
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
--http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module \
--with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module \
--with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module \
--with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream \
--with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-g -O2 -fdebug-prefix-map=/data/builder/debuild/nginx-1.20.2/debian/debuild-base/nginx-1.20.2=. -fstack-protector-strong -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fPIC' \
--with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie' \
--add-dynamic-module=./../nginx-http-flv-module

make
sudo make install

成功すると、/usr/sbin/にnginxのバイナリが作成されます。

サービスの登録
sudo vi /usr/lib/systemd/system/nginx.service

[Unit]
Description=A high performance web server and a reverse proxy server
Documentation=man:nginx(8)
After=network.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid
TimeoutStopSec=5
KillMode=mixed

[Install]
WantedBy=multi-user.target

sudo systemctl enable nginx

Nginxの設定

sudo vi /etc/nginx/nginx.conf

#追加
include /etc/nginx/streams-enabled/*;

#http内に追加
include /etc/nginx/sites-enabled/*;

sudo mkdir /var/cache/nginx
sudo useradd nginx
sudo mkdir /var/cache/nginx/client_temp
sudo mkdir /etc/nginx/sites-available
sudo mkdir /etc/nginx/sites-enabled

sudo vi /etc/nginx/sites-available/vod

location /http-flv {
  flv_live on;
  chunked_transfer_encoding on;
  add_header 'Access-Control-Allow-Origin' '*';
  add_header 'Access-Control-Allow-Credentials' true;
}

RTMPサーバー用設定ファイルを作る。
各パラメーターの詳細はNginx-RTMP-Moduleのドキュメントに書いてあります。
sudo mkdir /etc/nginx/streams-available
sudo mkdir /etc/nginx/streams-enabled

sudo vi /etc/nginx/streams-available/rtmp

rtmp_auto_push on;
rtmp_auto_push_reconnect 1s;
rtmp_socket_dir /tmp;
rtmp {
        out_queue               4096;
        out_cork                8;
        max_streams             8;
        timeout                 3s;
        drop_idle_publisher     5s;

        log_interval            5s;
        log_size                1m;

        server {
                listen 1935;
                server_name localhost;

                application rtmp {
                        live on;
                }
        }
}

設定有効化(sites-available、sites-enabledにリンク)
sudo rm /etc/nginx/sites-enabled/default
sudo ln -s /etc/nginx/sites-available/vod /etc/nginx/sites-enabled/vod
sudo ln -s /etc/nginx/streams-available/rtmp /etc/nginx/streams-enabled/rtmp
sudo /usr/sbin/nginx

こんな感じで設定したらOBSなどでRTMPの配信を受けられます。
そして、プレイヤーの画面を作っていきます。
プレイヤーにはbilibiliのflv.jsを使います。
から、flv.min.jsをダウンロードしてwwwrootに置きます。
同じくプレイヤーのHTMLを作ります。

sudo vi /var/www/html/player.html

<script src="flv.js"></script>
<video id="videoElement" muted autoplay controls></video>
<script>
    if (flvjs.isSupported()) {
        var videoElement = document.getElementById('videoElement');
        var flvPlayer = flvjs.createPlayer({
            type: 'flv',
            isLive: true,
            enableStashBuffer: false,
            autoCleanupSourceBuffer: true,
            stashInitialSize: 1024 * 128,
            url: '/http-flv?port=1935&app=rtmp&stream=stream01'
        });
        flvPlayer.attachMediaElement(videoElement);
        flvPlayer.load();
        flvPlayer.play();
    }
</script>

これでhttp://localhost/player.htmlを見ると、
rtmp://localhost/rtmp/stream01宛にRTMPで送った映像が見られます。

仕組みとしては、 /etc/nginx/sites-available/vodに設定を書きましたが、
受け取ったRTMPストリームを、80番ポートで再配信しています。
location /http-flv...
という部分がそれです。
flv live on;とすると、
locationになっている/http-flvにAPIが生成されます。

このAPIは、
port: RTMPストリーム受信ポート
app: live on;にしているRTMPサーバーのapplication名
stream: ストリームキー名
をクエリパラメータに食わすと、内部で該当ストリームをHTTP経由で返してくれます。

これにより、RTMPストリーム(FLV)を直接HTTP GETできるようになっています。
Flash playerがないとRTMPを再生できないのは、ブラウザがrtmp://プロトコルをサポートしていないのが主な要因ですが、HTTPプロトコルでストリームが受信できるとなると話は別です。
flv.jsは、RTMP over HTTPのストリームをデコードしてHTML5プレイヤーで再生します。
視聴中の通信イメージとしては、動画をHTTP GETするとチャンクドレスポンスで、Content-Lengthが無限のBodyが降り続けてきて、ずっと配信が続く限り無限に終わらない動画のダウンロードをしている感じです。

実際に試してみると、VPSサーバーに作った配信サーバーでも2秒くらいの遅延でした。

さらに追試したところ、遅延はキーフレームの約2倍になるようで、
キーフレームを1秒にしたときは2秒、2秒にしたときは4秒ほどの遅延になりました。
動画はキーフレームが来るまでデコード開始できないので、
その分待ち時間が生まれてしまうのも納得です。

HLS配信の場合も、TSファイルの分割時間で設定した時間が短くてもストリームのキーフレーム間隔のほうが長いと、キーフレーム間隔を最短時間として分割してしまいます。
遅延と戦うには多少画質を犠牲にしてでもキーフレーム間隔を短くする必要がありそうです。

エンコーダーの設定でキーフレーム間隔をさらに短くできれば、遅延も減りそうです。




チャット付きのライブ配信や監視系など、遅延が大きすぎると問題なアプリケーションではとても威力を発揮しそうです。

今更ながらひだまりスケッチを最新巻まで一気読みした感想

Amazonが芳文社セールでKindleの芳文社単行本の一部が77円になっています。
https://amzn.to/2OeWBNvこの機会に、アニメを見てそれなりに好きだったひだまりスケッチを全巻買って、
週末一気に読んでいました。
最新巻だけ通常価格でしたが、一気読みして続きがあるのに読めないのは生殺し感があってそれもホイホイ買ってしまいました。思うつぼです。

ひだまりスケッチのこれまでのイメージ(アニメ1期を全部見ただけ)では、
ほぼほのぼの系のストーリーの中、天然だけどすごい頑張り屋さんのゆのっちがかわいくて応援したくなる感じだなぁくらいに思っていました。
実際1期分のストーリーではそんな感じなのですが、続きを読んで感想が変わりました。

内気で臆病なゆのっちは新しいことをするたびに不安がり、将来の目標もなかなか決まらず深く悩んでしまいます。そんなとき宮ちゃんはいつもコミカルに茶化しながら、さりげなくフォローしています。
これが読み進めていくごとにわかってきて、明るく破天荒ながら優しい宮ちゃんの魅力に引き込まれます。
卒業した沙英先輩の部屋へ行った宮ちゃん。いつも4人で集まりにぎやかだった部屋。
空っぽの部屋で一人、、
このシーンで、人に見せていないながらもやっぱり宮ちゃんはいろいろ考えていたんだろうなぁと確信しました。

他にも、いつもお金がなくお腹を空かせている苦学生の宮ちゃん。これ以上親を頼って大学進学していいのかという葛藤を抱えながら、実家に電話するシーンまで他の人には深く悩んでいる様子を見せませんでした。

10巻まで高校生活の2年半、局面ごとにはゆのっちと同じかそれ以上悩みや葛藤があったはずです。
もっと弱いところを見せてもいいのになと思いますが、もっとずっと弱いゆのっちを、持ち前の明るさで元気付けることで自分も元気をもらっていたのかなと思います。完璧なお姉さんです。

アニメを見た方もぜひ宮ちゃんに注目して単行本も読んでみてください。

2020年5月17日日曜日

Wio Terminalを使ってGPSなし・Wi-Fiだけで測位してみる(Google Geolocation API使用)


なんだかSeeed StudioのWio Terminalが話題ですね。
秋月やスイッチサイエンスでも取り扱いが始まりましたが、
即在庫切れになったりしているようで大人気みたいです。



会社で買ってもらったので、週末いろいろいじってみました。
内容としてはMicroChipのATSAMD51系MCUに、RealtekのRTL8720DNが乗っていて、
M5Stackのように画面やら何やらいろいろついてケースに入っている豪華マイコンボードです。
公式通販
https://jp.seeedstudio.com/Wio-Terminal-p-4509.html
公式Wiki
https://wiki.seeedstudio.com/jp/Wio-Terminal-Getting-Started/

RealtekのRTL8720DNは、先に出ているESP8266/ESP32とは違い、
5GHzのWi-Fiに対応した新しいWi-Fi搭載マイコンです。
これを早く使ってみたいという人も多かったはずで、
Wio Terminalの登場により、いち早く技適マーク付きの試せる環境が手に入りました。
どうやらメインマイコンのSAMDと、Wi-Fi用のRTL8720DNはSPIでつながっており、
このライブラリでArduino Wi-Fi API互換にラップしていますが、
実は内部ではATコマンドを叩いて通信しているようです。すごい!



さて、本題ですが、せっかくなので温めていたネタを、
この新しいボードで試してみようとやってみたのが今回のWi-Fiを使った測位です。

スマートフォンなんかではよくWi-Fiをオンにするとマップアプリの測位が早くなったり、
正確な位置が表示されやすくなったりするのはご存知な方も多いと思います。
これは、Googleのデータベースから、
飛んでいるWi-Fi APのMACアドレスと緯度経度を紐付けた情報が提供されているから
実現できています。
(Google以外にも、Apple他も同じことをしているのかもしれませんが、
よく知りません。)

あまり知られていませんが、Wi-Fi APの情報から現在位置を推定するAPIは公開されていて、スマートフォンに組み込みの機能以外からもアクセスできるようになっています。
今回はこれを使ってみようと思います。

先に準備を。
Google アカウントにログインして、APIコンソールを開きます。
https://console.developers.google.com/?hl=JA


 すでにプロジェクトがある場合もあると思いますが、
ここでははじめに新規プロジェクトを作っていきます。
Google APIsと書いてある文字の右側をクリックしてプロジェクトの選択画面を表示


新しいプロジェクトボタンをクリック


適当にわかりやすい名前をつけます。


こんな画面に飛ばされたら、APIとサービスを検索の検索窓に
Geolocationと入力




Geolocation APIが出てきたらクリック


有効にする。


左側にある認証情報をクリック


今回は使わないですが、OAuthの同意画面を作成


外部を選択。次の画面の写真はありませんが、
名前の場所だけ埋めればとりあえず使えます。
このへんからはセキュリティに関わってくるので、各自調べながらやってください。


OAuth認証画面が作成できたら、
認証情報のページで認証情報を作成→APIキーをクリック


APIキーが取得できたら準備完了です。

このレポジトリにWio Terminalに書き込むスケッチと、Node.jsスクリプトがあります。

git cloneしてArduino IDEで書き込んだら、SDカードを入れて起動するだけで、
30秒おきにスキャンした周囲のWi-Fi APの情報がSDカードに保存されていきます。

終わったら、PCにSDカード内のbssids.csvをコピーします。
↑のレポジトリに入っている、getloc.jsと同じディレクトリにコピーしてください。

Node.jsの実行環境がない場合は、適当にインストールしてください。
また、CSVパーサーライブラリのインストールが必要です。
適宜
npm install csv-parse
とかやってインストールしましょう。

get_loc.jsを開いて、YOUR_API_KEYの部分に先ほど取得したAPIキーを貼り付けて、
node getloc.js
すると、result.csvというファイル名で緯度経度に変換された結果が保存されます。

読み方ですが、1列目の数字はタイムスタンプ(起動時からのミリ秒)、
2列目に緯度、経度、誤差(m)と続く構造です。

めんどくさがって結果出力をKMLファイルとかにしてないわけですが、
世の中には便利なサイトがありまして、CSVを貼るとKMLにしてくれるサイトがあります。

ここに、CSVの中身を貼って、


こんな設定にしてあげるとあらかんたん、KMLファイルとして出力されます。
(ピンのタイトルがタイムスタンプになります)

Google Mapsのマイマップ機能やGoogle Earthにインポートすると結果が見られます。

こんな感じでわりとかんたんにWi-Fiだけを使った測位ができてしまいます。

Wio Terminalには3G/LTEのようなWWANがありませんが、
テザリングやモバイルルータを使うなどすれば
リアルタイムでの測位も可能と思います。
(その場合はモバイルルータのMACアドレスを除外するなど
ちょっと工夫が必要そうです。)





なお、Google Geolocation APIがなぜそれほど浸透していないのか、
理由はおそらく簡単で、料金だと思います。
↑の画像にも実はチラっと写っていますが、
利用料金なんと1000リクエストで5USDくらいだそうです。
この記事を読んで試す場合、さすがに無料枠内で試せると思いますが、
高頻度で24時間動かし続けたり、商用で何台もクライアントがいると
かなりの金額になりそうです…。

2020年3月3日火曜日

怪我をしたので松葉杖に取り付ける荷重管理デバイスを製作しました。

数年前に下書きを作って公開してない記事でした。令和になって初公開です。

膝の内側を怪我しました。前十字靭帯付着部裂離骨折という骨折のようです。
経緯についてはこちらの動画をどうぞ…

前十字靭帯の付け根にあたる膝の骨を剥離骨折する、
"前十字靭帯付着部裂離骨折"という怪我のようです。
骨にトンネルを開け、ワイヤを通し靭帯と結び、浮いた骨を元の位置に抑える手術をしました。
入院は一週間半、私は大学生で学期末の時期だったので
ちょっと成績的にまずくなったりしましたが、大学生活に疲れ精神的にも参っていた中、
一時の休みを得られてよかったとも感じています。
名医に出会えたので、術後の経過は良好で疼痛もなく順調でしたが、
骨が接合するまでには3ヶ月の時間を要するということで、術後2ヶ月は杖を欠かせませんでした。

術後の経過日数により、はじめの2週間は負傷側の足を地面につくことなく過ごすこと、
次の週は体重の1/3まで掛けてよい…など、徐々に負荷制限が緩和されていきました。
しかし、極度の運動音痴の私は、1/3荷重がこれくらいだと両足別々の体重計に乗せられて、
教えられたところで感覚を覚えられません。負傷側にも体重をかければ、
松葉杖を持つ手は楽なのですが、荷重制限を越えるとどうなるかわかったものではありません。
一方で、荷重を掛けず養生している負傷側はどんどん衰えていき、リハビリの先生には、
「寝たきりの老人並」と言われました。太ももが頬のように柔らかくなったのはショックでした。
荷重を掛けなければ筋肉を取り戻すことはできないのです。

そんなジレンマを抱えつつ、やはりこわいので余り荷重を掛けないようにしていたまま、
全体重の2/3荷重を負傷側に掛けていいと許可されました。
2/3荷重を掛けられると、松葉杖を両手に抱えずに1本で歩く、「片松葉」ができるようです。
以前と同じ荷重のままでは、手に掛かる荷重は両松葉のときの2倍になってしまいます。
右手がボロボロになりながら、ちゃんと2/3荷重を掛けられるようになろう。と考えました。

前置きが長くなりましたが、製作工程を…。

Wii fitというゲーム用コントローラーのバランスWiiボードをAmazonで買いました。
早速バラし…


松葉杖用の先端に取り付けました

テープ固定じゃ心もとないので、Amazonで杖の先のゴム石突部を買って加工しねじ止めしました。


測定値を正確にするために、校正用の機能と設備も用意。


で、ちょいちょいっとしきい値を設定してLEDが点くようにしてみました。

ESP32でBosch BME680の拡張ライブラリ Bsecを使う

少し前に、秋月でも気温・湿度・気圧に加え、MEMSガスセンサを搭載した、
Bosch BME680の取り扱いが始まりましたね。
サクっと4ピン出ていてすぐにI2Cで繋げられそうな感じになっています。
自分は去年しばらくストロベリーリナックスのBME680を使って
しばらく実験していたので、使い方について少しまとめてみます。

BME680は、公開されているデータシートやサンプルコードを使うと
・気温
・湿度
・気圧
・ガスセンサの抵抗値
が取得できるセンサーです。
ガスセンサの構造ですが、電気応用みたいな名前の科目で習った通りだとすると
金属をヒーターで温める→酸化して抵抗値が上がる
周辺の雰囲気に水素などがあると還元されて抵抗値が下がる
という原理で可燃性ガスの有無がわかるという原理だったと思います。
なのでセンサがしっかりと加熱されるまでしばらく新鮮な雰囲気下で動かして、
ベースラインの抵抗値を控えておいて、それより抵抗値が下回ったら
何かガスが出てるなという判断が可能です。

しかし、抵抗値が表示されても相対的な評価しかできないので、
何か単位がついた空気品質の指標が欲しいですよね。

そこでBosch謹製のBsecライブラリというものをご紹介します。
ボッシュのラボテストの結果、センサーから取得できる生データをもとに、
・推定CO2
・IAQ(屋内空気品質)
・推定呼気VOC
・湿度・気温補正値(ヒーターの影響を考慮した値)
を計算してくれるArduinoライブラリです。(RPi版もある)

最新版はGitHubにあります。早速cloneしましょう。

README.mdを読むとわかるのですが、インストールに一癖も二癖もあります。
なぜかというと、BoschはこのBsecライブラリのソースコードを公開していません。
特定環境向けに、コンパイル済みバイナリとヘッダーファイルという形で提供しています。
このコンパイル済みのライブラリを使うために、Arduino IDEに修正が必要です。

現時点で最新のインストール方法についてご説明します。

はじめに、Arduino IDE 1.8.11のポータブル版を用意します。
ここに過去バージョンの一覧があるので入手可能です。
Windows ZIP file for non admin installとあるリンクからZipファイルになったポータブル版をダウンロードして解凍しました。Macの場合は知りません。

解凍したら、できたフォルダにportableという名前のフォルダを作成します。
これですでに入っているArduino IDEとパスを共有しなくなります。
ライブラリやボードマネージャの設定などは入れなおしになります。

フォルダ内のexeからArduino IDEを起動します。
今回はESP32を使うので、ボードマネージャでESP32を使えるように設定し、(省略)
ライブラリをインクルードより、まずは普通にダウンロードした
Bsecライブラリをインポートします。
なお、ESP32ボードのパッケージはv1.0.4を使います。


Arduino 1.8.11のフォルダ\portable\packages\esp32\hardware\esp32\1.0.4
を開きます。



platform.txtを開き、
compiler.c.extra_flags=
compiler.c.elf.extra_flags=
compiler.S.extra_flags=
compiler.cpp.extra_flags=
compiler.ar.extra_flags=
compiler.objcopy.eep.extra_flags=
compiler.elf2hex.extra_flags=

あたりを

compiler.c.extra_flags=
compiler.c.elf.extra_flags=
#compiler.c.elf.extra_flags=-v
compiler.cpp.extra_flags=
compiler.S.extra_flags=
compiler.ar.extra_flags=
compiler.elf2hex.extra_flags=
compiler.libraries.ldflags=
とします。(コメントアウトが増えてるけど公式のやつそのままコピペなので)



さらに、
## Combine gc-sections, archives, and objects
recipe.c.combine.pattern="{compiler.path}{compiler.c.elf.cmd}" {build.exception_flags} -Wl,-Map "-Wl,{build.path}/{build.project_name}.map" {compiler.c.elf.flags} {compiler.c.elf.extra_flags} -o "{build.path}/{build.project_name}.elf" -Wl,--start-group {object_files} "{archive_file_path}" -Wl,--end-group  "-L{build.path}"

の行を

recipe.c.combine.pattern="{compiler.path}{compiler.c.elf.cmd}" {compiler.c.elf.flags} {compiler.c.elf.extra_flags} -Wl,--start-group {object_files} "{archive_file_path}" {compiler.c.elf.libs} -Wl,--end-group {compiler.libraries.ldflags} -Wl,-EL -o "{build.path}/{build.project_name}.elf" -lm -lgcc

とします。
これでコンパイルが通るようになります。



そして、Arduino IDEを再起動後、スケッチ例→Bsec Software Library→basic
をコンパイルしてみましょう。I2C接続でセンサーデータを取得するサンプルです。
必要に応じて、LED_BUILTINを#define LED_BUILTIN 19のように置き換え
BME680_I2C_ADDR_PRIMARYを0x77(BME680_I2C_ADDR_PRIMARYは0x76)
としてあげると動くと思います。
ESP32の場合、Wire.beginの部分で
Wire.begin(21, 22);のようにピンを置き換えしてあげる必要があります。


成功するとこんな感じでセンサーデータが出てきます。
呼気VOCなんかは簡易アルコールチェッカーとして使えそうだったり、
気温測定の代わりに今流行っているCO2も推定値が出てきます。
また、空気品質もIAQという指標となる値が出てくるため評価しやすい値となっています。

春休みにBME680をいじってみてはいかがでしょうか。

2020年2月16日日曜日

ESP-IDF v4をWindowsのVS Codeで使いやすくしてみる(PlatformIOなし)

https://blog.nyancotech.online/2020/02/windowsesp32esp-idf.html
の続きです。
WindowsでESP-IDF v4環境の構築は上記ページをご覧ください。

まずは普通にインストールされたESP-IDF Command Promptを開きます。



Using Python in C:\Users\admin\AppData\Local\Programs\Python\Python37\
Python 3.7.3
Using Git in C:\Program Files\Git\cmd\
git version 2.25.0.windows.1
Setting IDF_PATH: C:\Users\admin\esp\esp-idf
この部分をメモっておきます。


VS CodeでESP-IDFディレクトリを、「フォルダを開く」から開いたあと、
左下の歯車ボタンから設定を開きます。


Workspaceタブを選択し、Terminal欄をクリック、Edit in settings.jsonをクリック


{
    "terminal.integrated.shellArgs.windows": [
        "cmd",
        "/k",
        "..\\.espressif\\idf_cmd_init.bat",
        "C:\\Users\\admin\\AppData\\Local\\Programs\\Python\\Python37\\",
        "C:\\Program Files\\Git\\cmd\\"
    ]
}
ここに上のJSONを環境に合わせて変更して入力後保存します。
..\\.espressif\\idf_cmd_init.bat

の行には、インストールした.espressifディレクトリ内の
idf_cmd_init.batへのパスを入力してください。
自分は

esp- .espressif
     L esp-idf
というディレクトリ構成にしているので
カレントディレクトリのesp-idfディレクトリから見ると
..\.espressifが.espressifの場所になってます。
Python37というのが書いてある行は、
初めにESP-IDF Command Promptで表示されていた
「Using Python in...」の右に書いてあるディレクトリを入力します。
Git\\cmdというのが書いてある行は、同じく
「Using Git in...」に書かれている行を入力します。

それぞれパスの区切り文字はエスケープ文字として認識されてしまうので、
\\と2つ続けて入力してください。




settings.jsonを保存して、Terminal->New Terminalでターミナルを開くと、
VS CodeからESP-IDF Command Promptが使用できます!
idf.py flash -p COM10とかやればこの画面のまま書き込みまでできます!


2020年2月15日土曜日

【令和最新版】WindowsにESP32開発環境ESP-IDFをインストールする

これまでESP32の開発環境はUnixシェル用のものしか用意されておらず、 Windowsではmsysを使って実行する方法が公式で紹介されていました。 そんな中、最近になって、Espressif純正の一括インストーラが出ていたので試してみました。
https://docs.espressif.com/projects/esp-idf/en/latest/get-started/windows-setup.html

ダウンロードしたexeファイルを開き、インストールしていきます。


必要なパッケージをインストールしてくれますが、Pythonやgitなど、
すでに入っているものがあればそれを選択することで
新しくインストールすることなく進むことができます。
よくできてますね


ESP-IDFのレポジトリをすでにダウンロードしてあれば
そのディレクトリを使うことができます。



ESP-IDFをダウンロードする場合はバージョンを選択できます。
使用するコンポーネントの互換性の問題などがなければ、
4.0を選んだほうが後々アップデートする手間を減らせるかもしれません。


ツールチェーンやPythonの仮想環境を保存する先を選択します。


一発でESP-IDF用のターミナルを開くショートカットを
スタートメニューやデスクトップに登録できます。


各種設定が完了するといよいよインストールです。


ESP-IDFレポジトリはとても大きいのでダウンロードに時間がかかります。



しばらくして、インストールができ…


ませんでした。

表示されたログを見ると、Python virtualenvに
--no-site-packeagesなんてオプションないよと言われています。


はてさてexeファイルの中身に入ってるんだろうしどうしたものかと調べていると、
修正版が出ていました。
下のほうに直リン貼ってる人がいます。




気を取り直してやり直し。


インストールできました。


Pythonのパッケージは専用の環境としてインストールされ、
PATHもシステム標準のものではなく専用のPATHが設定されるようです。
ほかの開発環境と競合せずに動いてありがたいですね。
早速esp-idf\examples\get-started\hello-worldディレクトリで
make menuconfig相当の"idf.py menuconfig"をしてみると…
なんかUnicodeDecodeErrorとか言われています…。


ちょっとぐぐったらこんなすばらしいコピペで動きそうな記事を発見

最近のUnicodeDecodeError

.espressif\python_env\idf4.0_py3.7_env\Lib\site-packages\sitecustomize.py
に上記記事のように
import builtins
__original = open
def __open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None):
    if 'b' not in mode and not encoding:
        encoding = 'utf-8'
    return __original(file, mode, buffering, encoding, errors, newline, closefd, opener)
builtins.open = __open

と記述したファイルを置き、標準のopen関数を上書きしてあげます。


すると…

うーんなんか周り文字化けてるけどとりあえず動いた!



このように、Espressif Systems様が提供してくださっている
Windows版インストーラにより、

簡単にWindowsでの開発環境が作れました!

(正直これでも今までよりは楽だと思います)

あとはメモですが
idf.py menuconfig
でmenuconfig
Serial flusher configでフラッシュの設定ができたりします。
idf.py makeでビルド
idf.py flash -p COMxxでCOMxxポートに接続されたESP32へ書き込み
idf.py monitor -p COMxxでシリアルモニタ(トレースバック付き)
monitor中に
Ctrl+T -> Ctrl+Shift+Fで再書き込み