ぱいぱいにっき

Pythonが好きすぎるけれど、今からPerlを好きになりますにっき

YAPC::Tokyo 2019で静的解析の話をしてきました #yapcjapan

こんにちはこんばんわ、トーカナイザの守護霊ことmacopyです。

YAPC::Tokyo 2019に参加してきたので、そのご報告です。

喋ったトークについて

speakerdeck.com

「Perl5の静的解析入門 機械と人間双方の歩み寄りによる平和編 」と題して発表しました。喋ったこととしては

  • 一般的に静的解析とは
  • Perl5における静的解析ソリューション
  • PPRというモジュールの使い方の例
  • 静的解析がしやすいコードを書こう

という感じです。スライド的にはこの後に

ということが書かれています。事前の練習通りのところで終わったので、想定どおりですが、やはり不完全燃焼ですね。静的解析自体がマニアックな課題なのでなぜそれが必要なのか、それをやりたいのかの説明が必要です。でないと聴衆側は置いてけぼりになってしまう。これは僕のどのトークでもそうなんですが、扱うことがマニアックで前提の話が長くなる。

YAPC::OkinawaのWebSocketの話も同じことになったので前半部分をあらかじめスライドとして公開したのですが、それでも当日の反応を見ると観衆を置いていってしまったような印象を受けたので、今回はスライドは2時間前に全部公開しつつ前半しかやらないということにしました。が、それが誠実なのかどうか、、というのは、、、すみませんです。。。

どこかでフルで話すか、もっと深掘りするかなどしたいですね。ここで話してよという方がいれば日本各地どこでも向かいます。

聞いたトークについて

  • 2019年冬のPerl
    • 5.30の開発についての話があったが、盛り込まれるコミットが少なくなり、CPANでも開発者がいなくなっているという話が寂しく思えた。一方Perl6は6.dの仕様が出て盛り上がっているように見えて対照的な印象を受けたが、あとからどっちもどっちではという感じのことを言われてまあなるほどだなと思った
    • 言語コミュニティというのは多かれ少なかれ人が作るものであり、他人が作らなくなったからと言って、自分が作れなくなるというのは違うと思う。Perlの開発者はマイノリティになりつつあるも、使っている人はたくさんいてナレッジはいて活躍する場もまだ残っているので、ここに参入すればブルーオーシャンである。みなさんどうですか

  • Perl to Go
    • 僕もPerl書きつつGoを書いているクチなので、「あ〜わかる〜」という感じでした
    • DB周りは僕も苦しんだのでスライドをじっくり読みたい
    • GoはPerlよりも命名センスが問われる気がする

  • PerlプログラムでPerlプログラムを修正する方法

    • perlbrewの作者であるgugodさんのトーク
    • 僕の直後かつ僕と結構内容が被っていて内心「申し訳ないな...」と思って聞いていた
    • Perl::Criticでreviewdogは、僕のトークの事前調査でやっていたことにひとつなので入れなくてよかったと思った。ちなみにreviewdogがうまく動かなかったので、自前でGitHub PR Review Commentに書くやつが手元にPerlスクリプトとしてある
    • go fmtしかりeslint --fixしかり、コード整形や良くないコードを自動で修正するというのは流行りではあるが、それにPPIを使うのはなるほどなと思った
  • レガシーPerlビルド 〜現代に蘇るPerl[1..5].0とPerl6〜

    • アナグラくんの発表だけれど、完全に面白い
    • 考古学と銘打っているけれど、こういうの僕は大好きです。地元の郷土研究しているおじいさんが本を書いて図書館に寄贈みたいなパターンあるけれど、あれをPerlでやっているみたいな
    • プログラムをビルドすること一つとっても、研究対象になりうることがわかるし、現代ではPerl5を用いて実現していることがPerl5より前には存在しないので、どうしていたのか、鶏卵問題!!!ってなるので面白いですね
  • WebVRで作品を作って展示しよう

    • WebVR実用段階ってなった
    • 僕もWeb技術は好きなので、HTML書くノリでVRがやれるのは良いなと思った
    • 長年つけていた夢日記を流そうというのが面白いし、運用のハックなんかも見れて、意外に実用的〜となった
    • Oculus Go買っちゃうかQuestまで待つか迷っている日々です
  • ISUCON8予選問題作成の裏側

    • 僕も決勝問題作成の裏側にいたので苦労が忍ばれます
    • 過去のISUCONのアンサーというのがコンテキストがあっていいなと思った。若干ウェットだし、嫌われる人には嫌われるかもしれないけれど、隠し味として歴史を使うのは良いと思うんですよ
    • 解ける問題にする と 解き方はいろいろあるようにする というのが結構相反する性質を持っていて、当日は解ける問題だよね、大丈夫だよね!?ってなるし、実際決勝はそんなことが話されていたりしました。しかし決勝で優勝した解かれ方は想定と違うアプローチだし、エンジニアリングって楽しいなってなる
  • 多くのCPAN Authorに育てられ、息をするようにCPANモジュールを書けるようになり、そして分かったこと

    • Songmuさん本当に良かった...
    • こういうエモトーククリティカルヒットする瞬間ってあると思うし、エモトークやって最大限効果を発揮するコンディションってあると思うけれど、それが今回だったのかもしれないなあと思う
    • エモは共感呼んでなんぼで僕は大いに共感を得ました
  • LT

    • npmはCPANクライアントっていう話が面白くて、社内のHTML5チャンネルでシェアしたら、弊社でUnityで似たようなことやっている人がいた
    • xtetsujiさんのPerl入学式のLTも和やかな感じがあり良かった。ちなみに懇親会後の2次会はPerl入学式の方々と朝まで語ってました
    • 門松さんもPerl入学式からの方ですが、自走する人を見つけるというのは興味深いアプローチだなと思った。最近の僕はいかに自走するように仕向けるかを考えている....
  • tokuhiromさんのキーノート

    • Okinawaのyappoさんに引き続き、どのようにコミュニティとやってきたかという話だった
    • 意識的にやっていったわけではないかもしれないが、コミュニティはやはり人が作るものであって天から降ってくるものではないなと思った。コミュニティ作りやっていくぞと決意した

