ぱいぱいにっき

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

Webサービスの障害対応のときの思考過程

起こってほしくはないのですが、あらゆるWebサービスは完璧に動作する状態を維持することは難しく、やはり障害対応・トラブルシューティングといった作業が発生します。

筆者は普段仕事で障害対応を不幸なことによくやるのですが、障害対応のスキルというのはスピードや判断の正確さが求められるせいか、今までやったことがある人・ノウハウがある人に集中し、それ以外の人は眺めるだけ・あとからログを見返すだけの状態によく陥ることがあります。

これはWebサービスを開発・運用するチームとしてみたときにそういった苦労が特定の人に集中するのは良くないので、それを緩和する目的として、筆者が障害対応時に考えていることを記述してみます。なお、これが唯一の正解ではないとは思っているので、ツッコミや、自分はこう考えているよというのを教えていただければ幸いです。

具体的な手法を避けて思考の方法を述べているのは、障害というのはパターンで解決できることはそんなに無いからです。また、Webサービスによって監視項目やロギング、アプリケーションの特性、インフラ設計などがまるっきり違います。なので、調べ方や考え方など、手法に至る過程を記述したほうがより汎用的かなと考えました。

障害とは

ここで言葉の定義をはっきりしておきましょう。ここでいうWebサービス障害とは、サービスにビジネス上のインパクトを与えるような事象が発生したときのことを指します。インパクトの大小は問わず、例えばデプロイの結果、フロントエンドのUIがデグレってしまって特定の人しか使わないような機能のボタンが隠れてしまったケースも障害とします。人によっては「バグ」だとか、「不具合」と言うかもしれませんが、ここでは乱暴にひっくるめて「Webサービスの障害」として扱います。

障害対応の段階

Webサービスの障害を人間の病気と同様にあてはめてみると、急性期回復期慢性期に当てはめられます。また、病気の期間について調べたところ前兆期という言葉も見つけたのでこれも使ってみます。

前兆期

Webサービスの障害が発現しない段階です。しかし放置すると、障害が発現してしまうような状態を指します。

ここで運用する人が認知できてきたらもうけもので、Webサービス監視というのは、こういった障害の前兆を見つけるためにアラートを仕掛けています。しかし、病気と同様で症状が出ない状態で予兆を見つけるというのは至難の業であり、そもそもこういった前兆が来ると予想してアラートが仕掛けられているのであれば、それが出ないような対策もセットで取られていて、なかなかアラートが出ない、なんてこともあります。とはいえ、対策が無効化されるような変更を、考慮漏れでシステムに加えることもありますし、不要ではありません。

またアラートにはならないが、障害の前兆をメトリックから見つけることは、普段とは違う箇所を探すことでもあり、普段を知らなければ障害を認知することもできないわけです。筆者は、新しくWebサービスを担当することになったら、最初の一ヶ月ぐらいは、毎日数十分はサービスメトリックを見て、普段のWebサービスの負荷特性などを見ます。Webサービスによって負荷が高まる時間帯や曜日なども違い、また負荷が高まったときにまずボトルネックになる部分というのも違ってきます。そのために普段を知るのが重要です。

こういった前兆を見つけた場合、トリアージを行います。たとえば1時間以内に対策を取らないと障害に発展するとなれば、優先度高とし、障害に準じる形の作業を行います。1ヶ月放置しても良い障害であればissueを立てて、週に一回の定例などで共有しタスクの割当などをすればよいでしょう。

急性期

障害が発現した状態です。障害の発現状態には様々あり、サービス全体がダウンすることや、一部の機能が使えなくなる状態、全員もしくは一部のユーザがログインが出来ない状態になったり、ごくごく特定の条件で進行不能に陥るなどあります。

