Un nouveau monde parfumé

香り立つ備忘録

序文

謝罪

おはようございます。klis14 のかみかみです。普段はインターネットピカチュウをしています。

今日は 2017/12/2 552時ぐらい、これは klis Advent Calendar 2017 2日目の記事です。

adventar.org

……。

はい、卒研がアレしたとかで記事を上げられず、大変申し訳ありませんでした。イキって2日目とか押さえたこと、深く反省しております。

そんで記事なんですが、この話を klis のみなさんにどのようにお伝えするか、最後まで決まらなかった結果がこの記事です。まあなんだいね、お付き合いください。

TL;DR

ガルパンはいいぞ

StorageOS で Kubernetes 上に Kubernetes から使える Volume Provider を展開する

みなさん、Docker って聞いたことありますか。ないですか。使ってますか。それはいい。

www.docker.com

実際 klis にあってはシステム系でない人は聞いたこともないでしょう。システム系の人も名前ぐらいしか聞いたことがないって人、多いんじゃないでしょうか。

Docker の使い方そのものについてはインターネット上に入門記事が打ち上げられたクジラのごとく大量に転がっているので譲るとして、簡単に背景のみ語っていきます。

世はまさにコンテナ大航海時代

みなさん Web アプリケーションぐらいは多かれ少なかれ書くじゃないですか。授業とかだと既に実行環境が整っていたりすることも多いですが、そもそも環境をしつらえるって結構大変なことなんです。

ここでは何かの授業でやったことあるであろう RubyCGI を動かすことを考えてみましょう。物理的なマシンの用意とインターネットへの接続は抜きにしても、概ねこういう手順が必要になります。

  • OS(なんだかんだサーバーといえば Linux が多いですが、もちろん Windows Server や OSX なんてこともありますよね)を入れる
  • Apache httpd などの HTTP サーバーを入れる
    • その上で CGI を動かせるような設定をする *1
  • 欲しいバージョンの Ruby の実行環境を用意する
  • 自分のアプリケーションのコードを入れる

誰もこんなお決まりの手順で消耗したくないわけです。凝った gem などを使った日には、30億のデバイスで動いて客先で動かない某の如く、何故か自分の手元では動いたのにデプロイ先では動かない、ということにも直面しかねません。

コンテナ系仮想化技術が流行した理由は、こういった手間を省きたかったからでしょう。コンテナが動く場所さえ用意してやれば手前の書いたアプリケーションは動く。

今言った手順を Dockerfile にすると、なんかこんな感じになるんだと思います。*2

でも現実のアプリケーションはそう簡単ではありません。100台の App サーバーが、ウン台の DB サーバーが、あっ急に負荷が高まったから今すぐウン十台サーバー追加したい。そういう場面は現実にあります。

そんな日に docker run とかしたいっすか? コンテナ間の通信どうするよ? docker-compose。 ほう、悪くないね

船乗りの登場

そんな人間の欲望が重なり合い、迷えるクジラの海に一人の航海士が現れました。k8s こと Kubernetes です。

kubernetes.io

Google は 2000年代初頭からコンテナ技術を使っていたといいます。Borg というオーケストレーションツールがそれらしいです。

つまるところ、折角コンテナ化によってポータビリティを獲得したんだから、コンテナを動かせるマシンを沢山沢山用意してやって、アプリケーションはその何処かどうにかして動いていればいい。もしマシンが故障すればサクッと殺して何処かへ移動させればいい。パワーが必要なら、マシンクラスタにバンバンリソースを追加して、アプリケーションもバンバン動かせばいい。コンテナ間の通信はツールが面倒を見てやろう。コンテナが死んでも復活させてやる。ただし生殺与奪権はこっちのもん。そういった思想が k8s にも受け継がれています。

よいですね。k8s クラスタさえ用意してやれば、あとはコンテナを投げ込むだけで動くんですから。

しかしデータは?

つらい永続データ

Docker とかその系のコンテナは、中にデータを持つを好しとしません。つまり例えばデータと結びついたデータベースなんかと相性が悪いわけです。k8s に至っては、コンテナはどっかのノードで動いているもんであり、勝手に移動しうる。そんな日に中にデータ持ちますか。持てません。

