2021年1月10日日曜日

WindowsでphpMyAdminを使う+多段SSHポートフォワードでDBのポートが通るようにする

サーバーサイドは本番環境は自分は作らず、試作や検証目的のことが多いので、
データベースは1つのVPS上にMariaDB+Webサーバ&phpMyAdminの環境を構築して
SSHポートフォワードで直接サーバ内のphpMyAdminを開いてSQLを投げていたのですが、
たまに本番環境のDBも時折直接編集する必要が出てきて、
Amazon AWS VPC内にあるRDSを多段踏み台経由で操作する必要ができました。
接続の構成としてはこんな感じ。

ひとまずRLoginで多段踏み台経由でRDSと接続するポートをSSHポートフォワーディング、
やはりGUIで操作したいのでMySQL Workbenchを使ってやっていたのですが、
phpMyAdminのほうが慣れていてやっぱり使いやすいよなということで、
ローカルにphpMyAdmin環境を構築し、リモートDBを参照できるように設定してみました。
結果はうまくいっていつもどおりphpMyAdminからRDSを操作できています。
ぱっと調べてもコピペで動くページが見つからなかったので手順をまとめておきます。

構成:
OS: Windows 10(x64) WSLも使わないしあんまりバージョンは問わない
Webサーバ: nginx version: nginx/1.19.6
php: PHP 8.0.0 (cgi-fcgi) (built: Nov 24 2020 22:02:53)
ターミナル: RLogink (x64) Version 2.25.6 (2020/12/09)
phpMyAdmin: 5.0.4

多段SSHポートフォワードでSQL用のポートが通るようにする
RLoginをダウンロード
Tera termのスクリプトとかでもできるみたいなんですが、
RLoginならGUIで全部設定できるので最近は結構使っています。
少しスクロールしたところに、GitHubからダウンロード、実行プログラム…
という項目があります。
64bit Windows 10なのでrlogin_x64.zipをダウンロードしました。
インストーラではなく解凍したところにいきなり実行ファイルがあるので、
適当な場所へ移動しておいたほうがいいと思います。

起動するとServer Selectというダイアログが出るので、新規をクリック

まずはエンドポイントとなる踏み台の接続情報を埋めていきます。
ホスト名に踏み台のホスト名あるいはIPアドレスを入力
ユーザー名に接続ユーザー名、パスワードログインが可能ならパスワード
鍵認証の場合は、SSH認証鍵ボタンで鍵ファイルを選択
エントリー欄にわかりやすい名前(踏み台1など)をつけておく

プロトコル項目のポートフォワードをクリック

新規をクリックしてSSH2ポートフォワード設定ウインドウで
Local Socksを選択
Host: localhost、Port: 11022(任意)
でOK

一旦つないでみて、SSH接続できたら踏み台1の設定はOK。
VPC内にあるDB接続用踏み台の接続プロファイルを作成
再びServer Selectウインドウで新規をクリック

右上にあるタブ(上)、前接続先(下)の下のプルダウンで
先ほど作成した接続プロファイルを選択

IPアドレス(Host名)、ユーザー、認証情報を入力
プロキシ設定ボタンでSelect Proxy Protocol: SOCKS5を選択
Server OptionでProxy Server Address: localhost
Socket Portを先ほど設定したポート 11022に設定してOK

プロトコル→ポートフォワードウインドウを開く
Listened: Local、 Host:localhost、 Port: 13306(任意)
Connect: Host: RDSのIPアドレス、 Port: 3306
に設定してOK

Server Selectに戻り、踏み台2のほうに接続すると、
自動的に多段SSH接続してくれて、RDSのポートも通るようになる。

Nginx+phpMyAdminを使えるようにする
上記手順でlocalhost:13306でRDSと接続できるようになったので、
phpMyadminをセットアップ。

Nginxをダウンロード
nginx/Windows-1.19.6 を選びました。解凍してC:\nginxに移動しました。

phpをダウンロード
x64 Non Thread Safe のZipをダウンロードしました。解凍してC:\phpに移動しました。

phpMyAdminをダウンロード
右側にDownloadってリンクボタンがあります。
解凍して、C:\nginx\html\phpmyadminに移動しました。

C:\nginx\conf\nginx.confをエディタで開き、
location ~\.php$...の部分のコメントアウトを外して有効にして、
SCRIPT_FILENAMEの行を修正します。

        location ~ \.php$ {
            root           html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }

とりあえずphpが動くようになったか確認してみます。
C:\nginx\html\phpinfo.phpに以下の内容のファイルを保存します。

<?php
phpinfo();
?>

Nginxとphp-cgiの起動スクリプトを作成します。
C:\nginx\run.batに以下の内容のファイルを保存します。

start nginx.exe
start C:\php\php-cgi.exe -b 127.0.0.1:9000

停止用スクリプトも作成します。
C:\nginx\stop.batに以下の内容のファイルを保存します。

  nginx -s stop
  taskkill /F /IM php-cgi.exe

run.batを実行して、
http://localhost/phpinfo.php
を開いて、
phpinfoが正常表示できれば準備完了です。
停止するときはstop.batを実行すればphp-cgiとnginxが停止します。


phpMyAdminの設定を行います。
C:\nginx\html\phpmyadmin\config.sample.inc.phpをコピーして、同じフォルダにconfig.inc.phpとして保存します。
内容を以下のように編集します。

  $cfg['Servers'][$i]['host'] = 'localhost';
  $cfg['Servers'][$i]['port'] = '13306';