こういった急性期になったとしても、障害が見える形で現れていないこともあります。先述したように一部の状態にあるユーザのみが機能不全に陥っている場合、そのユーザからの報告がないと障害に気付けないこともあります。障害に気づくにはどうするべきか。監視であったり、ログ収集を行って障害を検知できます。一般ユーザ向けのサービスであればTwitterをサービス名でエゴサーチすることも出来ますが、障害が起こったときはだいぶ心が痛むので、はじめのうちはやらないことをおすすめします。

障害が起こったときには、以下のことをリストアップします。

  • 障害の技術的な事象
    • 「ページが見られない」だけでは正確ではなく、ステータスコードは200が返るが白いページ, 404や500などの想定していないステータスコード, 200が返りHTMLは返せているが一部の画像やCSS・JSなどのリソースが取得できずに壊れているなど、技術的な情報を正確に把握することが重要です
    • 「ページが壊れている」という報告だけでは、「なにかが起こっている」しか得られません。技術的な症状の情報を得て、原因を絞り込む手がかりとしていきます。
  • 正確な影響範囲
    • 全員に同じことが起こっているのか、それとも一部の人だけに起こっているかだけでも、原因の範囲を絞り込む手がかりになります。また、対応する人も変わっていきます。全員に起こっている場合、インフラ側に近い問題なことも多いですが、一部の人に起こっている場合は、インフラ側ではなくアプリケーション側・フロントエンド側に原因があることがあります
    • しかし、キャッシュに起因する問題は影響範囲がじわじわと広がっていくなど、これだけで原因の範囲を決めつけるのは早急です。あくまで当たりをつけたり、後述するダメージコントロールの判断材料に使います
  • 具体的な再現方法
    • 影響する人が限られたり、特定のページ・機能だけに障害が起こっている場合、障害が起こっている事がわかって、症状がわかったとしても、その障害を起こすための手順が特殊である場合があります
    • 再現方法を特定するために一番早い方法は、再現した人に前後の操作など聞き取ることですが、開発チームの中の人ではなく一般ユーザからの報告であった場合、困難になります。障害が起こったときから時間が経っている場合は忘れている場合もあり、不正確であることがあります。その情報をもとに調査する場合は、まず裏を取ります。裏を取るというのは、アクセスログであったり、こういった障害やカスタマーサポートのために出している行動ログから報告された行動と照らし合わせます。数字や固有名詞は見間違いなどが起こる事が多いので、裏を取ることが大切です。
    • こういったログがあれば、報告なしにそれだけで再現手順を導けることもあるのですが、当たりをつけるという意味で、一般ユーザさんからの報告は大いに役立ちます。

急性期にはまずここまでができれば御の字で、特に再現方法などは導けないこともあります。また、一つ忘れていると思われることで、「根本的な原因」があります。原因は突き止めることができればそれに越したことはないのですが、急性期に行うべきことであるダメージコントロールには必須ではないです。

ダメージコントロール

急性期に行うことは、根本的な原因を解決するのではなく、障害の被害が拡大するのを止めるダメージコントロールです。具体的なダメージコントロールの手法としては、

  • 障害が起こっている機能・ページを止める
  • サービス全体をメンテナンス入りさせる
  • 負荷に耐えるためにサーバ台数を増やす

などが挙げられます。これらの対処法に原因を特定し、それを直す手法は含まれていません。すぐに直せるのであれば、こういったダメージコントロールを行わずに障害の根本原因を断つのもいいと思いますが、そういった対処をすぐ取れないケースは多々存在します。

この考え方は、ユーザに対して正しくサービスを提供できないサービスはサービスを提供しないことよりも悪いという考え方のもとに立っています。また、アプリケーション側のバグによって、データを破壊していき、それ以後の復旧を困難にするような障害の場合は、直すことよりも止めることをより強く推奨します。

とはいえ、機能を止めたりメンテ入りさせたりするのは、ビジネス上のインパクトが激しく、サービスのステークホルダーの判断が必要です。障害対応はエンジニアだけではなく、サービス全体の判断が下せるステークホルダーの参加も必須になってきます。この場合のステークホルダーとは、お金を管理するプロデューサーなどの人たちを指します。ステークホルダーの人たちも、もしかしたらアラートを受けるべきかもしれません。みなさんが担当するサービスではどうなっていますでしょうか?

