登壇資料の作り方

ツイート貼り付けたら書きたいことが終わってしまった。

↓は資料の作成途中の姿。↑で 15,000 って言ってるけど、余裕で超えてるな。

$ wc 20220305_yapc_japan_online.md
     409     970   26111 20220305_yapc_japan_online.md
  • 喋るといいんじゃないかってことを、とにかく書き出してまず文字数を稼いで
  • 一度 k0kubun/md2keyKeynote に流し込んで
    • すごく雑な書き出しをしているので、この時点では箇条書きが 20 行とかあったりもする。(もちろん読めない
  • Keynote 上で切り貼りしてストーリーを確認
    • スライドプレビューじゃないとページ数や各セクションのボリューム、文字数等の体感が掴みづらいので
    • ここで半分ぐらいのページを捨てることになる
    • 難産なときはココで 8 時間ぐらいかかる
      • 30 分ほど話せる程度の文字数はあるんだけど、筋の通ったストーリーにならない、ただの書き散らしになっている、という状態
      • 箇条書きを 3 つに絞るとかの作業の中で、ストーリーが削り出されてくる
      • 経験上 2 割ぐらいは想像していなかったストーリーに生まれ変わります
  • スライドで切り貼りしたものを markdown に戻して
    • vim の方が編集しやすいので。ここ手作業でやってるけど自動化できなくもない気がするな。。
  • markdown 上である程度整えて
  • md2key で再び Keynote に流し込んで
  • Keynote 上で再度整えて完成

という流れで作っています。vimKeynote を行ったり来たりする必要があるんだけど、文字を編集しやすいエディタと、ストーリーを確認しやすい Keynote となので、いいとこ取りするために仕方ないね。

その後、時間を計りつつ喋りながら通してみて更に調整して、本番を迎えます。

というわけで、来週 YAPC::Japan::Online に登壇します。よろしくねーノシ

3 月は社の Hatena Engineer Seminar #19 でも登壇する予定なので、こちらも興味があればどうぞ。そこそこ面白い話をするつもりです。

今年買ったもの2021

去年 に引き続き、今年買ったものコーナー。

遅刻した (年明けちゃった) けど気持ちはまだ年末です。今年なんか正月休み短い気がしますね。明日から仕事マジ……。

だいたい買った順です。2021 近況 - id:onk のはてなブログ と被ってる内容もある。

春と秋は窓を開けているのが分かる

  • HP Thunderbolt3ドック 120W G2
    • 去年買ったモニター台の高さにぴったりでちょうど良い
    • なんか癖がある気がする。時々認識しなくて全部外して順番に刺し直すハメになってる
  • ホットサンドメーカー
    • 週 1 ぐらいで活躍している
    • リロ氏のソロキャンレシピ も買って眺めてるけど、ホットサンド以外はあんまり色々できてないなぁ。鶏皮せんべいや、肉まんを挟むのは時々やってる
  • サンワダイレクト ケーブルホルダー マグネットホルダー3個 200-CA037
  • サイモン フォグストップ缶
    • マスクをしても眼鏡が曇らないのはライフチェンジング
    • 万人に勧められる中だとコレが今年一番買って良かったものかも
  • Blue Microphones Yeticaster
    • Blue Yeti, Compass, Radius III セット
    • ミスって入力が WH-1000XM4 になってたら「いつもと音質全然違うけどマイク大丈夫ですか」って言われる程度には良くなったっぽい
  • Unihertz Jelly2
    • 最高 of 最高!マジで最高
    • ケータイをちゃんと携帯できるようになった。人類が持ち歩くケータイにはこれぐらいの小ささと厚みが必要だったと再認識した
  • Panasonic 食洗機 NP-TCR4
    • 楽にはなった……かな……?
    • 世間で食洗機が「必須」「新三種の神器」って言われているのは買う前から疑問だったけど、今でもまだ分からない
  • TickTime
    • ポモドーロテクニックやりたい定期 (n年ぶりm回目)
    • 多分不良品掴んだ (ずっと光ってる) ので、そのまま引き出しの奥にしまい込んである
  • Plugable DisplayLink アダプタ USBC-6950-DP
    • M1 Mac で複数外部モニタを使うために購入
      • 最近出た M1 Pro、M1 Max は外部ディスプレイ 1 枚制限無いので、新しい Mac を買うと良いと思います
    • 縦置きで使おうと思ってたんだけど回転させるとダメっぽかった。まぁ 1 枚は横に使うので問題は無い
  • ロジクールERGO M575
    • 自宅の MX ERGO が M1 Mac でなんか動かなかったので
    • 会社に置いていた MX ERGO は動いたので意味分からん……
    • トラックボールマウスはなんぼあっても良いですからね
  • ヘッドホンハンガー
    • 買って良かった!
    • 耳だけで WH-1000XM4、OpenComm、SRS-NB10 が机の周りに転がっているので、しまう場所があるのは正義
    • ページがないな。。 たぶんコレが近い? サンワサプライ PDA-STN18BK
  • SUNTAIHO USB-C マグネット充電
    • アダプタ端子ケーブル とか色々
    • そこそこ端子が分厚いので、気にはなる
    • 家中の USB Type-C に全部コレ刺した程度に気に入っている
  • ambie sound earcuffs WHITE AM-TW01WC
    • OpenComm より楽なので、そこそこずっと着けてる
    • 電池の持ちはちょっと弱い。1 日中会議で埋まってる時は足りない
  • 花王 スマートホルダーセット
    • 社の朝会スピーチで聞いて気になったので
    • 取り替えるのがめちゃくちゃ楽なのは良いんだけど、最後に水足してもう 1-2 回使うって技が効かなくなるのはツラい
    • あと花王にロックインされてしまった
  • ぺリックス PERIPRO-303 X4A
    • オシャレだよね。飾るオモチャ
  • 2灯 ペンダントライト
  • Philips Hue A60 フルカラー E26
    • ↑と一緒に買おうとしたら在庫がマジでどこにも無いので撤退かモデルチェンジか?って焦った
    • 電球 1 個だけが欲しかったんだけどスターターセットごと買った
      • 他の在庫が本当に全滅していたので、家の中で揃ってなくて困るよりは金払おうと思って
      • 今見ると復活しているな。何だったのか
  • nano Wallet
    • 最近はカードも入らないサイズの財布が少し流行っているっぽい?
  • 富士通 QUADERNO A5 (Gen. 2)
    • A4 か A5 か迷って、A5 にした
    • A5 の外形寸法が 173.2*242.5 なので、セミ B5 の キャンパスノート (179*252) よりちょっと小さいぐらい
    • PDF 読むのにも使うし、メモするのにも使う。物理ノートもう買わなくて良いかも?と思ってる
  • LAVIE T8 T0875/CAS
  • Anker Nano II 65W
    • 旅行用のつもりで買った。ノート PC もこれで充電できるらしい
  • SONY ネックバンドスピーカー SRS-NB10
    • 面白いかなと思って&どれぐらい疲れないかが気になって買ってみた
    • 隣の席だと 1/3 ぐらいの音量になるぐらいの音漏れ度合いなので、一人部屋でしか使えないと思う
    • マイクにも音が入ってしまうので、入出力ともコレにする必要がありそう? 時々入るぐらいで、だいたい大丈夫ではある
    • めっちゃ疲れて顔に何も着けたくないときには活躍している
  • クアデルノ LAMY スタイラスペン
    • デフォルトのペンだと、あまり握り心地が良くない
  • Anker Magnetic Cable Holder
  • Unique Spirit タブレットアーム
    • ヘッドフォン置き場が決まってスッキリしたので、タブレットを置く場所も確定させたかった
    • タブレットアームが鉄なので、磁石がくっつく。これは非常に便利で、充電ケーブルや ambie の置き場所も定まった
  • Kensington エキスパートマウス ワイヤレストラックボール
    • なんか親指が痛かったので、中指トラックボール試すかと思って
    • トラックボールマウスはなんぼあっても良いですからね
    • やっぱりどうしても慣れなくて、痛いのを我慢して使う方がマシ、となって、しまい込んでいる
  • SESAME4 + WiFiモジュール
    • 最高。駅まで歩きながら鍵閉められるのがめっちゃ良い。ポケットから鍵を取り出して鍵穴を確認して刺して回すって、思ってた以上に重労働だった
    • Jelly2 との相性がめっちゃ良い。物理キーにアプリ起動のショートカットを設定できるので、短押しにセサミのアプリを割り振っている
    • セサミを買ってから nano Wallet が割と活躍しだしたので、鍵 1 個程度の存在でも普段の行動に影響与えるんだなぁって思う
  • Google Nest Wifi ルーターと拡張ポイント
    • スマートホーム化進めていたら、アクセスポイントにぶら下がる数が増えてきて気になったので、分散目的で
  • BenQ ScreenBar Plus
    • 夜中に書きながら考えたいことがたまにあるので、手元を照らせるライトが欲しかった
    • 最近 ScreenBar Halo が出て、待てば良かったかなぁとか
  • Mistel BAROCCO MD600v3 RGB Classic Black
    • 会社に行くときにキーボードを持っていくのが面倒で、置きっぱなしにできる分割キーボードが欲しくて買った
    • 去年買い足した Ultimate Hacking Keyboard は 1 年経ったけどまだ届いていないのだ
  • SwitchBot 開閉センサー
    • なんか色々センサー付いてて良さそうと思って買っちゃったけど、使い道思いついてない
  • NSD パワーボール 280Hz Autostart Classic
    • 会議しながら鍛えらんねーかなーって思って
    • マウス触りながら回すことが多くて、左手だけ太くなりそう
  • Anker 521 Charger (Nano Pro)
    • まぁ Anker 製品ならあればあるだけ良いかなと思って買い足した
  • ドラム式洗濯乾燥機 AQUA AQW-D12M
    • 前の子 (Panasonic NA-VH310L) がほぼ毎回途中でエラーで止まるようになってしまったので
    • 洗濯機設置もまるっとお願いしたんだけど、中に説明書やらが入ったまま試運転していったので紙がビショビショになってたのが面白かった

いろいろ買ったな。机周りはこんな感じです。去年と比べるとそこそこモノが増えている。

2021 近況

この記事は Rubyist近況[1] Advent Calendar 2021 の 20 日目の記事です。すみません、1 日遅れです。完全に 21 日目のつもりでいた。。

忘年会が無いのでご挨拶代わりです。皆さんお久しぶりでーすノシ

昨日は 1 スレ目id:Sixeight さんの 近況 - ちなみに2 スレ目id:shucream さんの 2021-12-19 | けんちゃんくんさんのWeb日記 でした。似たような年齢なのでマネージャが続きますね。私もです。

今年の目標

達成見込みです。

丸 2 年切ってないので 25-30cm ぐらい伸びてんのかな。髪ブラできる長さになってしまった。人生最長。

アゴムで止めるのがちょっと大変になって、最近かんざしを挿すようになっていました。どれだけ伸びててもまとまって便利。

最近のお仕事

  • 2018-04-01 から株式会社はてなに所属しています
  • ノベルチーム (カクヨム魔法のiらんど の開発運用) で TypeScript、GraphQL、Perl を書いています
  • チーフエンジニア (エンジニア全体のマネージャの 1 人) として育成採用その他組織作りもやっています

マネージャとしては、最前線で手を動かすのを捨てたくない!と叫びながら、週の平均会議時間 25h ぐらいでやっております。

こういう話をしているおじさん役です。

技術的な話では、Next.js + GraphQL は JSON 色付け係としては理想の未来にメチャクチャ近づいていますね。最高。まだ体感していないなら是非こちら側へ来てみてください。

Ruby との関わり

Rails を必要とするようなアプリケーションを書けてなくて、20 エンドポイントぐらいの Sinatra で収まる感じです。

最近 SinatraHatena::Let をフルリプレースしたぞ、という話をしました。

Sinatra はそこそこ使っていて、

しています。

Sinatra である理由はあまり無いので、来年は Hanami::API で暮らしてみようと思っている。軽量 Web アプリケーションフレームワーク + ActiveRecord という組み合わせは、まだまだ普段使いの武器であり続けそう。

最近の私生活

  • 今年 1 番時間を使ったのはナンプレです
  • 2 番目に時間を使ったのは箱庭諸島2です
  • 3 番目に時間を使ってるのは Kittens Game です
    • まだクリアしてない

ナンプレ

脳を鍛える大人のNintendo Switchトレーニング を 2020 の GW 辺りにやり始めて、なんか数ヶ月続いちゃったんだよね。特に数独だけ続いてしまった。

脳トレ数独を全問解き終わったけどまだ熱が冷めなくて、Android アプリで継続してやっている。

2020-06 半ばぐらいからアプリですね。なんと毎日解き続けている。

f:id:onk:20211221053035p:plain
機種変して連続記録は失ってしまった

問題の難易度が分かるようになりたくて Rubyで数独 AIプログラミング入門【委託】 - 達人出版会 を読んだんですが、とても良かったです。深さ優先探索とかで無理矢理解くんじゃなくて、ちゃんとロジカルに解いていく方法が語られている。

ロジカルに解けるようになった=ちょうどいい難易度の問題を自動生成できるようになったので、アプリ要らずで無限に遊ぶ手段も手に入った。

箱庭諸島2

今年の新卒研修の一環で Among Us をレクリエーションとしてやってたんですが、そんな現代的なゲームじゃなくて俺たちの青春である箱庭諸島を食らえ!という気持ちで始めました。古の CGI を、現代の CGI こと FaaS で蘇らせる、というストーリーで、API Gateway + Lambda + EFS で動かしています。

f:id:onk:20211221053458p:plain
50万人突破して喜んでいる様子

最新の Perl (v5.34.0) で元気に動いています。20 年前のコードでも jcode.pl を 2 行書き換えるだけ (Perl v5.22.0 で %hash に対しての defined がエラーになるようになったのに対応した) で動くのは、さすが互換性を大事にする Perl ですね。

古の CGI はファイルにデータを保存しているので、EFS で共有しちゃえば FaaS の無限のスケールを手に入れることができます。(ロック機構が NFS でちゃんと動いているかどうかは自信ない

半年ぐらいで飽きかけたんだけど、地盤沈下が発生して見事に引き戻されました。ちょうど安定しかけたら大地震が発生したりモンスターが湧いたりと、本当に素晴らしいゲームバランスなので、ぜひ皆さんも体験してみてください。

f:id:onk:20211221060622p:plain
定期的に災害が起きる

今年買ったもの

ケータイ

スマートホーム関連

机周り

今年のオススメマンガ

ナンプレのせいで 200 冊ほど減ったんだよね。例年だと 900-1000 冊ぐらい読んでるんだけど、今年は 700 冊弱でフィニッシュです。

取り上げておきたいものだと

完結したもの

1 巻良かったので買ってくれ

三十路病の唄

ジーンブライド

あ、このブログパーツ貼り付けができるのは、はてなGigaViewer が導入されているマンガサイトです。14 社 17 サイトに導入されてるので、割と日々目にしていると思う。開発の手が足りないので助けてください。強く募集しています。一緒に こち亀の各エピソードにパーマリンクを作る ような仕事をしませんか。

Meety はマジの雑談枠なので、いつでも声掛けてください。コミュニティの懇親会の代わりに使っていて、今までに 10 人と雑談した実績があります。

来年は?

もうちょっとアクティブにコミュニティ活動したいなと思っています。さすがに 2 年経つと飽きてきたというか、既存の知り合いとしか会話できていないのが気になるようになってきた。

はぴば

おはようございます。onk です。2021年12月18日の、朝です。11時なので、朝というか、昼ですね。ここでタイマーをセット。

この記事は、やんちゃクラブリスナー Advent Calendar 2021、18 日目の、記事です。

やんちゃさん、誕生日おめでとうございます

本日 18 日は yancya の誕生日です。

知ったのいつだっけな。 @chiastolite による誕生日 Advent Calendar 界隈でよく話題に上がるので以前からワイワイしている。

adventar.org

さて、今回のやんちゃクラブリスナーアドベントカレンダーについてだけど、

周りを煽ってみる

もちろん煽り返される

用意していた断り文句を言う

なんと 18 日が空く

という流れで参加することになったんだけど、 誕生日を理由にしたことで @chiastolite に完全な流れ弾が飛んでしまった。

大変申し訳ありません。楽しみにしています。

やんちゃクラブ濃度

この時点では実はやんちゃクラブ見てなかったんですよ私。

みんなが会話しているので、毎日上がってるとか、フェーズ1が第二次小バエ戦争で幕を閉じたとか、んーんっんキューブやってるとかは知っていて、今日は何の話かなと想像しながら TL を眺めていた。

YouTube なんか苦手なんですよね。UI が。

YouTube Live のチャット欄にコメントしようとすると「チャンネルを作成してチャットに参加」ボタンになって、コメントしたいだけなのに意味分かんねーって思いながら仕方なく Twitter で実況する程度には苦手。「チャンネルを作成」って何?コメントと何の関係があるの?

のでイマイチ見ることができてなくて、けまらしさを覚える日々を送っていたんだけど、

うぉっ!! ポッドキャストは UI 分かる! 使いたい!

けどコレどうやってやったのか分かんないので気になりながら待ってる!ってやってたら、アドベントカレンダーの12日目の投稿で方法が明かされた。Listenbox なるほど!!!

www.youtube.com

というわけで 12 日にようやく視聴開始して、90 本一気に聞きました。等倍で聞いているので生活の 1/4 がやんちゃクラブ。世界で一番やんちゃクラブ濃度が高い自信があります。

4K で配信云々って話を耳で聞いてるのは、こう、申し訳なさがありますね。

喋りが圧倒的に上手くなってるのも連続して聞いてると実感できて、継続するってすごいなぁ、という気持ち。

やんちゃエフェクト

以前からカートに入ったまま悩んでいた Ember の温度制御スマートマグ2 をカートから削除したぐらいですかね……。いやなんかいっつも電池切れてるし、あーそうですよね、みたいな。スピンカップNEO も 1 年ぐらいカートに入っていたけど、ついでに消しました。

あとは日記ノートの冒頭にトークスクリプトを書くのが良いなぁと思って、試し始めました。

日記(?) は元々書いてたんですよね。10年ぐらいかな。Slack やターミナルにコマンド打ち込む前にこっちに書いてコピペしたり、Twitter に書きかけて止めたことを行き場が無いからココに残ってたりしている。思考の過程が残ってるので、あとからめっちゃ検索してる。

$ wc -l 2021*.md
    1027 202101.md
     359 202102.md
     916 202103.md
     722 202104.md
    1100 202105.md
    1978 202106.md
    1457 202107.md
    1503 202108.md
    1711 202109.md
    1476 202110.md
    1030 202111.md
     366 202112.md
   13645 total

トークスクリプトというか、TODO リストだな。今日やることを毎日コピペすることで意識に上げる作業。愚直な泥くさいやり方でも、効果があるし、やってみると良いかなぁって。

ノートと言えば、クアデルノ 買いました。電子ペーパーオライリー達人出版会、ラムダノートで買った本は全部放り込んであって、無意識に Twitter 開くみたいな意識の逸れ方をしなくなったので、読書体験は向上したし、メモ書きたいときもとても便利に使っています。

っと、タイマーだ。じゃ、こんなところで。

ばいばい

ブログから技術記事を抽出・集約してワイワイする

この記事は、はてなエンジニア Advent Calendar 2021 の 18 日目の記事です。 昨日は id:dekokunbitcoinのfull nodeをAWSでなるべく安く運用してみる - でこてっくろぐ ねお でした。

full node の存在知らなかったし EBS SC1 を使うって発想もなかった (最近 gp3 以外選んでない) ので面白かった。Bitcoin 思ってたより善意に支えられてるんですね。

dekotech.dekokun.info


さて本題。

はてなスタッフの日記

はてなスタッフは、だいたい個人ブログを持っています。また、技術ブログと日記とを分けずに一つのブログに書いている人もそこそこ多くいます。僕も分けてないので年末は「今年買ったもの」を投稿していたりする。今年も書きます。

onk.hatenablog.jp

技術記事を Hatena Developer Blog (会社のテックブログ) に書くこともありますが、個人ブログの集合体がコミュニティなんだよって気持ちから、個人ブログに書くのももちろん推奨されています。

月次のブログ紹介

毎週木曜日に技術勉強会を開催していますが、その中でも月初は特別編として、社外向けに書かれた技術記事をまとめて眺めています。

月初の勉強会は月に一回の特別編です。前月に書かれた技術エントリ(社内ではなく社外向けに書かれたもの)にブックマーク数100usersを超えるものがあったら寿司とビールでお祝いをします。

developer.hatenastaff.com

今はリモート開催なので寿司ビールはやれてないんですが、月次でのみんなの記事の共有は引き続き変わらず行っています。

入社時の儀式

これを実現するためには個人ブログの技術記事を集約する必要があり、そのデータとして全員のアウトプット先を YAML として持っています。

こんな感じ。

- owner: hatenatech
  url: https://developer.hatenastaff.com/
  kind: hatenadeveloperblog
  weight: 2
- owner: onk
  url: https://onk.hatenablog.jp/
  kind: hatenablog
- owner: onk
  url: https://www.slideshare.net/takafumionaka/
  kind: slideshare
- owner: onk
  url: https://blog.onk.ninja/
  kind: other

owner, url は見たまんま。 kind はパーサ向けの情報。 weight は面白機能で、Hatena Developer Blog に書いた場合は、特上寿司獲得ランキングにおいて 2 倍のスコアになります。

入社時に、自分のブログやスライド投稿先を足して PR を出す、というのが、エンジニア職で入社した人の儀式になっています。

投稿されたらワイワイしたい

月次で眺める会を実施しているのは前述の通りなんだけど、もっとワイワイしたいので、リアルタイムにも眺めたい。

リアルタイムにワイワイする、イコール Slack の #engineer に流す、をやりたい。

日記は車だったり釣りだったり育児だったり VTuber だったりと、まぁ本当に日記で、#engineer に流すにはちょっとノイジーなので、技術記事だけに絞り込む必要がある。

つまりこうです。

  • ブログリストから
  • 新着をポーリングして
  • 技術記事かどうかを判定して
  • Slack に流す

もうちょっと詳しく

ブログリストから

YAML をパースする

新着をポーリング

RSS/Atom フィードがまさにこの用途ですね。

  • ブログ URL から Feed URL を見つける
  • 定期的に取得する
  • 新着かどうかの判定

をやれば良い。

フィードはブログ URL で取得した HTML から、以下の XPath で探しています。

//link[@rel='alternate'][@type='application/atom+xml']
//link[@rel='alternate'][@type='application/rdf+xml']
//link[@rel='alternate'][@type='application/rss+xml']

ブログリストの kind を使って決め打ちすることも可能そうです。

新着判定は、記事 URL が一意なので、前回までに見た記事 URL に含まれているかどうかで判定可能。

技術記事かどうかを判定して

  • 本文を抽出する
  • 技術記事かどうかを判定する

をやる必要があります。

本文を抽出するのは、フィードに全文が入っていたらそれを使えます。サマリーしか入っていない場合は、フィードの URL から HTML を取得して、本文っぽいところを推測します。「それ Pla」とか「LDR Full Feed」というワードが頭をよぎりますね。

LDR Full Feed はサイトごとに XPath を用意していました。全サイトについて XPath を用意するのは少し大変なので、フォールバック先として「いいかんじに推測する」という実装も用意しておきたい。本文抽出は Webページの本文抽出 (nakatani @ cybozu labs) とか HTML::ExtractContent とかのようなライブラリが存在します。

技術記事かどうかを判定するのは、意外とヒューリスティックな方法でもそこそこの精度が出ます。ですが、自分にドメイン知識がある内容の 2 値分類機を作るのは難しくない (日々の生活の中でアノテーションできる) ので、ちゃんと育てていきたいですね。とまれ今は技術ワード 200 個ぐらいについて正規表現でマッチした個数で判定を行っています。

Slack に流す

はい。

Slack に流れている様子

というのをやって 2 年が経ちました

体感としてはすごく良いし、このまま継続していきます。

技術記事判定ができているので、スタッフの個人ブログをまとめて公開することもできるようになったなぁと考えています。公開したい技術記事としたくない日記とが一箇所に書かれるので、単にブログ記事を集約するだけだとイマイチなんですよねー……。ブログのカテゴリ機能等を使うことで配信する/しないを選ぶことも可能ですが、できれば書き手に手間を掛けさせずに、全自動でやりたい。

お裾分け

ブログの URL を入れると技術記事のみの title, url が帰ってくる API を用意しました。どうぞご利用ください。裏側は API Gateway + Lambda なので、意図的に殺さない限り動き続けるかなと思います。

$ curl -G -d url=https://onk.hatenablog.jp/ https://tech-entry.onk.ninja/entries | jq .
[
  {
    "title": "ソフトウェア式年遷宮という概念の歴史と、Hatena::Let での実例",
    "url": "https://onk.hatenablog.jp/entry/2021/11/28/070728"
  },
  {
    "title": "フルタイムでやる仕事を作る #wantedlydev",
    "url": "https://onk.hatenablog.jp/entry/2021/10/18/200338"
  },
  ...
]

https://github.com/onk/tech-entry


はてなエンジニア Advent Calendar 2021、明日は id:astj さんです。お楽しみに!

qiita.com

ソフトウェア式年遷宮という概念の歴史と、Hatena::Let での実例

Hatena Engineer Seminar #17 にて発表しました。

hatena.connpass.com

www.slideshare.net

発表内容をかいつまんで記事にも書いておきます。

Hatena::Let とは

はてラボ のサービスの一つ。

僕も入社するまで、はてラボ == ベータ版、だと思ってたんですが、

  • ラボならではの挑戦的なサービス
  • 運用費が会社持ちで、会社の名前で出しても良い、はてなスタッフの有志が運営するサービス、という制度

も含んでいます。

で、Hatena::Let は、現在は主に id:onk が開発している、ブックマークレットをかんたんに作成・公開できるサービスです。

ソフトウェア式年遷宮とは

初出は 2013 年の id:kenjiskywalker によるもので、このときはインフラの B/G デプロイメントのことを指していた。*1 blog.kenjiskywalker.org

JAWS DAYS 2014 Immutable Infrastracture Track のパネルディスカッション で id:antipop によって紹介されて更に広まる。*2

Immutable Infrastracture の文脈のまま、クックパッドのサーバプロビジョニング事情 - クックパッド開発者ブログクックパッドの継続的な成長のために開発と運用が何をしてきたのか、その失敗と成功について - Speaker Deck でも語られていく。

この Cookpad TechConf 2016 での id:mirakui の発表では「作り直すことを前提にすることで長寿命化」というキーワードが出ている。2014 年に Martin Fowler が 犠牲的アーキテクチャ という名前を付けたものとも紐付いたのだろう。

bliki-ja.github.io

rebuild.fm

id:takahashim の発表でも、犠牲的アーキテクチャ式年遷宮で技術の継承を行うのだとされている。

www.slideshare.net

2018 年、ソフトウェアを定期的に全て作り直すという拡大解釈が @edvakf により行われる。作り直せる規模にしておくというのは、マイクロサービスの流れとも合流しているんじゃないかな。

inside.pixiv.blog

2020 年、id:daiksy により、ブラックボックスになりかけている要素をリプレースする過程でドメイン知識を継承する、と意味が加えられる。

productzine.jp

といった感じで、

  • 定期的に一部、または全てをリプレースする
  • リプレース時にモダンな技術にし、メンテナビリティを高める
  • リプレースの過程で、ドメイン知識を継承し、チームのスキルを維持する

というのが「ソフトウェアの式年遷宮」なのだろう。

はじめからやり直したい症候群」とは違い、難しいものを難しいと認めた上で、運用し続けられる体制を維持する、というのがポイントなのだと思う。

Hatena::Let遷宮

サービスを引き継いだので、コードベースの隅々まで把握するために遷宮しました。

サービスの全貌を我が物にするためには、

  • システム構成を把握する
  • データ構造を把握する
  • エンドポイントを把握する

をやると良くて、*3

  • インフラ移行 (EC2 -> ECS)
  • ORM 移行 (MoCo -> ActiveRecord)
  • routes/controller の移行 (Ridge -> Sinatra)

とそれぞれリプレースすることで実現した。

技術選定を ActiveRecord にしたのは DB リファクタリングのためで、狙い通りにリプレース後にリファクタリングすることができた。次はフロントのリプレースや機能開発をやっていく。

まとめ

サービスを引き継ぐ際に Perl から Ruby に全て書き換えた裏側にあった目論見、つまり仕様を完全に把握するための遷宮と、遷宮時の技術選定について話した。また、定期的に (=式年) 遷宮する必要があることも示した。

フルタイムでやる仕事を作る #wantedlydev

先日 Wantedly さんのエンジニアリングマネージャー座談会に出演させていただいた。

wantedly.connpass.com

テーマは、「エンジニアリングマネージャーの課題を相談したい人が多い」「その相談パブリックにしよう」なので、自分が最近課題に思っている「変化の速度感」についてざっくばらんに会話できたらなーというのが期待だった。

イベント中には、大きく 4 つの話をしたのかな。それぞれ会話の中では話しきれなかったことも補足しつつ書いていく。

  • 技術スタックが違うチーム
  • プロダクトと専門組織のバランス
  • 専門組織を立ち上げるポイント
  • 採用と oss-guild

技術スタックが違うチーム

リンク先を見て貰うと顕著に分かると思うけど、はてなでは、そこそこバラバラな技術スタックを使っている。

hatenacorp.jp

インフラは AWSGoogle Cloud (オンプレはやっと撲滅した)。コンテナ運用基盤も ECS、k8s それぞれある。バックエンドでは Scala、Go、PerlPython、Node。Web フロントエンドは TypeScript/React/GraphQL に統一しつつあるが、Apollo と Relay を敢えて使い分けていたりする。(基本的には Apollo Client だけど、遊べる余地のある小さなプロダクトでは Relay を使おうみたいな)

1 プロダクトの中でも複数言語が使われていて、はてなで Web アプリケーションエンジニアをやるならマルチリンガルであることは求めていくことになる。

こうなっている理由は、事業のために最適な技術を選んだ結果なんだけど、これを成立させるためにどうしているかだと、1 プロダクトの中では専門性が足りなくても、会社全体で見ると統制が取れている、にしているつもり。そのために技術選定時に DesignDoc を書いているし、サブ会 があるし、はてな教科書 がある。

developer.hatenastaff.com

全社で 1 プロダクトでしか使っていない技術はあまり存在しなくて、横のつながりで同期を取ったり、専門性を高めたり、入門のハードルを下げたりしている。

プロダクトと専門組織のバランス

「横のつながりで同期を取る」と言ったが、本当にそんなことが可能なのか、という話題。10 年以上、技術イベントで登壇できる程度の位置は維持できているので「可能である」と思っています。

ここの肝は情報の透明性だろう。同じインプットを入れると同じ結論が出てくるので。どのチームがいつ何をやるか、どんな課題があるかを知っている状態である。毎週やっている 技術勉強会 や、スタッフが発信している社内ブログ、個人/社の技術ブログ。また、サブ会の会合を通して、技術選択や、技術ロードマップの優先度、スケジュール感の共有が行われている。

情報の発信が上手い人、情報の pull が上手い人、情報のハブになるのが上手い人がそれぞれいるので回っているんじゃないかと思う。リモートシフトで少しサイロ化が進んでいるので、すべてのベースが情報共有にあることを強く認識して、是正していきたい。

プロダクト側が、会社/世間の標準から外れすぎないよう意識して行動できているチームだからというのもあるかもしれない。

全体で緩やかな意思決定をしていると、緩やかなので、意図した変化速度にならないことが多い、というのがこの体制での悩み。その気になったら3ヶ月〜半年でグイッとやれないこともないが、やれる範囲でやると1〜2年かかってしまう、という速度感です。借金を返しきることがないが、返済に困り果てもしないぐらいで生きて行けているんじゃないか。

専門組織を立ち上げるポイント

サブ会のような、プロダクト側 90%、残りの 10% で参加する、という形だと、速度感が足りないし、専門性も高めきれない。サブ会の主軸のメンバーに対しては調整して 50% ぐらい持って貰うようにしてきたが、それにも限界がある。本当に力を入れたいならハコ (組織) を作ることになる。

が、かろうじて回ってしまっている中で、どう組織を立ち上げるか、というのが僕の悩みだったが、@kawasy がサクッと答えてくれたのが表題の言葉。

片手間では解ききれない量・質の問題がそこにあることを示し、その上でフルタイムで取り組む範囲を定義して、これで何が解決するのかを言語化することで、組織としてやる価値を示すのだろう。「フルタイムでやる仕事を作る」のが僕の仕事だなーと感じた。

採用と oss-guild

こういう緩やかな繋がりで「各位いい感じに」で回せる人をどう採用するかという話。これは OSS と地続きであることを是とする文化であれば採用も育成も実現できるんじゃないかと思っている。

前職のときに書いた内容だけど、大枠で言うとこういう意思です。

これをやっている人を採用するのだと書類選考から見ているし、

育成も含めてやっていくぞというのは社内の文化醸成として頑張っているところです。

tarao.hatenablog.com

まとめ

楽しい会だった。呼んでいただいてありがとうございます!

【PR】はてなWantedly さんも、積極的に採用しているのでお声掛けください!

d.hatena.ne.jp (キャリア採用 中途の転職・求人 - 採用情報 - 株式会社はてな や、Twitter 等で直接お声掛けください><)

www.wantedly.com

第 4 回のゲストは id:Songmu さんです。楽しみですね。 wantedly.connpass.com