そんなわけで、データの永続化は今もってつらい話です。もちろん今時のクラウドなら、マネージドな SQL データベースを使ったり、ファイル置き場はオブジェクトストレージや仮想ディスクがくっついていてそれを使ったりするんですが、もし自前でやっていくとなると…頭が痛い。

ということで、StorageOS を使って、Kubernetes 上に他の Kubernetes コンテナから使える Volume Provider を展開してみてどうなるか試しました。

幕間

……。と、ここまでが背景説明ですが、そろそろみんな飽きてますね。僕も飽きました。

なのでガールズ&パンツァーの話をします。

先の話の続きは Qiita ポエム案件になったので明日公開します。気になる人たぶんいない気がするんですけど良かったら見てください。

人には伝わらない僕の「ガールズ&パンツァー 劇場版」好きなところベスト5

こんばんは。klis14のかみかみです。

皆さん、「ガールズ&パンツァー」、観てますか。観てますね。それはいい。

さて来たる12/9には「ガールズ&パンツァー 最終章 第1話」も劇場公開となりました。盛り上がってます。

http://girls-und-panzer-finale.jp/girls-und-panzer-finale.jp

今日は「劇場版」の方で僕に刺さったシーンの中で、特に全く人に伝わらないであろうシーンをお伝えします。伝わらない度で重み付けをしたので、マニアックな視点のみでお届けします。また、「劇場版」の公開から日も経っているのでバシバシネタバレます。観ていない?観て。

ではいきます。

第5位 冒頭アバン 大洗町民の観戦シーン 2カット目

f:id:pikatenor:20171224231304j:plain:w600

の、女子生徒

f:id:pikatenor:20171224231257p:plain:w400

わかりますかね、夏服(半袖)なんですよ。

大洗女子学園の生徒は、基本的に皆冬服(というか長袖)*3で、作中で半袖を着用しているのはアリクイさんチームの乗員のみです。

他のシーンに登場するモブ生徒は全員長袖で、おそらく設定上半袖が存在しないものと推測しているんですが、件のシーンに登場する生徒はみんな半袖です。しかもアリクイさんチームとはデティールが異なり、胸当てがあります。

おそらくアニメーターが勝手に描いたのかな、と思うんですが、何にせよ貴重なシーンです。*4

第4位 あんこう

大学選抜との試合終了後、ティーガーIに牽引されつつチームの元へ戻ったIV号戦車の勇姿です。

f:id:pikatenor:20171224232528j:plain:w600

It's just あんこう. このカット見ただけで泣いちゃうんすよね……。ずるくないですか。このあんこうダサかわいいのにこういう感じで出るとメッチャ格好いいんだもん。 ちなみにこの後のあんこうチームの皆さんが戦車を降りるシーンも、個性が出ててお気に入りなんで気にしてください。

TV本編12話と比べても、その試合の凄まじさが見て取れます。

f:id:pikatenor:20171224233000j:plain:w600

第3位 ドゥーチェ「こ゛っち゛み゛て゛る゛ぞ゛ぉお゛お゛ぉ゛」

f:id:pikatenor:20171224233453j:plain:w600

後の

f:id:pikatenor:20171224233536j:plain:w600

「うふぁっ、ふぅっ、、ふぇぇぁ!!」

良いですか。このランキングは「伝わらない」度合いで重み付けをしてお送りしています。「こ゛っち゛み゛て゛る゛ぞ゛ぉお゛お゛ぉ゛」なんて誰だって好きなシーンだ。そうじゃない。

この振り落とされそうになってるドゥーチェの動きと声です。見て。

第2位 島田愛里寿「♪やってやる やってやる や〜ってやるぜ」

f:id:pikatenor:20171224234130j:plain:w300

「♪い〜やなアイツを ボッコボコに〜」

f:id:pikatenor:20171224234227j:plain:w300

「♪喧嘩は売るもの、堂々と〜」

f:id:pikatenor:20171224234329j:plain:w300

「♪肩でか切り 啖呵切る〜」

f:id:pikatenor:20171224234414j:plain:w600

の、やや舌足らずな「ぜ」!!!!!!!!

僕は「劇場版」を15回以上劇場に観に行きましたが、そのうち7回ぐらいはこのシーンのために行っていたといっても過言ではない。

とにかくこれは Blu-ray 買って、聴いて。 配信サービスでもいいよ。 5万回再生してくれ。頼む。竹達彩奈に感謝。