またユーザに対して影響が少ない形で、障害を止めるためには、Webサービスそのものに対する理解も必要です。普段、ユーザさんがどのようにサービスを使用しているのか、どういった機能を重点的に使っているのかという知識です。こういった知識がない状態だと、正しくサービスを止める判断ができなくなってしまうので、普段からドッグフーディングをすることも重要です。

複数の障害発生とトリアージ

障害というのは同時に起こることがあります。大体は一つの原因が、別々の障害として表出するのですが、急性期には2つの事象を1つの原因として考えて同時にさばく暇はありません。なので同時に別々の障害に対して2つを対処する状況に陥ります。

まず、2つの事象を明確に切り分けます。この切り分けというのも実は難しい仕事です。切り分けずに全部サービス止めるというのも一つの手です。もし切り分けられたら、優先度をつけます。例えばごくごく一部のユーザにしか出てない現象は後回しにしたり、データを壊さずに表示だけの問題であっても後回しにします。データを壊すような障害は直さない限り永続的に出てしまうので、できれば最優先で直したいものです。

もし、それぞれが優先度中ぐらいで、同じぐらいの優先度であったり、バックエンドととフロントエンドなど、明確に分野が切り分けられる障害であればチームを分けます。それ以後はチームは独立して働き、進捗を報告するぐらいにとどめます。

慢性期

障害の事象自体がダメージコントロールによって収束したとに訪れるのが慢性期です。障害の原因は表出していないが、隠された状態です。まずその隠された原因を調べます。

原因を調べる手がかりとして、急性期に挙げた「障害の事象」「影響範囲」「再現方法」が使えます。また、このときにはまだ調べていなかったログや、アプリケーションコード、インフラの設定などをすべて見直して障害と原因の因果関係について迫ります。

さて、こうして幸いにも障害の原因がわかるとそれを直すということになるのですが、この直し方についても考える必要があります。

例えば、永続的データストアのデータが障害によって汚染されている場合、それを修正した上でないと直したコードであっても障害が残ってしまう場合があります。その場合、データを直すバッチスクリプトなどを流すわけですが、先に直したコードを本番化しなければまたそういった汚染データが発生するなどの状況もありえます。どちらを先にやればいいのでしょうか。

1つの方法としては、ダメージコントロールと同様に障害の原因となった機能を一旦停止して汚染されたデータが新たに発生しないようにした上で、修正バッチスクリプトを流して本番化、それから機能の提供を再開させる手法が考えられます。

もう1つの方法として汚染されたデータを考慮したコードに修正するというのもあります。しかしこういった、後方互換性を考慮したコードは後々消す手間であったり、消し忘れて歴史的経緯が消えて混乱することもあるので、できれば直したらすぐに消してしまいたいところですね。

また、アプリケーションコードの場合、原因を修正するためにはテストコードもセットで書きましょう。デグレが起こって同じ障害が起こることは往々にしてあります。筆者の体感としても、一度障害が起こった場所はまた起こりやすい傾向にあります。なのでテストを書きましょう。テストを書いてCIを回せば世に出る前に障害を防ぐことができます。こんなにコスパがいいことは他のあまりありません。

回復期

晴れて障害が原因まで解消されました。ここで余裕があれば原因の分析を行いましよう。アプリケーションコードが原因であれば、

  • 原因となったPull Request・修正はどこか
    • コードレビューの観点に加えたり、もし自動検知できるものであれば、そういったテストを書いたり、linterを入れる
  • アーキテクチャに問題はないか
    • アーキテクチャが複雑・データのバリデーションが甘い、甘くなりやすい・予想外の挙動が起こりやすいなど
    • 漸進的にアーキテクチャに小修正を加えられるならそれが一番幸せで、全部書き直すのは最終手段
  • 障害に気づくまでの時間が遅くなかったか
    • 監視項目の充実
  • 障害の原因や影響範囲を探るのが困難ではなかったか
    • ログを増して似たような障害に備える