ポートフォワードでローカルホストの13306でRDSと接続できるようにしたので、
host: localhost、port: 13306にします。
portの項目がない場合は行を追加すればOKです。
コメントアウトされている場合はコメントアウトを解除して設定を有効にしてください。
保存して、
http://localhost/phpmyadmin/index.php
を開くとphpMyAdminが開きます。
RDSの接続情報を入れればRDSをphpMyAdminで操作できます。



2021年1月2日土曜日

ジョゼと虎と魚たちを見た感想

劇場版ヴァイオレット・エヴァーガーデンを見てから、一人映画もなかなかいいなと思い、
ご飯食べにでかけた先で折角来たのでみたいな感じで、
ヴァイオレット・エヴァーガーデンは3回も見たりしてました。
大人向けアニメ映画自体それほどぶわーっと人が入る映画でもないので、
館内もわりと閑散としていてコロナ禍向きのエンターテインメントだなと思っています。
映画館ごとに椅子の座り心地とか、スピーカーのセッティングが違うのがわかり、好みもわかってきたような気がします。

ヴァイオレット・エヴァーガーデンを見るときに予告編で何度か見ていた、
「ジョゼと虎と魚たち」を今度は見ようと思っていて、
たまたま最寄りの映画館の予約を見たら1席しか予約入っていなかったので
空いてていいじゃんと今日行ってきました。
結局僕を含めて5人くらいしか入ってなかったです。この回、赤字なのでは…


さて、内容ですが、
生まれつき足が動かないようで、車椅子に乗ったジョゼと、
アルバイトでもダイビングショップで働くダイビングをライフワークにしている学生、管理人と、
ダイビングショップのアルバイトの同僚が主な登場人物です。
ひょんなことから主人公の大学生は「管理人」としてジョゼの世話焼きのアルバイトを始めます。
ジョゼはおばあちゃんと二人暮らし。
おばあちゃんには外は危険で恐ろしい猛獣ばかりと言い聞かされながら毎日家の中で過ごしています。
ふわふわした可愛らしい見た目ですが毒舌で横暴。
自分の部屋のふすまを閉めたまま、ふすま越しに管理人に無茶な要求をして使い走らせます。
高額な時給を目当てに管理人は必死で要求に答えますが、
掛け持ちバイト先のダイビングショップの同僚に、「アイツ絶対泣かす」とボヤきます。



ある日、いつものようにジョゼの家へ行くとジョゼの姿がありません。
管理人はおばあちゃんと一緒に探し回ります。ジョゼを見つけた管理人は、
これからたくさんジョゼと一緒に外の世界へ出歩くことになります…

ネタバレはこれくらいにしときます。予告見た感じだと全然話わからなかったので、
これくらいの情報は知ってても良かったなと思ったのをまとめたのが上のあらすじです。

内容ではありませんが、音楽がヴァイオレット・エヴァーガーデンと同じEvan Callさんで、
とても情景に合った効果的なBGMになっていたと思います。
舞台は大阪の市街地で、ちょうど先日マジミラ併催イベントの通天ミクを見に行ったので記憶に新しい町並みが丁寧に描かれていました。

主人公の管理人はひたむきで人当たりもいい好青年。
自身の夢、目標に対して一歩一歩近づいていきます。
この時点で、僕はこういう人に弱いので自己実現を応援したくなります。
一つステップを進むたび、こちらもうれしくなります。
夢を掴むためのステップを自分で組み立てて一歩ずつ進んで行く感じがよく描かれています。
僕自身進路とかを真面目に考えたことがほとんどなくて、
成り行きで大学卒業まで進んできたので、しっかりとした夢や目標がある人に憧れる部分があるのかなと思います。
ストレートに何もかもうまく行ってしまうと物語にならないのでやはり挫折があります。
絶望で空っぽになってしまったところ、仲間に夢を思い出させてもらう、月並みなパターンですが、内容が、本当に自分も頑張ろうと思うだろうなという説得力のあるエピソードになっています。

ジョゼも、家に閉じ込められていたところから、怖い世界だと思っていた外の世界に触れ、
友達もできて、自分の生き方や目標を見つけます。


「何者」という映画があって、就職活動を描く作品で、
大してやりたいこともないけどどっかに入らないといけない。
何社受けても面接で落とされる。じゃあどんな自分を作って面接で見せたらいいんだろう。
そもそもこんなことはなんの意味があるんだろう?
みたいな鬱々とした作品なのですが、その逆って感じですね

今就職活動中や、受験する大学を決めようみたいな進路について考えている学生は、
やりたいことがない人も、多少なりとも夢がある人も「何者」よりはジョゼを見たほうがいいと思いますw
やりたいことがあって、自分でそのためにどうしたらいいか考え、歩きながら、
そのやりたいことに対して周りの理解や応援があると、
それが実現してもしなくても本当に幸せだろうなと思うのですよ。
自分がそうじゃなくても夢を追う人を支える側になり、一歩一歩自己実現に近づくのを共に喜ぶこともやはり幸せだろうなとダイビングショップの仲間を見ていて思いました。

本音ですか?
管理人のように芯のあるヤツだったら人生豊かで楽しいだろうなと思いました。
自分でバシィッ!と目標を決めて突き進むのは自分の人生を作り上げていく感じがするんだろうなと。
僕なんか成り行きで薄っぺらい人生を歩んでいますよ。それが不幸とまでは感じませんが。

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時間動かし続けたり、商用で何台もクライアントがいると
かなりの金額になりそうです…。