第1位

f:id:pikatenor:20171224235208j:plain:w300

大学選抜との試合最後の、富士山(仮)を駆け下りるシーンからコマ送りしてみてください。

ここで注目して頂きたいのが、IV号戦車のシュルツェン*5です。苦しい試合展開により、殆ど剥がれています。

f:id:pikatenor:20171224235435j:plain:w300

ティーガーIの空砲を受けて、あんこうチームは最後の突進へと挑みます。主砲の威力でセンチュリオンに劣るIV号戦車の、最後の捨て身の賭けです。

f:id:pikatenor:20171224235619j:plain:w300

急加速により、ボロボロとなったシュルツェンが剥がれ落ちていきます。

そしてセンチュリオンの放った1撃…

f:id:pikatenor:20171224235711j:plain:w600

f:id:pikatenor:20171224235739j:plain:w600

f:id:pikatenor:20171224235802j:plain:w600

分かりましたか?吹き飛ばしているんです、最後に1枚*6残ったシュルツェン、その大洗の校章が入った部分を!

この1枚がなければタッチの差で大洗連合は破れていたかもしれません。なんていうか…みんなの想いがこもったアレというか…そういう…この…アレだよ!(語彙崩壊)

何がやべーってこれコマ送りしないとまず気づかないんですよ。どうですかこれ。見ましたかこれ。ゾクゾクしませんか。

おわり

どうですか。観たくなったでしょう、ガールズ&パンツァー。もうコンテナの話なんてどうでも良いですね。大切なのは大洗の埠頭に集まった沢山のコンテナです。じゃ、そういうことで。よろしくお願いしました。

Notice

本記事の画像は映画「ガールズ&パンツァー 最終章」及びTVアニメ「ガールズ&パンツァー」より引用しました。

(c) GIRLS und PANZER Projekt.
(c) GIRLS und PANZER Film Projekt.

お粗末さまでした。

*1: nginx で CGI を動かすのはつらい

*2: ちゃんと検証してないんで使えるかわかんないんですけど、docker run -d -p 8080:80 -v /dir/to/my/application:/usr/local/apache2/htdocs build-shita-yatsu みたいにすると使えそうなやつ

*3: 「最終章」で冬服(っつーかジャンパー)出ましたね、良いですね

*4: 全ての版権絵、スピンオフなどを追いかけているわけではないので、情報があったらお知らせください

*5: 追加装甲: IV号戦車の周りについてる板みたいなやつ

*6:身も蓋もないこと言うと逆サイド見えてないんでちょっとわかんないけど、試合終了後は全部剥がれてます

この記事は08:19つくば発秋葉原行通勤快速のTX車内で書いています

TXにおける車両の選び方ベストプラクティス

  • 基本的には最後尾車両

    • TXは2~4号車が電動車(モーターがあってうるさい)、1,6号車が制御付随車(ないので静か)になっている
    • 空気抵抗で揺れない最後尾車両が一番静かで快適
    • ただし、秋葉原行きの最後尾1号車は平日始発〜9:00まで女性専用車両なので注意
  • 初期配備車(TX-2x51~2x66)までの車両は3,4号車

    • 初期車両は椅子が固い
    • 見分け方は編成番号のほか、先頭運転席の窓の下に赤いラインがあるかとか、車両横の青い「つくばエクスプレス」の表示の上に赤いラインがあるかとか
    • ロングシート化改造を受けた車両の椅子は柔らかいのでもともとクロスシートだった3,4号車がよい
      • どの編成が改造済みかは不明

気が向いたらまたつくばエクスプレスハックを朝のTX車内で書きます。

AWS で爆速エンコード -準備編-

こんにちは。みなさんは録画をする人でしょうか。

このブログを読みに来るようなオタクの皆さんの場合、日々増え続ける 15Mbps の MPEG-TS との戦いを往々にして繰り広げているものと思います。
我が家の録画サーバーも録画済データが 1TB に迫り、いよいよ真面目にエンコードをしていかないと先行きが不安です。

しかしながらエンコードにはCPUパワーとなおも多大な時間を要します。
試しにウチの録画管理に使っている LIVA (Bay-Trail-M Celeron N2807) で x264 によるエンコードを試してみたところ、30分の動画を処理するのに8時間強を要しました。未エンコード件数は400件近くあり、不眠不休で頑張らせても100日ほどかかることになりますね。