など、見直しをしつつ、障害対応を行わなかった他の人たちが追体験できるような場を設けると、チームとしての障害対応力も向上するかと思います。

まとめ

以上、障害対応を時系列をもって考えるポイントについて挙げてきました。まとめると、

  • 前兆で気付けるのが一番良い。そのために監視とログがある
  • 障害は見つけるのも困難であることが多い
  • 障害レポートは客観的に・技術的に正確に
  • 障害収束は原因の修正が一番の目的ではなく、障害を拡大させないこと
  • 原因を修正するときは直し方も考える
  • 障害対応についての情報を積極的に周りに伝える

といった感じです。この文章がみなさんの障害対応のときの備えになると幸いです。

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

こんばんは、そろそろあけまして。

去年のやつ 2018年の振り返りと2019年の抱負 - ぱいぱいにっき

なんか読んでいると、デュアルモニターに苦労していたようですが、今もカチカチ切り替わってて目に悪いです。

登壇

色々やった気がする。

YAPC::Tokyo 2019

speakerdeck.com

Perl5で静的解析をするという野心的な話だった。それゆえ不完全燃焼に終わった面もあり、YAPC::Kyoto 2020で発展版をお見せしようと計画している。

mackee.hatenablog.com

golang.tokyo #25

speakerdeck.com

なんか静的解析ばっかりやってないか? 仕事ではそんなでもないし、何ならこの時期は自動生成できそうなコードを手でゴリゴリ書いていた気がする。

沖縄学生×企業エンジニア 7月大LT大会!!!

speakerdeck.com

アナグラ君 id:AnaTofuZ が行ったイベントに沖縄まで飛んでいった。沖縄は去年に引き続き3回目。やっぱり沖縄はごはんもうまいし、気候も良いし、いい。。。

この話はゲームのサーバエンジニアって職業がそこまでやること広まってないよね、他の業界の人や学生さんにって思って作った資料。

ただ、同じイベントであとの方に発表したこっちのほうで覚えている方が多いのではないか。

speakerdeck.com

builderscon 2019

speakerdeck.com

今年はbuildersconでトークしたし、これ以外にもゲリラのカンファレンスバッジを作成して配った。

hachiojipm.hatenablog.com

僕の中で今年、もっとも腕が伸びた技術は基板の制作だったり、表面実装のはんだ付け技術だと思う。

マスタデータNight #1

speakerdeck.com

もともとマスタデータNight的なイベントをやりたいと言っていた。

今年のCEDECでこのトーク CEDEC2019: 大規模モバイルゲーム運用におけるマスタデータ管理事例を聞いてやはりやらねばと決意し、

id:karupanerura さんをはじめ多くの方に協力していただき、イベントを開くことが出来た。その1発目のトークが上記のもの。

よく考えたら自分が発起人のイベントで一発目に話す人っているだろうか。でも、このイベントの方向性を決めるという意味で、はじめに喋ったほうがと自然に決めた。

イベント自体は大盛況で、アンケートも高評価が多かったので、早速次回を構想しています。

仕事

今年は特定のサービスのチームに所属するのではなく、要素技術の研究開発や、社内の共通ツールの整備などをしていた。会社ブログのAdvent Calendarに結構書いた。ドメインに密着していないことをやっていたからか、外に言えるようなことが多く出来たとも言える。

CircleCI API v2で自由自在に業務ワークフローのタスクを実行する - KAYAC engineers' blog

runc脆弱性に対応するためにうっかりECSからFargateにしました - KAYAC engineers' blog

ゲーム内お知らせをHugo+Netlify CMS+CircleCIで作りました - KAYAC engineers' blog

GitHub APIを使うBotたちのGitHub Appsへの移行 - KAYAC engineers' blog

新マスタデータ管理システムakashicの開発 - KAYAC engineers' blog