そんな感じで、様々なトークに様々な示唆を得て大変価値のある時間でした。

次は未定とのことですが、次も是非参加したいですね。よろしくおねがいします

トランスヒューマンガンマ線バースト童話集 を読んだ

トランスヒューマンガンマ線バースト童話集

トランスヒューマンガンマ線バースト童話集

これです。ネタバレ?あったらごめんなさい。これは書評ではなく読んで思ったこと考えたことです。

概要

「トランスヒューマンガンマ線バースト童話集」は第6回ハヤカワSFコンテスト優秀賞受賞作の作品が単行本化したものとのこと。そもそも僕がこの本を知ったのはこの書評を見てから

huyukiitoichi.hatenadiary.jp

僕はこの本と同じような「童話の下書きにしたSFショートショート」を同人誌でやっていて、一緒にサークルやっている人との会話で「おいガチ勢がいるぞ」という流れで見つけて買ったのがきっかけ。

SFリテラシの話

この本はタイトルにもあるように、

がガジェット、あるいは話の骨子となる道具として使われている小説である。

この2つのワードがある小説といえば、イーガン先生のディアスポラなんですけれど、

ディアスポラ (ハヤカワ文庫 SF)

ディアスポラ (ハヤカワ文庫 SF)

ディアスポラはなんか最終的に地球なんて言う一箇所に固まっているとガンマ線バーストとかいうイベントに耐えられないから散り散りになろうぜとか、その過程でファーストコンタクトものになっていくんですけれど、トランスヒューマンガンマ線バースト童話集にもガンマ線バースト後に地球の外に出る力学が働く描写らしきものはある気はする。

けれどもディアスポラのやりたいことは地球外生命体を探すきっかけとしてガンマ線バーストを使うことだったり、トランスヒューマンの「発生」ついての描写とかをやりたかったのかなと思う。

それに比べてトランスヒューマンガンマ線バースト童話集は、銀河ヒッチハイクガイドのような雰囲気だった。モンティ・ホール問題のくだりとかね。MPSのくだりとか絶対作者ニヤニヤして書くなこれってなる。僕もなると思う。

つまりこの2つは道具は同じであれど、描く枠が全然違っていて、ディアスポラは道具の前後をやりたいわけだし、トランスヒューマンガンマ線バースト童話集は道具を使って笑かしにきているわけだ。

ただ、この笑いを楽しむにはどれだけのコンテキスト、リテラシが必要なのだろうかと思った。

まず、童話の知識が必要である。シンデレラを知ってないとシンデレラが脱出するところで警備ロボに具体の足首を撃たれて、足ごと王子様のところに残してくところで笑うことは出来ないだろう。僕はここでこの話、大好きってなるんですけれど。

そしてトランスヒューマンに関する知識であったり、現代SFを覆う機械知性だとかそういうのがあんまり説明なしに出てくるので、知らないと少しのけぞるかもしれない。というかイーガン先生の話が読めたらこの本はすごく楽しめると思います。めんどくさいオタクの言説になってきた。