とてもじゃないけどやってらんないので、Amazon パワーでぶん殴っていくことを考えました。

続きを読む

つらいときに押すボタン

この記事は クソアプリ Advent Calendar 2016 の11日目の記事です。

遅れました。すみません。

qiita.com

作ったクソアプリについて

僕の大学では来週22日から期末試験*1が始まります。元々3学期制を敷いていた名残でやや変則的なスケジュールですが、つまりこれから試験勉強に最終レポートに追われるつらい学生の増える時期です。

そんなときはこのボタンを押しましょう。

f:id:pikatenor:20161211080400p:plain:w600
つらい.ピカチュウ.net

運が良ければ同じタイミングでつらさを感じている人がいるかもしれません。
もし同じつらさを抱えている人がいればそっとわかってあげましょう。

f:id:pikatenor:20161211080607p:plain:w600

アプリの説明は以上です。


このままではポエムで終わってしまい、この Advent Calendar は Qiita に作られたものです。なので少しだけ使ったものの話をします。

というかこれ、実は去年の今頃につくったクソアプリのリニューアルなんですね。
↓2015年版(一応 http://tsurai-tk.herokuapp.com/ で今も動いています) f:id:pikatenor:20161211080626p:plain

大変素朴な見た目をしています。

というのもテスト勉強がつらくなったときにふと思いつきで、諸事情で作ったアプリのコードを再利用(というかほとんどのコードを削除 )して20分ぐらいで作ったアプリで、あまりにも素朴なので作り直したいなあ、と思いながら1年が過ぎ、またこの時期に新たに作り直すことにしたという訳です。

本当はもっと見た目に凝ろうと思っていましたが、時間がなかったのでとりあえずこれにて公開します。

2015年版は Sinatra で書きましたが、今回は勉強も兼ねて Meteor というフレームワークで書いています。

Meteor について

Meteor は JavaScript(node.js) のフルスタックWebアプリケーションフレームワークで、サーバーからクライアントまでまるっとJSで書けます。
2014年には1.0がリリースされ、まあ使ってみても良いんじゃないかと思ったので使ってみました。

Meteor を選んだ理由の一つに、リアルタイム同期が非常に強力というのがあります。

見ての通り つらい.ピカチュウ.net はリアルタイムでカウンターを同期しており、2015年版では WebSocket を直にゴリゴリ使って雑に jQuery でページを書き換えていました。

Meteor ではUIビューのほとんど全ての状態がリアルタイムに同期されます。
試しに同じブラウザ上で2つタブを開いて、片方のタブでログインすると、その状態が即座に他のタブにも反映されます。えげつない。
つらみの新規書き込み、削除も一瞬です。

また、作っていて感じたことですが Meteor ではクライアントのコードとサーバーのコードがかなり共有され、割とビビります。
サーバー側でモデル(MongoDB*2)の操作を行うコードがクライアント側でもそのまま動きます。厳密には minimongo が Mongo ライクなクエリをローカルでインメモリストアに対し実行しつつ、リモートにリクエストを投げています。このため、同期しつつもスムーズな動きを実現しています。

あまりにもサーバーのコードとクライアントのコードが渾然一体としているため、大規模になった際の維持が難しそうだと感じましたが、少なくともこういったしょぼいアプリを書き捨てるにはうってつけです。

Advent Calendar に登録しておきながらすっかり忘れていたためあわててアプリを作り始めましたが、0時頃から実装を始めておよそ2時間で機能の実装が終わりました。実際やってることはチュートリアルの Todo アプリと何ら変わりないですが。

まあその後 CSS を書いたりデプロイしていたらさらに2時間ほどかかりました。VPS に置いた dokku のアップデートに失敗して nginx の設定を崩壊させたまま放置していたのが敗因です。

とりあえず、作るだけならあまりにも簡単に作れてしまう Meteor のご紹介でした。詳しくはググってくれ。インターネットには他にいくらでも良質な紹介記事がある。


以下余談

CSS は本当に最高

デザインスキル というか CSS 力が無さ過ぎてクソアプリ一つ作るのにも時間を掛けてしまってつらい

そういえばこの前、サークルの引退祝いにこんなものをもらった。

CSS IS AWESOME. よくわかる。

Meteor を Heroku/Dokku にデプロイする

よーしできたしデプロイすっかと思ったがすこし手間取ってつらかった

パッとひっかかるこの jordansissel/heroku-buildpack-meteor は最新の Meteor 1.4 に対応していない。こっちの AdmitHub/meteor-buildpack-horse を使おう。

そもそも手間取ったのは先述の通り僕が nginx を破壊したせいだったんだけども。

クソアプリの文脈

以下はクソアプリ作りが間に合わなかった時にしようと思っていた話。

saikoh.tk という内輪でウケるためのアプリを作ったら微妙に内輪を越えてウケてしまい、調子に乗ってこんなイベントを実施したり、学園祭で肉を焼いたりしたとか

つらい.ピカチュウ.net はこの「リアルタイムでカウンターが増えると妙に面白い」という文脈を受けたものであるとか

そもそも saikoh.tk 自体さらに前に作った ganoff.tk というクソアプリの文脈を受けており…

という話をしようと思ったが、話すと長くなるし、身内以外に伝わる気がさっぱりしないので、この話はまた今度にします。

*1:厳密には秋Bモジュール期末試験

*2:ちなみに Meteor ではデータベースに MongoDB 以外を使うための現実的な選択肢があまりありません

node.js with nvm with systemd

先のこたつ記事の補足というか何というか

サラッと Hubot を常駐と書きましたが、当然そのサービスの自動起動には systemd を使いたいですね? 使いたいですね? 使いましょう。

systemd 氏は実行ユーザーなんかも指定できるわけですが、環境変数の設定までは面倒を見てくれないので、そのへんをやっていく必要があります。

nvm でインストールしたお好きなバージョンの node で Unit ファイルを書くと、おおよそ次のような感じになります。

[Unit]
Description=Hoge
Requires=network.target
After=network.target

[Service]
Type=simple
WorkingDirectory=/path/to/application
User=<user>

Environment=ENV=production

ExecStart=/home/<user>/.nvm/versions/node/<version>/bin/node <mainfile>.js

[Install]
WantedBy=multi-user.target

kotatsubot の場合は次のようになっています。

/etc/systemd/system/kotatsubot.service

[Unit]
Description=KotatsuBot
Requires=network.target
After=network.target

[Service]
Type=simple
WorkingDirectory=/home/kotatsu/kotatsubot
User=kotatsu

Restart=always
RestartSec=10

Environment=PATH=/home/kotatsu/.nvm/versions/node/v6.9.1/bin HUBOT_SLACK_TOKEN=hogehoge

ExecStart=/home/kotatsu/kotatsubot/bin/hubot --name kotatsubot -a slack -l kotatsu

[Install]
WantedBy=multi-user.target

Note that, ExecStart の1つめの実行ファイル名に記述できるのはフルパスのみです。$PATH も見てくれないし変数も展開してくれない。甘えるな。.js はフルパスじゃなくて良いの だって WorkingDirectory してるから

/usr/local/nvm なんかにシステムワイドに nvm をインストールしている場合もほぼ同じ方法が取れるはずです。

この方法だと nvm の設定によらずバージョンが固定されてしまうじゃないかという議論*1はあるのですが、僕はむしろ実行バージョンが固定されない方がヤなのでこの方法をとっています。あと ExecStart からラッパースクリプト呼ぶの好きじゃないんですよね(原理主義)。bin/hubot だってラッパーじゃないかと言われると返す言葉がありませんが。

なんなら bin/hubot に1行 . /home/user/.nvm/nvm.sh と書き足すのもいいかと思います。

以上、よき systemd ライフを。

Internet of こたつ

現代日本において必需の暖房器具とされているこたつ。皆さんのご家庭にもこたつは実装されているものと思います。

f:id:pikatenor:20161205234255p:plain (Figure.1 こたつ)

皆さんこのような経験はありませんでしょうか。

「一日中こたつのスイッチ入れっぱなしで外出してしまい電気代がマッハ」
「家に帰ったら即あったかいこたつにスライドインしたい」

今回はそのような問題の解決を目指すべく、インターネットに繋がったこたつを作りました。
猫も杓子もアイオオティーの時代です。流行りには乗っていきましょう。

遅くなりました。こちらは klis Advent Calendar 2016 6日目の記事、klis14のかみかみがお送りします。

続きを読む