GoのDBライブラリと俺たち、それからsqlla - KAYAC engineers' blog

Lambdaを使ったサーバレス構成の社内アプリのデバッグのためにX-Rayを使ってみた - KAYAC engineers' blog

社内勉強会をサロンにmigrationしました - KAYAC engineers' blog

今年はこういう仕事してて、なんだか今まで一番肌に合う仕事だったなと思う。孤独感も感じることもあったが、僕は技術でオーバーキルすることに快感を覚えるようだし、チームの中でやっていくとオーバーキルはなるべく避けなければならない。自分が最後まで面倒見きるつもりだったら、技術的オーバーキルもある程度認められる面があると思う。もちろん底上げという面でオーバーキルをソフトキル程度にするために、周りに広めないといけない。テスト書きまくってメンテナンス日リティを向上するのもそういう手段だろう。

来年はあんまりこういう感じじゃないので残念だけれど、またこのスタイルに返ってこれるようにしたい。

個人開発

何より今年はキーボード作って売ったことだと思う。

mackee.hatenablog.com

中国の工場ではんだ付けしてもらってキット化した。

ほかにも「うんこキーボード」なるものも作った。

うんこキーボードは、個人で自宅で単価1000円以下のキーボードデバイスを100個量産できるかというチャレンジのもと作ったものだ。様々な電子工作的ハックを重ねて概ね達成できた。この成果を今後のカンファレンスバッジ頒布業に活かしていこうと思う。

旅行

今年は

2月に仕事で大阪

いい湯でした

なるほどこういう感じな

5月のGWに香港・深セン

なう

photos.app.goo.gl

7月に沖縄

モノレール

我々はいまボトルネックにいる

10月に名古屋

現地のあさごはんです

これ

11月にカンボジア・タイ・マレーシア・香港

まどろみのなかからこんにちは

まいにちビール

お先にいただきます

12月に箱根

おはようございます

めっちゃ行ってる。

香港・中国と東南アジアを回って、「英語が出来たらもっと楽しめるなこれ!!」となった。それ以降、ちゃんと英語ドキュメントを仕事で作ったOSSで書くようになった。

来年身につけるべき技術は英語やとなっている。

私生活

同人活動

今年はあまり同人活動は出来ていない。今年の会社の自己評価に、テクい文学表現を使ってしまっているのは、発散する先がないからである。会社の人へ、長文になってすまぬ。

会社の人と書いた技術書展の書籍には書いているので、ノー同人活動ではない。あと5月の文フリにはちゃんと出た気がする。出たっけ?

今年は骨折なしで終われそう。他に大きな怪我や病気もしてないので、様々なことに感謝。ただ、体重面が現状維持かちょっと上向きなので、課題感はある。

ゲーム

ONIとデスストぐらいか。あとテトリス99。どうタワはレート2500行った後にシーズン切り替わってリセットしてからやってない。この前ポケモンタワーバトルをしたら、どうタワ界の方に煽られまくって憤死したので、何らかの鍛えが必要。

大学生の時に使っていた実家の車を、この年末に自宅に戻ってとってきた。いじり甲斐があるので楽しみ。

婚活

3戦3敗。土俵に立ててない説もある。

2020年の抱負

仕事面は……まあ求められたことをやる感じだろうか。もしかしたら転機があるかもしれない。静的解析とマスタデータへの興味は失わないようにする。フロントエンドもちゃんと本気だしてやる必要がありそうな気配。

ハードウェアはキーボードを足がかりに同人ハードウェア界に本格進出するみたいな目標を立ててみる。同人誌もな〜ちゃんと書かんとな。

せっかく車を得たので、色んな所に足を伸ばしたい。足を伸ばして出来るアクティビティにチャレンジする。骨を折らない程度に。一緒にアクテビティにチャレンジする仲間を募集しております。

あと英語。何をどうするのが一番自分に適しているかわからんから、これって思ったのを片っ端からやって覚えるのがいいか。