とはいえ、もしかしたら知識がなくても面白いかもしれない。「みらいみらい」から始まるシンデレラの話はすごく期待を膨らませ、謎の魔女のツンデレなところとか、実はアツいところとかあるし、おそらく読者の期待するであろうSFシンデレラがそのまま出てくるので、軽い筆致も相まってグッと引き寄せられる。

一方、竹取物語となるとノリが変わってくる。読者の取り分がほとんどだったシンデレラから、作者の取り分が徐々に上昇していくような。まず竹が簡単な知性を持っていて、竹取の翁とかに電子戦を仕掛けてくる。かぐや姫は半ばトロイの木馬的な感じで竹に規制して生まれるわけだけど、そこからは攻殻機動隊の少佐バリの高性能っぷりを発揮する。面白い。ちょっとデカイ設定が入ってくるのがうーむとなったけれど。

白雪姫はちょっと悲しい。仮想現実の話が社会問題になって、オオゥそうかとなる。ここから雲行きが変わっていく。4つ目の話の下敷きはさるかに合戦なんですかね? ちょっと自信がない。カニが主人公なのと蜂が出てくることからそういうふうに思った。なんでわからんのかというと、前半3つとは違って、話の流れを原作どおりに踏襲していないからだ。あと主人公がトランスヒューマンじゃなくてカニだしね。あとテナガエビとシャコとタダタダタダヨウガニが仲間。タダタダタダヨウガニに至っては劇中ではTTCと言って、群体が1つの知性を持つみたいな感じの描かれ方をしている。うぉー、ハードSFだぜ。ただ笑かしにきてるけれど。そもそも甲殻機動隊っていうタイトルだしね。ただ、カニ部隊視点でアクションやってるもんだからだいぶ読み進めにくい。後半になってくると慣れてくるんだけれど慣れてきたところで終わるみたいな。スラスラ読めるアクションものを書くのは難しい。自分で書く時はもはや戦闘描写は諦めて、データとそれを見つめる戦術AIとの対話みたいなののほうがまだ読みやすいのが書けるんじゃないのとは思うことがある。ただ、これが行き着くと富野アニメの口喧嘩になるのかもしれない。

モンティ・ホールころりん、もといおむすびころりんはとにかくウィットだらけで面白い。ここで出てくる特異点コンピュータっていうアイディアは好き。しかしこれを叩き割るんだよな。ちょっとだけ人間やっててトランスヒューマンもかわいいところあるなってなった。アリとキリギリスは完全に人間っぽい話で、とにかくウェットなんだけれど最終的に今までの話を折りたたんで、なるほどこういうふうにつなげるかとなった。竹取物語のところのデカイ話は全く触れられてないけれど。

そういうわけで、キーワードをググりながら読むともしかしたらSF入門になるかもしれない……どうなんだろう?

ですます調の功罪

昨今、僕の話でも結構な割合で「ですます調」を採用することが多くて、まあこれなんでだろうなと思うんですけれど、話がやりやすいからですね。ですます調の時点でほとんどのケースで地の文は三人称になると思うんですけれど。いや、丁寧なおじいさんが一人称でやってるとか日記とかね、あと過去のインタビュー形式とかそれでですます調を三人称以外でやることもできるとは思うんですけれど。それはもっと技巧的というか。

ここでいう話がやりやすいって、話を聞いてもらいやすいってことなんですけれど、別の「だである調」だとなんかドギツイ。「ええ、そうなの!?」ってなる。ですます調だといきなり不思議な事が起こっても「ふむー物語だからそういうもんか」ってなる。童話は「ですます調」で読み聞かせてもらっていますからね。物語を物語であると認識できるから、その分受け入れられる器が広いわけで。

ただ、感情移入という点では劣る。三人称という時点で劣ると思うけれど。三人称にも神視点と個人視点?があるけれど、個人視点ではない三人称はどうしても感情移入がしにくい。SFってそもそもが説明になりがちなもんだから、「この話って小説なんだっけ、未来技術の解説書だっけ?」の狭間で揺れ動く。いいエンタメやってるSFは物語がちゃんとある。ガジェットがバキーンバキーンぶつかっているものにはならない。だけど物語に感情移入って必要だっけってなると必ずしもそうではなくて、感情移入ってたぶん読みやすさパラメータが上昇する変数なんじゃないかと思って。読みやすさは面白さにつながると思うんだけれど、面白いってその軸だけじゃないし、必ずしも「面白い小説」に必要なものではないかもしれない。

ここまで書いてきて思ったけれど、三人称神視点だと感情移入できませーんってのは、もしかして読解力が低いから!?とおもったけれど。

