ぱいぱいにっき

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

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

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

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

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

概要

「トランスヒューマンガンマ線バースト童話集」は第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ではユーザを募集しております
    • 内需要を満たすだけだと多様性がないもので。。。
  • 使って作ってみたとかあれば教えてください
    • どうぶつタワーバトルのコピーを習作として作りたいと去年末から思っておりますが、なかなか取り掛かれておりません
  • あと見栄えのするロゴね……

YAPC::Okinawa 2018 ONNASONに(行っ|喋っ)てきました #yapcjapan

こんばんわ、みなさんのYAPCは終わりましたか? 俺はこれを書ききったら終わるからみんなも書いてくれ!!!

というわけでYAPC::Okinawa 2018 ONNASONに行ったりトークをしてきたりしました。

yapcjapan.org

前夜祭

P3020010.jpg

前夜祭は国際通りのバーのようなところで開催されました。モニタが壁の至る所にあり、結構奇妙な場所でした。

同僚の@さんがspacemacsの話をされました。おそらくneovimでめんどくさい人はワタクシだと思われます。

YAPC::Okinawa 2018 ONNASON に参加できて最高だった話 - 俺イケ!!!

あとAliCloudの話をされていた方は確かに知らない世界!!!という感じでした。中国リージョンだと強そう。というか最近中国の方がOSS界でも目立ってきたねという話を近くにいたしんぺいさんと話していました。Vue.js界隈とか。

LTでやられたきれいなコードの書き方という発表もかなり面白かったです。アプローチや雰囲気がいつかのYAPCの「草とPerl」に似ていました。

www.slideshare.net

このあとの二次会でも核戦争後の世界を想定して人里離れた今回の会場であるOISTからどのように帰るかなどの話で盛り上がりました。いや、その話をしていたのは僕だけかもしれません。

本編

朝8時に県民広場に集合して、そこからバスで向かうという感じでした。ところで周りを観察すると一般的にWebエンジニアは朝に弱いと思われますが、土砂降りの雨にも関わらず集合率が異様に高く、もしかすると遊園地に行くときだけ早起きする小学生かな?という感想を抱きました。とはいえ朝のトークも皆さん見てくれるので朝にトークする側にとってはとてもうれしいですね。

P3020014.jpg

これは集合場所の県民広場です。

OISTについたあとの写真はどうせあとから公開されるだろうから撮っていませんでした。

見たトークに感想を言っていきます。スピーカーの方々の名前は敬称略です。

Webサービスを監視するときに僕達が考えたこと id:papix

Webサービスを監視するときに僕達が考えたこと / YAPC::Okinawa 2018 // Speaker Deck

個人的にベストトークです。スピーカーチケットしかなかったので投票できませんでしたが。実際世間的にも2位だったようです。

普段は外に出されにくい監視とサービス運用に関するあれこれが濃く詰まったとても秀逸なトークだと思いました。とくに「何故監視を行うのか」「何故アラートの棚卸しを行うのか」など理由とやることがセットになった話というのは僕は大好物です。なので僕がトークをしてもそのようなふうになります。

監視というのはまさに職業Webエンジニアでないと直面しない問題であり、業務で体験しないとなかなか知ることの出来ない知識なので、サービス運用をしたての新人の方などにおすすめなスライドだと思います。

HTTP/2にまつわる事実と誤解 Kazuho Oku

視点と検証という感じでした。内容としてはHTTP/2とHTTP/1があるけれど、ぶっちゃけどっちが速い?というちょっと考えるだけだと「色んな要素があるよなあ」と思ってなかなか答えられないことを、様々な視点からベンチマークを行って「実際色んな要素が関わってこういうときはこっちが速くてこういうときはこっちが速いよ、あなたのお客さんはどれに当てはまるだろう?」というグレーをグレーと言い切るための手法を教えられたトークでした。僕、こういうトークも好きです。僕はモバイルがお客さんで、レイテンシも多ければパケロスも多い環境なわけですが、QUICとかだとどうなんだろうと思ったりしました。まだ真面目には調べていない。

そろそろPerlでのHTTP/2について触れたい xaicron

そろそろPerlでのHTTP/2について触れたい // Speaker Deck

僕のトークでも言っていることなんですが、最近のプロトコルって非同期通信を多用して1本の通信路をフル活用するので、それはそれでLLにとっては厳しい環境といえるんですよね。なので出てきたAnyEventを使ったHTTP/2のコードはやはりキビシ〜ってなりました。とはいえプロトコルパーサーがあって、それが使えること自体はすごく意味があって、簡単に使えるラッパーを書いたりするのもこれで出来るんじゃないかなーと思いました。CoroとかPromisesとか使ったらもっと簡単にかけないかなとか。出来るってことで勇気がもらえたトークでした。

曖昧な文脈文法となんか論理的な話 @

ああ、はじめはパーサーとか書いたことあるでっていうノリだったんですが、だんだんわからなくなり、最後のテイラー展開でパツンとつながったという感じでした。とはいえ、パワーワードが連発してわからないけれど面白いタイプのトークで面白かったです。22の壁とか。研究者の方で話が面白いのは違反でしょうという話を後でしていました。

High (Availability|Performance) WebSocket for Perl Real-Time Application id:mackee

ワイのトークや。後述。

Inlineモジュールの世界 id:moznion