まとめ

書いている間に年を越してしまった。しかし、文を書きながら年越しできるのは幸せなことなのかもしれない。小さなことに幸せを覚えると、コスパがいいって思ったので、今年はそういう感じで行く。

GitHub AppsでPithubを使うためのモジュールGitHub::Apps::Authと使った黒魔術の紹介

こんにちは、おげんきですか。最近体がバキバキなので良い整体を探しております。川崎近辺でお願いします。

この記事は、Perl Advent Calendar 2019の14日目の記事です。13日目はomokawa_yasuさんのTie::Fileで大容量ファイルを処理する - Qiitaでした。今回もtieの話を少しします。

GitHub Appsって何? なんで使いたいの?

同日の会社のAdvent Calendarに記事を書いたのでこれを読んでほしい。

techblog.kayac.com

つまり、要約すると、

  • GitHub APIを叩くときに、管理とか諸々の理由で個人のGitHub Token使うやつから、GitHub AppsのTokenを使いたい
  • 個人のGitHub Tokenと違ってGitHub AppsのTokenは1時間で有効期限が切れる
    • よりセキュアであると言えるし、たぶん用途としてはWebhook来たときにワンショットで処理する感じだから、Botみたいにこちらから能動的にやるみたいなのはメインの用途ではないのでは?
    • そもそも永続的な認証トークン自体は寛大すぎた
  • 何かしらのテクで既存のGitHub APIを使うライブラリを使ってBotが動くときもコードの変更をそこまでせずにGitHub Appsに移行したい

という内容です。

最近流行りのGitHub Actionsを使えば、対象のリポジトリを操作するためのGitHub Tokenが環境変数で降ってくるので、こういう苦労はないかもしれないですね。ただ、さらにそこから別のリポジトリを触るとかすると、必要な話に。

PithubでのGitHub Tokenの扱い

Perl製のBotGitHub APIを叩くときに、Pithubを使っております。

metacpan.org

他にもPerl界ではNet::GitHubってのもあります。しかしここでは、Pithubに焦点を絞ってお話します。

public repositoryのread以外の操作を行う場合はGitHub Tokenが必要です。というわけで、Pithubのコンストラクタでは以下のように、GitHub Tokenを渡して皆さん操作します。

my $pit = Pithub->new(
  user  => 'plu',
  repo  => 'pithub',
  token => 'my_oauth_token',
);

(SYNOPSISより抜粋)

ここでtokenは文字列として渡しています。しかし、Perlにおいて文字列は変なことをしない限り不変なもの。GitHub Appsで要求されるような「1時間毎にAPI叩いて更新する」みたいなのはできないわけです。

では頑張って「変なこと」をしていきましょう。

変なこと案その1 tie

みんな大好きtie変数です。Perl Mongerの半分ぐらいがtie期の麻疹にかかると言われています。僕も今回1日ほどかかりました。

perldoc.jp

tie変数とは、Perlのプリミティブ型の変数として振る舞いながら、アクセス・代入などの機構をPerlコード上で自作する仕組みです。

今回は、変数がアクセスされるたびに、

  • GitHub Tokenを変数内部に持っていない
    • APIを叩いてGitHub Tokenを取得しキャッシュしGitHub Tokenを返す
  • キャッシュしているGitHub Tokenを内部に持っている
    • 有効期限が切れてなければそのまま返す
    • 切れていれば再びAPIを叩いてGitHub Tokenを取得してキャッシュし返す

という機構を作ろうと考えました。

今回はスカラ変数でtie変数を作りたいと考えたので、Tie::Scalarを継承してpackageを作ります。このpackageは上記の機構をObjectで管理するクラスを受け取ってtie変数として利用できるようにします。

package GitHub::Apps::Auth {
    sub new { ... }

    # issued_tokenは有効期限を考慮しつつGitHub Tokenを返すメソッドです
    sub issued_token { ... }
}