「ですます調」は便利だし、それなりにテクい事ができるので最近のマイブームだし、そもそも童話集という体のこの本では必須の要素だと思う。

巻末の講評

ただ巻末の講評で審査員の方が「普通のSFが読みたい」と言っていて、テクに走るなと解釈した。そもそも普通の書き方でちゃんと書けないと、テクい書き方でもうまく話を書けないよねっていう。別の作品に対する感想で「斜に構えすぎ」もあった。面白い。サプライズな面白さが講評にあってずっと笑ってた。

まあ明るいSFも読みたいよね!ってのがある。なんかデカイ根底のテーマがあって、話の始まり、つまり問題提起からやってガジェットやらなんやらでオチまでつなげるのもあれば、このオチやりたいから逆算で組み立てるのもあるとは思うんだけれど、アイディア一発勝負だと、伸びが無いと言うか、そういう感じなのかなと思った。あと書くときの技量もいるしね。僕も同人で戦闘機アクションとか書いてましたけれど、「お前にはまだ早い」って言われたことありましたね。やりたいことに技量がおっつかないというか。身の丈にあったことを書いて鍛えるのが大事なんだなって。SF書くのはこう思うとフルスタックだわ。

というわけで皆さんも読んでみてください。

2018年の振り返りと2019年の抱負

あけましておめでごうとございます。

最近自宅Macの環境をデュアルディスプレイにしたんですが、スリープ後に認識しなくなるなど、調子が悪かったのです。調べたらMojaveにアップデートすると治るらしいので、Fateの番組見ながらアップデート待って、ロード・エルメロイII世の事件簿が始まるぐらいに終わって、再起動したら以前真っ暗。。。ドライバインストールし直したりしてて、最終的にディスプレイ側のケーブルを抜き直したら直った。。。なんなんや。。。

デバッグで2018年が終わり、デバッグで始まった2019年ですが、年中デバッグしている予感がします。

2017年はこちら 2017年の個人的なまとめ - ぱいぱいにっき

登壇

2018年はそこそこ登壇しました、と思ったら残っているスライドは2つだけだった。しかしこの2つがデカかった。

YAPC::Okinawa ONNASON 2018

speakerdeck.com

mackee.hatenablog.com

WebSocketミドルウェア、kuiperbeltの話です。この時点では、この後に直接関わるプロジェクトでは導入されておらず、社内の関わってないプロジェクトに導入されている状態。

ちなみにこの時は2泊3日で沖縄に行ったのですが、9月にも沖縄に行ってて、これはOkinawa.pm #7でした。このときは箱庭諸島CGIの話をしました。あと、5日ぐらいいて、レンタカーも借りてあちこち回ったので満足満足という感じです。どこかで写真をあげよう。

CEDEC2018

speakerdeck.com

CEDEC2018

こっちもkuiperbeltの話。このときには導入されている関わっていたプロジェクトがリリースされた直後でした。来年早々にクローズしちゃうけれど。。。まあそれは仕事のところに書こう。

CEDECは、聴講者がアンケートを書くのですが、その集計結果はスピーカーにも来ました。概ね好評だったようで良かったです。ただ、コンシューマの人には物足りなかったかもしれないと思ったし、そこまで厳しい仕事はやってないので、機会があればそういうリアルタイム通信もやっていきたいですね。

その他

Okinawa.pmで沖縄行ったのと、その流れででLTしたり。LTもCGIの話ですが。あと、Gotanda.pmpostderefの話したり。他にもなんか忘れてたら教えてくれ!

仕事

  • 1月: 後述する理由でほぼ休み
  • 2月: 去年ずっといたチームに復帰 (Perl5)
  • 3月〜9月: 今いるチームで負荷試験やらリリースとかをやってた (Perl5, 負荷試験でGo)
  • 10月: 社内向けシステム作ってた (Go, Vue.js)
  • 11月, 12月: 9月までいたチームに復帰した (Perl5)

だいたい、Perl5書ける人がなかなか少なくなってきているというもあって特定プロジェクトに張り付いているみたいなのもあったかなあと。

2018年の仕事の仕方を考えると「今までの貯金を使いつつ、やってたことから少しはみ出すことを身につける」みたいな感じでした。あとコミュニケーションで失敗を繰り返したり、ああしてればみたいなことは今でも考えるけれど、反省できるだけ幸せでは? という気持ちですね。

私生活

身体