The World of Inline Module // Speaker Deck

「Inlineモジュールは人を脅かすときなどに使える」確かに驚きました。こういう悪魔合体系のモジュールはギリギリAcmeでギリギリ実用的みたいな世界観があり、僕も曖昧になりたいと思いました。というかnumpyが早すぎるんだよな、それが違反です。libnumpyみたいなのが出てきてみんな幸せになって欲しい。moznionさんのトークはいつもどおり大変楽しめてよかったです。

Perlコーディングテクニック2018 id:akiym

Perlコーディングテクニック2018 // Speaker Deck

このトークではPerlってやっぱり多様性があるなあと思いました。他の言語だとクラスの作り方が何種類もあるみたいなことはあんまりないと思うし、バリデータも選択肢がたくさんあることはあまりないかと思うんです。けれどPerlだとセンスのいい人が「これはどうだ?」と提案してそれが使われるみたいな世界観があり、人によってはどれを使えばいいんだよ!ってなるけれど、言語が提供するものではなくそれ以外の人が提案して幸せになっていくのもよいのではないかなと僕は思いました。

A bridge to my carrier by the Perl @

A bridge to my carrier by the Perl

YAPCのキーノートはこういう有名な方のルーツを追えるトークで、僕は大好きです。はじめのほうは写真が気になって仕方がなかったけれど、写真がどんどん話の本筋に絡んでいくのは面白かったです。あと僕は2000年前後のインターネットをギリギリ体験した人間だと自分では思っているんですが、そのときに思った掲示板とかWebサービスを作るかっこいい人が地続きで回りにいるんだなあと思うと感慨深くなりました。

LT

ベストトークの芹川くんは僕が連れてきて来ました。なんや!それぐらい言うてええやろ!!! とはいえうちの会社の人は新卒氏含め口がうまいのですごいな~と思います。つまり技術ができてトークが出来るだけでは目立てないので危機感を感じました。あとKindle Oasisうらやましい。内容は。。。ごめんな、、、、なんでも聞いてくれな。。。

PPRとKeyword::Simpleの話はちょっと興味がある話題で楽しかったです。ただ、動的解析になっているので静的解析したい!!! そのためにPPR使えんかなと思っている今日このごろです。どなたか知見を持っていませんか?

自分のトーク

speakerdeck.com

本番投入もしたし、満を持してkuiperbeltの紹介をしてやろうと意気込んでいたんですが、書いているうちに「ミドルウェアの作り方みたいな話のほうが刺さりそう」と思って方針転換してやったトークでした。皆さんいかがでしたか?

あと、WebSocketをLBに入れる入れないという議論があり、今までの前例ではLBに入れない方が多く、Twitterでも「LBに入れるのはつらそう」という意見がありました。で、僕はこのトークではWebApp側がWebSocketのサーバの管理をしたくないからという説明をしたのですが、それだと弱いのかなあと思い、会社Slackでこのトークにも出てこられたid:sfujiwaraさんに「LBなんで入れてるんでしたっけ」と質問したところ、

  • TLS Terminationをサーバでしたくない
    • 証明書の管理とかしんどい。AWSならALB挟めばACMが使える
  • 落ちたやつの切り離しを勝手にやってくれる
  • そもそもコンテナ化してポコポコ生まれはボコボコ生まれる環境ではそれぞれがインターネットにさらされるのはキツイ
    • 弊社ではkuiperbeltはECS上で運用しています

などなど、現在の弊社のアーキテクチャだと必然的にLBに入れざるを得ないと言われました。

これとは別に思ったのが、僕はアプリケーションを書く人間で、fujiwaraさんはインフラをやる人間なのですが、出自が違うと同じミドルウェアであっても視点が少し違うんだなーおもしろいなあ、と思いました。

そんな感じでこのトークを聞いたりスライドを見たりして「俺はこうやっているよ」というのを是非僕に教えてほしいです。そうやって皆さんの知見を吸うために僕はトークをしているので。

あと、できればkuiperbelt、使ってみてほしいなと思います。

YAPC::Okinawa全体の感想

やっぱりこういうリゾート地でカンファレンスやるのはいいですね! 知らない人とも出会えるし、知らない文化に触れることが出来るし、カンファレンスってのは知らないことへの扉になるべきと思っている人間なので、知らない土地でやるっていうのはそれに合っているなあと思いました。地方開催最高!!!

そんなわけで次は東京なわけですが、ホームなのでやっていくぞ!!!!

その他観光

沖縄初上陸で、本編翌日の日曜日は晴れたので観光に行きました。

P3040026.jpg

ジョブキューのスライドに使えそうな信号機があるステーキ屋に行ったり、

P3040072.jpg

首里城で石製だったりタンパク質製の猫にあったり、

P3040210.jpg

泡盛コーヒーで破滅している人間を眺めたり、

P3040221.jpg

P3040223.jpg

コンクリート製のクジラに会いに行ったり、

P3040224.jpg

P3040226.jpg

クジラに取り込まれた魚介類の表情を眺めて死後の世界での気分を想像したりしてました。

あと、ルートビア大好きっ子なのにエンダーに入ったことなかったのですが、念願のエンダーにも行けました。

沖縄最後の飯はやっぱり

そんな感じで沖縄は体験が最高という話でした。皆様ありがとうございました。

P3040312.jpg