package GitHub::Apps::Auth::Tie {
    require Tie::Scalar;
    our @ISA = qw/Tie::StdScalar/;

    sub FETCH {
         my $self = shift;
         return $self->issued_token;
    }
}

そして、これをtieでtie変数にします。

my $auth = GitHub::Apps::Auth->new(...);

tie $auth, "GitHub::Apps::Auth::Tie";

すると、このあと$authは他の変数に代入するたびに、有効期限を考慮したvalidなtokenを常に返してくれるようになります!

my $token1 = $auth;
sleep 3600;
my $token2 = $auth; # $token1のトークンは有効期限が切れているので違うトークンが返ってくる。

いや〜〜ヘンtieですね〜〜〜〜。

あ、すみません今のナシ。

つまり、これで我々は勝ったか!?に思えました。が、これでは要件満たさないのです。

触った瞬間に文字列になるtie変数

ところで今まで言ってたアクセスってなんでしょうか。他の変数への代入だとか、関数に対して引数に渡すときにも変数のアクセスが行われます。では上記のtie変数をPithubで使ってみましょう。

my $pit = Pithub->new(
  user  => 'plu',
  repo  => 'pithub',
  token => $auth,
);

これで良さそう・・・? ところでこの名前付き引数でコンストラクタにtie変数を渡したときもアクセスが行われます。アクセスが行われるということは......つまりPithubに渡されるのはただ文字列トークンであるということです。

いや〜〜これは欲しいものではなかった! ほしいのは外面は文字列として振る舞いながら、中はいい感じにメソッドが叩かれていいかんじにその時々最適な文字列を返すやつ!

もうちょっと詳しく言うと、tie変数は値を収める変数に対して魔法をかけるものであって、今回ほしいのは変数の中身である値のほうに魔法をかける物が欲しいのでした。

変なこと案その2 overload

演算子オーバーロードPerlに限らず様々なオブジェクト指向言語に存在する機構です。しかしそのトリッキーな挙動から、多くの言語では黒魔術扱いされているでしょう。Perlも例外では有りません。ただ、他の黒魔術に比べると、見た目のえげつなさは抑えられているかも。

perldoc.jp

普通、演算子といえば四則演算や、比較演算子を思い浮かべるでしょう。しかし、Perlは変数を文字列として評価する際の""ダブルクオートも演算子であり、オーバーロードが可能です。その他、文字列比較演算子eqや文字列結合演算子.なども含めてオーバーロードすれば、文字列として自然に扱えるオブジェクトを作成することが出来るでしょう。

ではやってみましょう。

package GitHub::Apps::Auth {
use overload
    "\"\"" => sub { shift->issued_token },
    "." => sub {
        my $self = shift;
        my $other = shift;
        my $reverse = shift;

        return $reverse ? $other . $self->issued_token : $self->issued_token . $other;
    },
    "eq" => sub { shift->issued_token eq shift };

    sub new { ... }

    sub issued_token { ... }
}

そんでって、Pithubに突っ込む!

my $auth = GitHub::Apps::Auth->new(...);
my $pit = Pithub->new(
  user  => 'plu',
  repo  => 'pithub',
  token => $auth,
);

これで、GitHub::Apps::Authインスタンスは、文字列として振る舞うので、Pithubの内部でもObjectとして保持されるものの、いざ使われるときはそのときに使われるトークンを払い出します。結論を言えば、CPANに上げているGitHub::Apps::Authはこの方式を採用しています。

勝った・・・! Pithubでもちゃんと使えるのと、1時間以上経ったら新しいtokenが使われているのを確認しております。

その他の工夫

上記のoverloadの定義だと、文字列結合をした際には「常に有効なtokenを返す不思議な文字列」としての性質を失ってしまいます。なので、文字列結合のメソッドはもう少し工夫をしています。

use overload
    "." => sub {
        my $self = shift;
        my $other = shift;
        my $reverse = shift;
 
        $other = "" unless defined $other;
 
        my $new_self = bless {}, ref $self;
        %$new_self = %$self;
 
        $reverse ?
            $new_self->_prefix($other . $new_self->_prefix) :
            $new_self->_suffix($new_self->_suffix . $other);
        return $new_self;
    };