1月にまた骨を折るというのがハイライトでしょうか。今回は結構ひどくて、今でもリハビリに通っています。普段生活する分には問題ないし、体力も回復しているとは思うんですが、右肘の可動域が戻ってないという感じ。2019年こそ骨を折らない、むしろ一生骨を折らないのが人生の目標です。

同人誌

5月と11月と12月に出しましたが、5月,11月はフリーペーパーしか書けないぐらいに落ちぶれたのですが、12月はなんとか新刊を書きまして、フリーペーパーも調子が良かったので「小説の書き方思い出したのでは?」というのが本音です。なんかやり方分かってきた。

ゲーム

2018年にやったゲームってMHWとCities Skylinesとイカ2(継続)とDQビルダーズ2(今やってる)ぐらい? あ、AssetoCorsaやる環境も整えたんだった。

電子工作

3Dプリンタはちょいちょいやってますが、ハンダとかはやってなかったような。あ、キーボード作ったんでした。

www.instagram.com

今でも自宅で使っています。今打っているのがこれ。会社ではkeyboardio使ってます。

あと、ハードといえば、buildersconのノベルティとして電子名札を配りました。

blog.builderscon.io

uzulla.hateblo.jp

板をFusion360モデリングして、レーザーカッターでMDFを切るみたいな担当をやりました。実際皆さんが持っているやつは業者さんに切るのをお願いしたやつですが。こういうプロダクトデザインも面白いなあと思いました。

カンファレンス

builderscon::tokyo 2018ではコアスタッフとしてやってました。名札の板を切る人担当です。コアスタッフやってたらいろいろ思うことがあり、会社でも勉強会おじさんをやり始めました。自称社内勉強会オーガナイザー。

2019年の抱負

仕事は、軸はバリュー出せる今持てるものを使いつつ、全く新しいことにチャレンジしてみたい気持ちもします。C#/Unityはさすがにやらないといけないかなあ。あと、去年はAIとかそういう引き出しがなくてつらくなったこともあったので、ゲームAI、機械学習問わずそういうことを身につけるのも全く新しいチャレンジになりそうです。

身体は骨を折らない。骨折らないアクティビティはやっていきたい。

文は書く。ブログも他愛もない日常をやったり適当なショートショートをやるやつも書いて良いのではないか、もっとハードルを下げてやるのが良い気がする。

電子工作はドローン再開かなあ。アンダー199gクラスをやりたい。

ゲームは2019年はACE COMBATはじめいろいろ出るのでやらねばという感じ。いろんなアーマードコアも出ると思いますし。

登壇は来年はYAPC::Tokyo 2019がまず来ますが、その後もコンスタントにやっていく。Web以外、例えばハードウェアの勉強会とかにもお邪魔したいですね。

まとめ

したいことがいっぱいある、というのは引き続きですが、どうせやれるのは2割ぐらいでしょう。それぐらいに人生や自分の力を見積もっている。ただ、例年より穏やかな年末年始を過ごしているので、2019年はもっと大人になりつつアクティブさは維持するみたいなのがエモなところです。以上。

GitHubにメール書いて放置アカウントを消してもらってkuiperbelt organizationを作った

要約

  • そろそろ合ったほうがいいなと思ったので、kuiperbeltのGitHub Organizationを作ろうと思ったら、もう既にそういうユーザがいた
  • 見てみると最近活動していなさそうだったので、GitHubにメールを送って名前空間を開放してもらった
  • すぐにkuiperbelt organizationを取ってmackee/kuiperbeltをtransferしました

経緯

  • DockerHubのautomated buildでimageを作ってもらう関係上、kuiperbeltリポジトリに同居していたサンプルアプリを別リポジトリに追い出そうと思った
  • mackee/kuiperbelt-sample-appだとしまりがないので、kuiperbelt organaizationを取ろうと思った
  • でも https://github.com/kuiperbelt は誰かのアカウントとして取られていた
  • 最近使われている形跡がない……2013年に作られてリポジトリはなくどこかのリポジトリに何回かコミットした程度
  • ここで以下の記事を思い出した

lestrrat.ldblog.jp

efcl.info

  • 某Slackで上記ブログのlestrratさんに聞いてみたら「突撃あるのみ!」と背中を押してもらったのでメールすることにしてみた

GitHubにメール

  • 上記azuさんのブログに「問い合わせフォームよりはメールのほうが速い」とあり、まあそりゃそうだよなと思って直接メールした
  • 文面は自分で書いてみようと思ったが、だいたい参考にしたazuさんのものと同じような感じだった
  • で、送ったら20分で返ってきた
Hi Taniwaki,

You are in luck — we have classified the kuiperbelt account as inactive and released the username for you to claim, as per our Name Squatting Policy:

https://help.github.com/articles/name-squatting-policy

Be quick, as the username is now publicly available.

Have a great day!
  • このName Squatting Policyの存在は知っていたが(というか知ってたから問い合わせたんだけれど)、あまりにも早すぎてびっくりした
  • 返信来てからメールを確認するまで1時間ほどたっていたので急いでkuiperbelt organizationを取った

ogranaizationへの移管でやること

  • Goはcodeに自分へのインポートパスがgithubのフルパスで書かれていることが多く、置換が必要
  • また、ドキュメントにもコードへのリンクやインストール方法などで入っていることがあるので置換する必要がある
  • やった

github.com

  • 見落としていたのは.travis.ymlでタグ切った時にリリースバイナリを作るところでリポジトリ名を指定していたのでここもやらないといけなかった
  • DockerHubも同じようにOrganizationを作ってdocker pull kuiperbelt/kuiperbeltで利用できるようにした

まあいろいろやった。あとこのブログ書く時に確認したらhttpsに出来ててめでたい。

そろそろ正式サービスが始まる#arukas でkuiperbeltを動かしてみる

arukas.io

これで

github.com

を動かす話

要約と言うか感想

  • Arukasは簡単だけれど、その裏返しで制限が厳しい
    • private registryにはまだ対応予定状態だとか
    • VPNっぽい仕組みがないとか
  • kuiperbeltが想定している環境ではない
    • 特定のコンテナに対する通信がしたい
      • コントロールパネルやAPIからはホスト名とポートを取れる
      • コンテナ自身が割り当てられている環境を知る方法はなさそう?
        • 環境変数とかで知れるようにしてほしいと要望メールした
        • 追記: Twitter眺めてたら取る方法を発見した。下の方に追記してます
  • データストアとArukasは非常に相性が悪い
    • と言うかストレージが無い
    • MySQLだとレプリ組んでなんとかするとかRedisでもそうするとかそういうレベル
    • そもそもDocker自体とも相性が悪いのだけれど
    • 海外のContainer as a Serviceであるhyper.shにはあるらしい
  • kuiperbelt instance 1台構成なら出来たのでやり方を晒してみる

何を構築した?

  • かんたんなWebSocketを使ったチャットアプリ
  • kuiperbeltを使えばWebSocketとか何も考えずに作った普通のWeb Applicationでも簡単にWebSocketを扱えるようになりますというのを示したい

構成

f:id:mackee_w:20180321145828p:plain

  • Perl/PSGI Application x N
    • Plackで書いたPrefork Server
    • 別にここはRailsでもSinatraでもLaravelでもSlimでもDjangoでもFlaskでもExpressでもなんでも、Webサーバーであればなんでも良い。僕がPerlならサクッと書けるからそうしただけ
    • ここはスケール可能で、詰まったら何台でも並べられる
  • Redis x 1
    • 高可用性取るならレプリケーションしたほうが良い
    • というかコンテナでデータストア運用するのが(ry
    • ここもRedisじゃなくてもKVS的な機能を持っていれば良くて、pub/subとかは使ってない。SET型使ってるけれどmemcachedであれば、カンマ区切りで複数個入れるのでも良くて、と思ったけれどアトミックに要素を出し入れするのは考えないといけ無さそう
    • ぶっちゃけRDBMSでも良い
    • というか認証も暗号化もかかってない。ノーガード戦法で平文をインターネットが漂っている
      • ホストとポートを推測しにくいものを使って、パケットがArukas内部で収まっていることを祈りながら使っているけれど、みなさんは真似しないように
      • ローカルのredis-cliから繋げられてデバッグに便利
  • kuiperbelt x 1
    • アイコンはWebSocketのロゴらしいです
    • ここが現状1台なんだなぁ
    • いや、今回はAppのほうでkuiperbeltのエンドポイントを返すようにしたのでそこを複数個にしてクライアントがランダムで何処かに繋げば複数台が可能
    • ここには課題があります

kuiperbeltがのびのびと動くための条件

  • のびのび=クライアントからのWebSocketを扱うkuiperbeltが複数台でロードバランサー配下に収まって機能する
  • Web Application側がメッセージをクライアントに送る時に対象のクライアントがどのkuiperbeltにつながっているかを知る必要がある
    • この情報は接続時コールバックで渡ってきてWeb Application側がKVSとかに保存する
  • 接続時コールバックでWeb Applicationに通知するための「外からつながる自分のホスト名/IPアドレスとポート」をコンテナ自身が知る必要がある

Arukasでは

  • アプリケーションは単一のエンドポイントを持つ
    • これが曲者でアプリケーション起動時に設定したポートに飛んでいくが、httpsしか対応していないっぽい?
  • コンテナ一個一個にホスト名とポートが割り当てられる
    • これらはガチャ
  • コンテナごとに割り当てられるホスト名とポートをコンテナ自身が知ることができれば勝つる
    • 現在は敗北してます
  • しょうがないので1アプリケーション1コンテナ、増やしたいならアプリケーションを増やす、この辺のリストはWeb Application側に環境変数で渡せるようにした
    • このやり方でも無停止でkuiperbelt側を増やすことが出来る
  • 1コンテナでも512MBもメモリがあれば2500接続ぐらいは余裕で持つ事ができるわけで、全然問題無さそう。メッセージ数はちょっとあれだけれど
    • 今のやつはつながっている全員にブロードキャストしているので危ない

設定例

kuiperbelt

f:id:mackee_w:20180321152806p:plain

webapp

f:id:mackee_w:20180321153037p:plain

redis

  • redis:latest指定して立ててるだけ

展望

  • 前述のhyper.shでも試してみる
    • つながるIPをコンテナにアタッチできるみたい
    • ドキュメント見る限りはそれでもやはりよしなスケールは出来無さそう?
  • GKEもといkubernetes...
  • もっとちゃんとしたアプリケーションを作る
    • このサンプルアプリだと見た目で夢が広がりにくいかなあ
  • あとコンテナで監視ってどうやるんだろう。。。

追記:2018-03-22

Twitter眺めてたら、 pottavaというイメージをArukasで立てている人がいて、そのコンテナのURLを叩いてみると、渡ってきた環境変数やらがババっとJSON APIで取得できるという代物だった。

その中にMARATHON_HOSTMARATHON_PORT という環境変数があり、値の方はコントロールパネルで見たことのあるようなものが。。。。

早速自分も同じイメージで立ててみて検証してみた。

である。つまりこれは望んでいたものではーーー?????

今のkuiperbeltの公式イメージにそのまま適用することは出来ないが、arukas用の設定ファイルを作ればいけるのでそういうDockerfileを書いてみようと思う。

WebSocketをいい感じに扱ってくれるミドルウェアkuiperbeltのDockerfileを作ってDockerHubに上げた

要約

  • WebSocketをいい感じに扱ってくれるミドルウェアkuiperbeltのDockerfileを作った
  • Docker対応のために幾つかの事柄をやった
    • オプションを環境変数で渡せるようにするとか
  • あとまあいろいろやった

経緯

  • YAPC::Okinawaで結構大々的に宣伝をした(つもり)なんだけれど、いろいろ残念なところを直しておきたいと思ったのでいろいろやっていた
  • README.md のインストール方法が腐っているとか
    • Goは基本go getでコマンドインストールできる。けれどkuiperbeltはdepで依存ライブラリのバージョン固定をしており、go getはそんなの無視して最新バージョン取ってきたりローカルにすでにあるバージョンを使おうとして、インターフェイスが変わるとコンパイルに失敗する
    • あと単体コマンドで動くやつはGoコンパイラは要らないので、release binaryを用いるのが吉。kuiperbeltは以前からこれを提供していた
  • ところでrelease binaryがあるツールはid:Songmuさん作のghgを用いると、OSやアーキテクチャを考慮してダウンロードしてくれるので便利ということが知られていますが、kuiperbeltはrelease binaryのパッケージングがghgに対応していなくて適用できてなかった
    • というのをYAPC::Okinawaのスライドを書いている時に気がついた
  • しかしパッケージングを変更すると会社の方で使われているアプリケーションで影響があるのでは?(chefレシピとか)と社内Slackで言ったら「それよりもDockerfileの変更がある」と言われて、たしかに今はDocker上で動かしているからそうか〜となった
  • というわけでパッケージング変更と公式Dockerfile/docker imageの配布をすすめることにした

やったこと

パッケージング変更

  • そういえばGoのツール作る時にビルドやらテストやらrelease binary上げるのとか毎回コピペやなって思った
    • コピペでやるよりは自分用テンプレがあるとええやろと思い、作った

github.com

  • 中身はdepとかクロスコンパイルツールgoxzGitHub releaseに生成物を上げるghrとかをインストールしたり、所定のディレクトリに生成物をはいたり、それをアップロードするMakefileの雛形みたいなやつ
  • これをkuiperbeltから使うようにした

github.com

Dockerfile作成

  • 課題として、Docker内で動作するkuiperbeltに対してオプションをどのように渡すかという問題がある
    • 現状、kuiperbeltは数多くのオプションをyml形式で設定ファイルを記述することで行っている
  • Docker containerで設定ファイルを必要とするアプリケーションは基本的にはボリュームマウントするか、イメージビルド時に含めてしまうか、はたまた起動時にS3からcurlスクリプトで引っ張ってくるとかそういうのが必要
    • 全部めんどくさい
    • 社内ではイメージビルド時に含めつつ、インスタンスによって変動しそうな要素は起動時に環境変数から設定ファイルに書き込むようにしている
  • あと、コンテナ起動時の引数で渡す方法と、環境変数で渡す方法がある
  • まあ環境変数でやるのが一番簡単
  • しかし、たくさんのオプションを環境変数で使えるようにするのめんどいなってなる
  • ところがkayac/go-configって言う便利なやつがあるっぽいのでそれを使うことにした。べんり
  • あとは最近入ったmulti stage buildなんか使ってscratchイメージベースなので結構軽い。4MBです。お試しあれ
$ docker pull mackee/kuiperbelt:latest
  • static buildしたGoバイナリってパフォーマンスにどれ位影響あるのだろうか。今度ベンチマークを取って試してみたい

サンプルアプリもdocker-composeで試せるようにする

  • 簡単なチャットアプリが_example以下に元々入っている
  • Perl/PSGI
  • PerlのPreforkサーバでも刺さらないWebSocketアプリケーションが書けるというのを示すためのもの
    • sinatraとかflaskでも作ろうかなとは思っているけれどまだやる気が出ない
  • ビルドするのに現代Perlの知識が必要だったので、これもDockerに押し込むことにした
  • 具体的にはdocker-composeでkuiperbeltとデータストアとして利用するRedisを立てつつ、ローカルのPerlアプリケーションが動作するコンテナもビルドする
    • 仕事で得た知識を使っていて、例えば依存が書かれたcpanfileだけをCOPYしておいてその上でcpmで依存入れた後に必要なapp.psgiとかindex.htmlをCOPYする戦法で行くと、依存の変更が無ければ全モジュールインストールし直しでビルド時間がなが~いにならない
    • 普段はこういう仕事を時々やってます
  • あと立ててみたら不審な動作をしていたので、チャットメッセージのブロードキャスト部分を大幅に直した
  • このコンテナも実は別タグでDockerHubから落とせます
$ docker pull mackee/kuiperbelt:webchat-example
  • 今はBootstrap + jQueryで貧相な感じの見た目だけれど、Vue.jsとUIツールキットライブラリ使ってもっとまともな感じにはしたいと思っております
  • 直している時に、そういえばXSSヤベーんじゃねと思ってネットでググって出てきたXSSロケーターなるものを入れてみたら案の定ポップアップして笑ったので、Perl側でHTML::Escape噛ました。あと、クライアントの生成したUUIDをそのまま使っているので、それを無視してPerl側でUUIDを生成するようにした。これでも大丈夫なんです
  • クライアント側にはリトライ機構とか入ってないし、アイドルタイムアウトの機能も使ってないので、そのへんも手を入れたいけれど、JSの知識がない。

その辺の試行錯誤はこちら

https://github.com/mackee/kuiperbelt/pull/48github.com

試したい場合は、

$ git clone https://github.com/mackee/kuiperbelt
$ cd kuiperbelt/_example
$ make up
$ make open

で終わりです。お試しあれ

DockerHubに上げる

  • 当初、travisのdeployにあるのかなと思ってたけれど、そんなことはなくて、DockerHubからGitHubの連携やるとwebhookか何かで変更検知して自動ビルドしてくれるっぽい。便利
    • タダ枠だからなのかしらないけれど、ビルドキュー入ってからイメージできるまでは結構時間がかかる
  • というわけで公式イメージです

https://hub.docker.com/r/mackee/kuiperbelt/hub.docker.com

README.md更新

  • ちょっとだけ気合を入れて書き換えた
  • ところで英語はかなりできないです。トラウマがあるレベル
  • 今回はGrammerlyGoogle翻訳を併用しつつ書いたけれど、まだまだ意味不明な文があると思う。つらい
  • どんな機能があるか分からんという声があったので、APIとCallbackのsummaryみたいなものを作ってみた

github.com

  • 少しは見栄えが良くなったのではないのでしょうか

お知らせ

  • kuiperbeltではユーザを募集しております
    • 内需要を満たすだけだと多様性がないもので。。。
  • 使って作ってみたとかあれば教えてください
    • どうぶつタワーバトルのコピーを習作として作りたいと去年末から思っておりますが、なかなか取り掛かれておりません
  • あと見栄えのするロゴね……