クラスのattributeとしてprefixとsuffixの入れ物を用意し、文字列結合をしようとした際は、objectをcloneした上で、新しいobjectに結合を試みた文字列を入れています。

そして、tokenを返すときに、prefixとsuffixをその場で結合して返しています。

sub issued_token {
    my $self = shift;
 
    if ($self->_is_expired_token) {
        return $self->_prefix . $self->_fetch_access_token . $self->_suffix;
    }
 
    return $self->_prefix . $self->token . $self->_suffix;
}

この工夫で例えば my $header = "Bearer x-access-token:" . $auth;のように文字列結合をした場合でも、GitHub Tokenの部分は1時間ごとに入れ替わります。

この措置は、GitHub APIクライアント側で認証のために使うHTTPヘッダをあらかじめ組み立てて、それを使い回すようなケースを想定して実装しています。

まとめ

  • Pithubとかに渡すGitHub Tokenと入れ替えるだけでGitHub AppsのTokenが使えるモジュールを書いたよ
    • CPANにすでに上げているよ
  • 中身はoverloadっていう黒魔術を使っているよ
    • あんまりやりすぎると制御が効かなくなるよ、たぶん
  • patches welcomeだよ https://github.com/mackee/GitHub-Apps-Auth
  • PithubにPull Request送るのも試してみますね

明日はbayashi_netさんです。

右手にペンタブ持っている人向けの左手用 #自作キーボード を作っています #builderscon

こんばんわ。今日から30歳です。祝ってくれ。

pulsarっていう左手キーボード作っているって話

これです

できたヨー! #自作キーボード

スペック

f:id:mackee_w:20190722220947j:plain

  • 9キー + 親指ダイヤル + 親指が届くところに左右のレバースイッチ
  • 小型OLED
  • キー配列(これ押したらこれが入力されるとか)を自由に設定可能   - ダイヤルやレバースイッチも設定可能
  • microUSB接続   - ゆくゆくはType-C化や無線化もしたいが

youtu.be

  • キーごとにフルカラーLEDを搭載   - 配色も設定可能
    • 上記動画はダイヤルで色変え、レバースイッチで点灯パターン切り替えを割り当てたデモ
  • キースイッチはメカニカルキースイッチ   - ソケット接続なので自由に違うキースイッチに差し替えることができる   - LEDの形状の関係でkailh BOXやkailh Speedしか使えるのを確認できてない。Gateronは浮くのでダメだった

f:id:mackee_w:20190722214736j:plain

  • 商品として売るならユーザが半田付けする箇所をなくした状態で売ろうとしている

進捗

f:id:mackee_w:20190721141644j:plain

  • 自宅での小ロット量産は出来た
  • 身近な人にユーザーテストしてもらうところ
  • 基板の量産は見積もりお願いする段階
  • アクリル製ケースは試作中
  • プログラマ以外の人が使う自作キーボードなので、配列のリプログラミングをGUIで出来ないか模索中

販売の予定

  • 面白半分で50枚ぐらいの量産をするので、そのままboothとかで売ります。早ければいいですね   - いきなり売れるとは思ってはいない。同人ハードだし

というわけで上の作る過程の話とか作るのに必要な知識の話をするから来てくれ!!!

buildersconっていうカンファレンスでそういう話をします。

builderscon.io

聞きたい人は来てくれ!! ところでこの記事を書いている時間の2時間後にチケット販売締切です。 

[https://twitter.com/builderscon/status/1153190436359397376:embed##builderscon tokyo 2019 チケット販売終了まであと数時間です! 当日券はありません!迷う時間もありません!是非おはやめに!

https://t.co/cWx1oZ3uaT]

 

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年はもっと大人になりつつアクティブさは維持するみたいなのがエモなところです。以上。