2021/4に株式会社PR TIMESの執行役員CTOに就任しました。

今までソフトウェアエンジニアとして働いてきて、マネージャー経験もない人間が突然「執行役員CTO」という役職についたので、色んな人に驚かれ、今でも色んな人に理由を聞かれます。そういえば個人のブログなどで何も発信してこなかったので、理由を公開しておきます。

実は社内向けにCTO通信というのを書いているのですが、そちらの内容の抜粋です。社内ではもう少し赤裸々なエントリーになっているので、読みたい方は入社してください。

それとこちらのエントリーは主に私とこれまで一緒に働いてきた人向けのエントリーなので、私のことをよく知らない人はこの場で読むのを止めてください。これまでの私のキャリアについて興味のある方は職務経歴書を公開しているのでそちらを参照してください。

メルカリを辞めた理由

メルカリは働きやすく、いい会社で特に辞める予定はありませんでした。

CTOという役職自体には以前から興味がありました(その理由は後述)。しかし誰がCTOをやっても意味のない会社というのは存在するので、そういう会社に入社して自分のキャリアに傷をつけたくないなとも思っていました。なので今回の話をもらったときも最初はOKを出さずに、業務委託として社内を見させてもらうことにしました。

知り合いの会社で業務委託として働いた経験は何度かありますが、他社の中を見れると本業でもその経験を活かせたり、自分の考えを一般化させることができたりと、色々メリットがあります。なので業務委託を始めた理由はCTOをやりたいからではなく、PR TIMESの人達がどう働いているかを経験として見てみたかったという理由でした。

業務委託の中で開発本部だけではなく、色々な人と交流を持たせてもらい、この会社に足りていないことは私のこれまでの経験を使えば補えるのではないか、私にとっての次のチャレンジにこれ以上最適な会社はないのではないかとも思いました。

またメルカリのValueであるGo Boldが背中を押しました。特に2020年末にsuguruさんがメルカリCTOを辞めて、子会社のソウゾウのCTOになったことが私の中では非常に大きかったです。

メルカリのCTOという立場にあってもチャレンジし続ける姿勢を見て、私自身ももっとチャレンジしなければならないのではないか、と考えるようになりました。正直大好きなメルカリを辞めてまでCTOを引き受けるべきか悩みました。しかし今回の話を断ればメルカリの人間としてGo Boldではないのではないか、メルカリの人間だからこそ会社を辞めてGo Boldな挑戦をすべきなのではないか、と考えて今回の話を受けることにしました。

役職持ちに興味があった理由

大学生の時はエンジニアとして技術を極めたいという気持ちが強く、役職持ちになりたいという気持ちは全くありませんでした。

しかしこれまでソフトウェアエンジニアとして会社員として働いていく中で、技術だけで解決できない様々な問題にも直面してきました。そういった問題に直面したとき、私にできることは色々したつもりでしたが、平社員の立場ではできることは非常に限られており、根本的な対応をするには相応の立場が必要でした。

それまで役職持ちになることに興味が全くなかったのですが、そういった経験をしていく中で、本当は私は役職持ちにならないといけない人間だったのではないかと感じることもありました。

CTOという役職に興味があった理由

また技術的な部分でもトップでないとサービスをよくできないと感じることがありました。私はpixivというサービスのHTTPS化を行いましたが、当時各サービスが一気にHTTPSになった時期でした。Chromeが期限を示していたのでやらなければならない時期は決まっていました。各社がその時期に合わせて一気にHTTPS化したため、そのタイミングでHTTPSでないサービスはほぼなくなりました。

大規模なHTTPS化をしっかりやった会社に話を聞く機会がありましたが、どの会社もトップダウンでHTTPS化に投資することを決定していました。サービスを本当によくするためには経営陣が適切な投資判断を行う必要性があるということを強く認識した事例でした。

私はメルカリでも似たような事例として、古いTLS 1.0/1.1のサポートを停止するという対応も行いましたが、HTTPS化の経験からトップダウンの重要性を知っていたので、まずは古いTLSを落とす意思決定をトップの人にしてもらい、その後に社内手続きを進めるという方針で進めました。それにより意思決定してもらった後はスムーズに実行まで移せました。

古いTLSのサポートを落とす件はうまくいきましたが、サービスを技術面で良くしていくためにはトップダウンでの意思決定が非常に重要であり、本当に良いサービスを作りたいなら自分自身が技術的な知見から意思決定できる立場にならなければいけないという気持ちを強くしました。

ここで気をつけないといけないのは肩書きです。CTOという肩書きしか持っておらず、名ばかりCTOで実際の権限は全く持っていないという人も業界内には実はいます。

例えば「執行役員CTO」や「取締役CTO」という肩書きであればある程度経営に関わることができます。経営に関われるのであれば、HTTPS化のような一見投資する価値がないように見える技術投資も経営として必要であると経営会議などで主張できます。私の今の肩書きは「執行役員CTO」で経営会議にも参加しています。まだ不慣れで経営会議の中で有意義な発言をできていないのですが、これからエンジニア出身である私が参加している意義を発揮していこうと考えています。

最後に

以上の前提があったので、私はオファーの受諾前に「執行役員CTO」という肩書きになることを確認してからオファーを受託しました。名誉職のCTOならば断るつもりで聞いたのですが、経営にも関わって欲しいと代表の山口さんに言ってもらえたので、これは私の人生をかける価値があるかもしれないと考えて、挑戦を決めました。

まだ就任してから2ヶ月あまりですが、今後目指していく目標を定めたり、宣言通りに社内ISUCONを開催したり、セキュリティ向上のためにKENROを導入したり、社内IT改善のためにコーポレートチームを設立したりと、様々な改善のために一つ一つできるところから手を付け始めています。まだ準備中のものがいくつもあるので、公開できる状態になったら公開していくつもりです。

まだ始まったばかりですが、少しずつ前進していると思っています。しかし進めたくても仲間がいなければ進められないという現実にも直面しています。もし弊社の状況に少しでも興味がある方がいればtwitterのDMも開放しているので連絡をもらえたらうれしいです。


赤城山頂の赤城神社は時間の都合上行けませんでしたが、一応地図には載せておきます。

コロナ中ですが、一人で車で行く分にはリスクが低いのではということで温泉旅行をかねて行ってきました。群馬は東京から車で楽に行けるのに、有名な温泉地が多いので何回でも行けそうです。今回は伊香保温泉と草津温泉に行きました。


Oura Ringを買ってみました。

日本からでも公式サイトから買えます。サイジングキット発送→サイズ選択→商品発送になるのと、発送が海外発送になるので少し時間がかかりますが、それでも数日で届くので意外とスムーズに入手することができます。自分の場合1/24に注文して、2/1に商品を手に入れることができました。購入方法については以下の記事を参考にすれば大体の人が買えると思います。

サイジングキットで一番小さいサイズにするか、一つ大きいサイズにするか迷ったのですが、ピッタシでないと困るみたいだったので一番小さいサイズにしました。

自分より指が細い男性はあまりいないと思うので男性ならばほとんどの人にちょうどよいサイズはあると思います。しかし女性で指が非常に細い場合は一番小さいサイズでも太いかもしれません。もし気になるならサイジングキットを何らかの手段で先に手に入れるとよいかもしれません。Amazonでも転売?している会社がありますし、すでに持っている人からもらうのも可能(公式に推奨している)です。ちなみにOura Ring自体もAmazonで転売?している人がいますが、かなり高いのと配送期間的にも使うメリットは特にありません。普通に公式から買うのがよいと思います。

指輪にしては少し太いのもあって、少し邪魔ではありますが、日常生活に支障はありません。今もつけたままタイピングしていますか、特に気になりません。抜くのが少し大変だと思いましたが、石けんを塗ってから回しながら抜くと簡単に抜けそうなので問題なさそうでした。

睡眠スコアだったり、コンディションのスコアが出るので結構楽しいです。スコアとしてでるとハックして数値を伸ばしたくなるので、そういう性格の人には健康に役立ちそうです。ずっと座っているとプッシュ通知で「足を伸ばしてください」とか言われるのも楽しいです。

睡眠時間が正確にとれるのも驚きました。寝付きが悪い人間なので正確な睡眠時間がとれるのはうれしかったです。睡眠中につけていてもそんなに気になりませんでした。

充電は1週間に数回必要です。ただプッシュ通知で充電の必要性なども教えてくれるので何とかなります。充電ケーブルはType-Cだったのでスマートフォン用のケーブルを流用することができました。

ということで総じて言うと、とてもよいです。もうしばらくつけてみようと思っています。もしスマートウォッチの購入を考えている人がいれば、選択肢の一つに入れてみてもいいのではないかと思います。


私は趣味で歴史に関する本をよく読んでいるのですが、そこで気になる記述を見つけました。平家物語によれば、安徳天皇は80代の天皇で8歳の時に八岐大蛇の霊剣である草薙剣を取り返したと書かれているのです。

安徳天皇は数え年で8歳で崩御していることは史実です。しかし安徳天皇は現在では81代ということになっているので、80代というのは誤りのように見えます。この矛盾について、その本の上では特に触れられていませんでした。

多くの人はここで止まってしまう気がするのですが、私はある程度日本史を勉強しているので、天皇の代の数え方は時代によって異なっていたという知識がありました。特に安徳天皇の後の南北朝時代で、この時代は南朝と北朝がそれぞれ正当性を主張して並立したため、そこのカウントが一番混乱しています。それについて少し紹介します。

天皇のカウント

南北朝時代の天皇のカウント

現在の天皇は北朝の子孫のため、基本的には北朝が正当とされてきたのですが、明治時代に南北朝正閏論という論争が起こり、現在では南朝が正当だったとされているので、そこでもカウントが大きく変わっています。現在でも皇居に楠木正成の像がありますが、南朝側だった楠木正成の像が北朝の子孫である現在の皇族が住んでいる皇居にある理由はここにあります。

現在の天皇は126代124人とされていますが、このカウントは北朝の天皇(光厳天皇・光明天皇・崇光天皇・後光厳天皇・後円融天皇)が除かれています。ちなみに現在では旧皇族の皇族復帰案が一部の議員から提案されていますが、現在も存続している旧皇族と皇族はこの崇光天皇の子孫です。現在正当とされている天皇だと祖父に当たる後伏見天皇まで遡る必要があります。

ただ南北朝は安徳天皇よりも後の時代なので安徳天皇の代のカウントには関係ありません。他によく議論に上るのが以下です。

  • 神功皇后
  • 弘文天皇(大友皇子)
  • 淳仁天皇(淡路廃帝)
  • 仲恭天皇(九条廃帝)

それぞれについてなぜ議論になるのか軽く紹介します。

神功皇后

神功皇后は実在が疑問視されている非常に古い時代の人物です。神功皇后は欠史八代(系譜しか存在しないので実在したかが非常に疑問視されている天皇)の最後の天皇の開化天皇の子孫なので皇族の血を引いています。ヤマトタケルの子供である仲哀天皇の妻で、朝鮮半島を攻めて新羅など三国を支配下に置いた(三韓征伐)とされています。

三韓征伐が史実かどうかは今回は議論しませんが、現在の天皇の先祖である応神天皇の母親であり、古事記・日本書紀で非常に目立つ存在であることは間違いがありません。日本書紀では基本的に各天皇毎に章が分かれていますが、神功皇后は神功皇后専用の章が存在します。天皇によっては複数の天皇で一つの章にされているにもかかわらずです。神功皇后以外に天皇ではない章だと初代神武天皇以前の話である「神代 上」と「神代 下」の2つのみです。事実上天皇と同等の扱いがされていると言ってよいでしょう。

日本書紀によれば神功皇后が天皇であったという記述はありませんが、中世では天皇としてカウントされることが多かったようです。

弘文天皇(大友皇子)

今回紹介する3人の天皇の諡号はすべて明治時代に贈られたものです。そのため弘文天皇という呼び方は一般的ではありません。ここでは大友皇子と呼びます。

大友皇子は天智天皇の息子であり、壬申の乱で叔父の大海人皇子(天武天皇)と戦い敗れました。

天智天皇が亡くなった後にまもなく壬申の乱に突入したため、大友皇子が即位していたのかどうかは諸説あります。即位していたとすれば、大海人皇子は天皇に反逆したということになるので、天武天皇が編纂させた日本書紀ではわざと記述を曖昧にしたという説があり、一定の説得力があります。

実際に明治時代では即位説が有力となり、弘文天皇という諡号が贈られました。しかし現在では非即位説も有力になり、現在でも決着していません。

淳仁天皇(淡路廃帝)

奈良時代後半の聖武天皇には娘しかおらず、唯一の娘が孝謙天皇として即位することになりました。これにより血統の断絶が確定しました。そこで時の権力者である藤原仲麻呂(恵美押勝)の強い推薦により、天武天皇の孫である淳仁天皇への譲位が実行されました。

しかしその藤原仲麻呂が反乱を起こしたため、反乱に直接関わったわけではありませんでしたが孝謙上皇により廃位にされてしまいます。そのため天皇として認められませんでした。しかも諡号も与えられず、しばらく廃帝とだけ呼ばれました。淡路廃帝という呼び名はその後にもう一人廃帝が現れたので区別するためにつけられた呼称です。

その後に孝謙上皇が重祚をして称徳天皇になります。そのあたりについては以下の記事にも書いたので興味があれば読んでください。

仲恭天皇(九条廃帝)

父親の順徳天皇と祖父に当たる後鳥羽上皇が承久の乱で鎌倉幕府との戦争に集中するために、順徳天皇が譲位をしました。それが仲恭天皇です。承久の乱は鎌倉幕府の勝利で終わり、当然仲恭天皇は廃されます。即位後わずか78日で廃され、歴代天皇の中では最も在位期間が短い天皇です。

あまりにも短かったことと、幕府に特に嫌われた順徳天皇の息子ということもあり、こちらも廃帝として諡号を与えられませんでした。

安徳天皇の後の時代の話になるので、今回の議論では直接関係ありませんが、一緒に議論していきます。

中世で天皇はどうカウントされていたのか

本朝皇胤紹運録

今回紹介した4人を天皇としてどうカウントするかは定まっていなかったようです。今回は室町時代の後小松天皇の勅命で編纂された天皇の系図として本朝皇胤紹運録という資料があるので、こちらでどうカウントされているのか見ていきます。

今回原典を確認したかったのですが、なんと京都大学のwebページ上で原典を確認できました。本当にありがとうございます。

結論を言うと、神功皇后・淳仁天皇(淡路廃帝)は天皇としてカウントされており、弘文天皇(大友皇子)・仲恭天皇(九条廃帝)は天皇としてカウントされていません

まず大友皇子の即位に関しては江戸時代までほとんど議論されていなかったので論外です。仲恭天皇(九条廃帝)に関しては武家政権に反旗を翻したという経緯があり、時の将軍の足利義満が見ている中で天皇としてカウントするのは憚られたのではないでしょうか。

また後小松天皇は南北朝合一時の天皇であり、北朝側なので前述の通り北朝側の天皇でカウントしています。現在では後小松天皇は100代目とされていますが、本朝皇胤紹運録上では101代目とされています。

本朝皇胤紹運録上のカウント方法が正しいとすれば、神功皇后で+1、大友皇子で-1されるため、天武天皇と順徳天皇の間の天皇は現在のカウントと同一になります。その間である安徳天皇は81代目で変わらないという結論になります。

しかし神功皇后は前述の通り日本書紀でも即位したと記述されていないので、神功皇后をカウントしなければ80代目になり、平家物語の記述は正しいということになります。おそらく平家物語はこのカウントを採用しているのだと思います。

野馬台詩による百王説

少しおまけの話題です。割と最近でもマヤ暦の暦が途切れるという理由で2012年に人類が滅亡すると主張していた人がいました。それと似たような話で中世には百王説という説が存在しました。

野馬台詩という書物に天皇は百代で終わると予言されているという噂がされたのです。内容自体は割と意味不明でどうとでも解釈できそうな文章で、ノストラダムス感がある資料です。いつの時代も人々はそういう予言が好きなようです。

しかし当時かなり信じられていたようで、特に天皇と対立していた足利義満はこの説を信じていたという話があります。

そもそもなぜ後小松天皇は本朝皇胤紹運録を作らせたのでしょうか? 私の想像ですが、100代で終わるとされていた天皇の系図を作成することで誰が100代目なのかはっきりさせたかったのではないでしょうか?

その本朝皇胤紹運録では父である後円融天皇が100代目ということになっています。そうなると神功皇后を天皇としてカウントした理由は、自分自身を100代目としてしまうと足利義満から百王説を実現されてしまうから。だから自身を101代目とする系図を作ったのではないかと邪推したくなります。

最後に

なんでこんな記事を書いたのかというと、本朝皇胤紹運録に関する記述が非常に不親切な本があったからです(冒頭に紹介した本とは別)。当時の常識として大友皇子が天皇としてカウントされているはずがないのですが、それに関する記述がなく、当時としては議論がありそうな淳仁天皇に関する記述もありませんでした。神功皇后が追加でカウントされているため、曖昧にしても偶然数はあってしまうのですが、非常に不誠実だなと感じました。

そんな状況でもちゃんと原典を確認できれば、何が正しいのかしっかり確認できるということを再認識しました。本当に原典を公開してもらい、ありがとうございました。


もう完全に惰性でやっているだけですが、未来の自分のためにも今年も簡単にやっておきます。

ちなみに去年の記事はこちらです。

仕事

外に公開できるような仕事はあまりないですが、リリースされた成果はいくつかあるという感じです。もっと成果をいろいろ出せないといけないなぁという気持ちもあるので来年はもっと頑張ろうと思います。

アドベントカレンダーは書いたのでどうぞ。

一番大きな変化としてはCOVID-19によって出社がなくなって在宅勤務になったことです。最初はインターネット環境も貧弱で椅子もないし、色々と問題がありましたが、少しずつ解消して今ではそんなに困ってない位の環境になりました。

2月くらいからずっと出社してないので、来年は出社することがあるのか謎です。これから働く環境はどうなるのかよくわかりませんが、働く環境に関係なく成果を出せるようにしていきたいと思います。

たまに聞かれることがありますが、そもそも自分の会社だとオフィスが違う他部署の人・日本語が話せない人・タイムゾーンの違う人とかともコミュニケーションを取らないといけないことが多いです。なのでやりたいこと・やって欲しいことをちゃんと文章化していないと他部署の人は絶対に動いてくれません。リモートワークだと難しいと言っている人の話を聞いていると、文章力・読解力のないだけでは?と思います。リモートワークだから困ったみたいなことは労働環境以外はあんまりない印象です。

ISUCON10

予選で惨敗しましたが、本選問題を解く機会をもらえました。次は実力で本選出場したいです。

それと今年公開されたisucandarについて記事を書いたら一部の人達から好評でした。これからもISUCONが発展していくといいですね。

旅行


佐渡島に行ってきました。

佐渡島は日本神話の国産み神話でも出てくるので神話の時代から日本の一部と考えられていました。元々は現在の新潟県辺りが日本の北限と考えられていましたが、島を含めれば佐渡島が北限と考えるべきかもしれません。

対馬は朝鮮半島に近く、独自の文化が発達しましたが、佐渡は独自の文化が発達したとは言いがたいです。長らく佐渡国として独立した国でしたが、文化的には越後国の影響を大きく受けていました。また遠流の地とされていたので元々高貴な人間が流されることがあり、その流人からの文化の流入がありました。特に文化的に影響を与えたのは順徳上皇・日蓮・世阿弥の3人でしょう。

順徳上皇は承久の乱で父親である後鳥羽上皇と一緒に鎌倉幕府に対して反旗を翻しました。非協力的だった兄の土御門上皇と違い、積極的に関与したとされ鎌倉幕府からの相当な怒りを買いました。鎌倉幕府は後鳥羽上皇の子孫を天皇にすることを拒否したため、後鳥羽上皇の甥にあたる後堀河天皇が新しい天皇になりました。しかしこの後堀河天皇の血統は息子の代で絶え、残る皇族は後鳥羽上皇の血統のみになりました。そこで順徳上皇の息子を天皇に推す声もあり、京に戻れる可能性が出てきました。しかし順徳上皇を許す気がない鎌倉幕府によって潰されてしまいます。そして土御門上皇の息子である後嵯峨天皇が天皇となりました。これにより京に一生戻れないことを察して、その少し後に自殺に近い状況で佐渡で亡くなったとされています。この後嵯峨天皇は現在の天皇の直系の先祖です。ちなみにこの後嵯峨天皇の優柔不断さが南北朝の対立を生むことになり、日本史を振り回していくことになります。

話を佐渡島に戻します。戦国時代は島根県の石見銀山が世界経済に影響を与えるほどの銀の産出を誇りましたが、江戸時代の幕開けとほぼ同時に佐渡島で金山が見つかります。江戸幕府は佐渡島を天領とし、金山開発を行いました。佐渡金山は1989年に資源枯渇のため休山しますが、それまで一貫して金銀を産出し続けました。江戸時代は日本は世界への交易を制限していたので佐渡金山は日本経済に多大な影響を与えました。江戸時代の東日本の小判文化は佐渡金山がなければ成立しなかったかもしれません。

佐渡島は大きな神社はありませんが、佐渡金山はかなりおもしろい観光地ですし、一度行くと楽しめる地域です。

佐渡島の行き方

飛行機で行く手もありますが、新潟港から佐渡汽船で両津港に入るのが一番楽で便利でしょう。

問題はレンタカーです。島内にレンタカーは潤沢にないので土日などに借りる場合は早めの予約をした方がいいでしょう。フェリーで車を運ぶ方法もありますが、ジェットフォイルよりも遅いのと予約も取りにくいので現地でレンタカーを借りられるなら、そちらの方が楽でしょう。

今回は下のサイトの会社のレンタカーを利用しました。以前対馬でボロボロのレンタカーを渡されたので全く期待してなかったのですが、このレンタカー屋さんはほとんど新車で、自分も新車を借りることができたので快適でした。次も借りたいと思えたのでおすすめです。

行ったところ


久しぶりに旅をしてきました。今回は富山・新潟です。実は富山は母方の実家になるので用事があり、その後についでに回ってきました。

この辺りは観光地が多い地域ではないのですが、今回はゆっくり観光したかったのでちょうど良いということで行ってきました。

現在の富山・新潟辺りは古代では越の国と呼ばれ、元々日本の北限だと考えられていました。現在の東北地方は初代天皇という説もある崇神天皇も軍を送った話が残っていますが、日本の一部と考えられるようになるのはかなり後の時代のことです。大化改新の時代にも現在の新潟市辺りに渟足柵が作られたと考えられていますが、この渟足柵は東北地方を日本の一部にするための足がかりのような施設だったと考えられます。

新潟県の左端の糸魚川周囲は翡翠の神格化とされる沼河比売への信仰があります。この沼河比売は古事記によれば大国主命の妻なので出雲との関係もあり、また先代旧事本紀によれば沼河比売・大国主命の子供が諏訪大社の祭神でもある建御名方神とされています。つまり諏訪とも関係が深いと考えられます。これは出雲から対馬海流を通り能登半島まで行き、そこから新潟の姫川から遡り諏訪まで出る航路があったためと考えられています。

建御名方神について少し補足します。諏訪大社の祭神として著名ですが、日本書紀には出てきません。古事記では出雲の国譲りに唯一抵抗した大国主命の子供の神として記述されていますが、古事記に記述されている大国主命の子供の系図には書かれていません。先代旧事本紀によれば母は沼河比売とされていて、新潟県では広くそう信じられているようです。

この辺りは以前書いた記事にもある程度触れています。興味のある方は読んでみることをおすすめします。

富山


完敗です。悔しい気持ちもありますが、最後まで抜本解決に至れなかったので完敗したという気持ちの方が強いです。

リポジトリは以下でそのまま公開しています。軽くやったことを振り返ります。時間とかはざっくりです。それとチームとしてではなく、あくまでも自分の視点でのエントリーです。

追記 (2020/09/14):

事前準備

最初は一人で出ようかなーとも思ったのですが、今回はmethaneさんと一緒に出ることにしました。

他社の人と組むこと自体が初めてで、しかもお互いリモートでの参戦だったのでどうするか悩みました。

とりあえず普段通りSlackでの情報共有をしつつ、Discordで音声をつなぎっぱなしにしてお互いコミュニケーションを取れるようにしておきました。1度だけ事前に練習しておき、最初の30分感にお互いやることと、やりとりの雰囲気をつかんでおきました。

使用ツール

  • pt-query-digest (スロークエリ解析)
  • tkuchiki/alp (nginxのアクセスログ解析)
  • netdata/netdata (分解能が1秒で簡単に導入できるモニタリングツール)
  • catatsuy/notify_slack (自作のSlack通知ツール)

~1:00

最初は自分たちのサーバーのIPアドレスが分からなかったので、そこを探す作業から始まりました。本当はポータルに登録されている想定だったようですが、そこがうまくいっていなかったので情報を調べるのに苦労をしました。

軽く構成を確認してnginx/Go/MySQLという構成で普段と大きな変更はなし。メモリは2GBでCPU 1コアのサーバーが3台なので、CPUがボトルネックになると複数台使い切らないのと戦えなさそうという予感がありました(結局最後までCPUがボトルネックでしたが)。

チームメンバーに開発環境構築やデプロイスクリプトを試してもらっている間に、MySQLのスロークエリとnginxのアクセスログから集計結果を取れるように準備をしました。

アプリケーションのGo実装は自分が嫌いなechoが使われていて、少し萎えましたがそこは一旦気にせず進めます。

最初の時点ではMySQLのテーブルに一切インデックスが貼られていないのでいくつかインデックスを貼っていきました。

~2:00

レギュレーションでbotのリクエストに503を返してもいいと書いてあったので対応しました。当初はチームメンバーがGoで実装しようとしていましたが、Goのregexpは遅いので使わずにnginxで雑にif文で対応しました。雑にやり過ぎて一部漏れがあったことは終わった後に気づきましたが😅。

MySQLのスロークエリを見ているとN+1クエリがありそうな気がしたので、とりあえず shogo82148/go-sql-proxy を使って手元でSQLを見れるようにしました。

~3:00

MySQLのインデックスを追加しつつスロークエリを確認していくと、MySQL8から使える降順インデックスが使えるクエリが流れていたのでMySQL8化を決断します。今年のISUCONではnode.jsの実装を用意するアナウンスがされていたので、node.jsが未だに対応していないMySQL8は使ってこないだろうと予想していましたが、予想通りMySQL5.7だったので8にアップデートしました。設定ファイルをそのままでアップデートをしたところクエリキャッシュ周りの設定でエラーになりましたが、そこはサクッと直して無事起動しました。

MySQL8にしてインデックスを追加しましたが、スコアはあまり変わりませんでした。もう少し深入りした方が良かったかもしれませんが、この時はとりあえず先に進もうと思い、そのまま先を進みます。

~4:00

この辺りから本格的にアプリケーションの変更に着手していきますが、苦戦していきます。当初入れた最適化が、インデックスを追加したことでパフォーマンスが向上したところでfailするようになってrevertしたり、なかなか進められません。

~5:00

SQLが座標計算周りの複雑なもので、時間内に抜本的解決ができる自信がなく、MySQLのCPU使用率を時間内に下げきれないと判断しました。そこで3台の内2台をMySQLに使用することにします。レプリケーションを組むと変にハマる可能性があったのとテーブルは2つしかないので、goroutineを使って2つのDBに対して更新を同時に行うことで解決しました。結局MySQLのCPU使用率について抜本的解決ができなかったので、この変更が一番効きました。

~7:00

estateのキャッシュをチームメンバーが入れようとしていましたが、うまくいかず、可能性としてestateの更新をfor文で一つ一つ行っているからパフォーマンスが上がったときにエラーになるのではないかという仮説からestateの更新をbulk insertに変更しました。この変更自体はサクッとできましたが、スコアの向上効果は小さかったです。

最後

その後、さらにインデックスを追加したところエラーメッセージなしでベンチマークが終了するようになってしまいました。運営に質問したところエラーが多すぎるとこの状況になるとのことでした。パフォーマンスが上がることにより、nazotteのestateのN+1が詰まってしまいベンチマークが通らなくなってしまったようです。どうしてもこのN+1を解決したかったので一気にSELECTするようにしようとしましたが、なぜかベンチマークが通らず断念しました。ベンチマークのエラーメッセージが不親切で何を間違えているのか全く分かりませんでした…

そうしてコードを読んでいくと、NazotteLimitを超えた場合は捨てられるみたいだったのでNazotteLimitを見て途中で処理を打ち切るようにしました。少しだけスコアは上がりましたが、やはり抜本的解決が必要です。

さらにMySQLにインデックスを貼ろうとしていたのですが、インデックスを貼るとベンチマーカーが終了しなくなるバグを踏んでしまい、最後の1時間で予想外のタイムロスが発生して断念しました。

最後の最後でMySQL8のbinlogによってディスクがフルになってしまうトラブルがありました。なんとかbinlogを削除しましたが、ギリギリだったのでかなり焦りました。

最終的にチームメンバーがestateのキャッシュを一部だけ有効にしましたが、やはりnazotteが遅すぎるからか効果が薄く、最後までスコアを大きく伸ばせませんでした。最終スコアは1503でフィニッシュでした。

感想

最初見たときは行数がここ数年では少なく、時間内にボトルネックが全部なくなるのではないかと心配したのですが、全くそんなことはなく、今までの問題とは違うボトルネックでかなり苦しみました。

nazotteの最適化についてはN+1を解決するよりもアプリケーション側で座標計算するようにしてクエリ自体を不要にする方が確実だった気がしますが、やったことがない処理なのでプログラムを書ききる自信は全くありませんでした。そこの処理がやりきれればMySQLの負荷を下げられて次のフェーズに進めそうでしたが、そこまで進めずでした。空間インデックスみたいな機能もMySQLにある気がしましたが、使ったことがないのでそこまで手が出ずでした。

またMySQL8にしたりと色々作業をしたのに効果が全体的に今ひとつだったので、もう少し根拠を持って作業を進められれば違ったのかもなと思います。

ベンチマーカーのエラーメッセージが不親切だったり、バグがあってよく分からない挙動をしているのが非常につらかったので、そこは改善の余地がありそうな気がしています。具体的にはベンチマーカーのエラーメッセージが多すぎる場合は切ったり、一定時間ベンチマークが終了しない場合は強制終了するなどです。エラーメッセージの打ち切りはISUCON6本選の時はやっていました。ベンチマークが終了しない場合の強制終了はISUCON6本選もISUCON9予選の時もやっていました。なので過去にもあったことのような気がしていますが、この辺りは運営側の情報公開を待ちたいと思います。

問題は自分には絶対に作れない非常に素晴らしい問題でした。運営の方々、本当にありがとうございます。また復習して次に備えたいと思います。


Notionにnotify_slackの使い方を書いたので是非参考にして下さい(現在はzennに移行しているのでURLを変更しました。記事自体は残しておきます)。

今まで情報がMedium上の記事でバラバラに書かれていたりしていたので、今後も更新し続けられるようにNotionで書いてみました。今後も更新していく予定です。

使い方等はREADMEに簡単に書いていましたが、SlackのAPIの仕様に引っ張られている部分もあり、SlackのAPIの仕様を知らない人には分かりにくいところもあります。またユーザーのほとんどは日本語圏なので自分も得意な日本語でフォローする記事が欲しかったので書いてみました。

今まで機能名も特に決めていませんでしたが、説明しにくかったのでそれぞれ「ストリーミング機能」「Snippet投稿機能」という名前を付けました。今後使っていくかもしれません。

Notionは本当に書きやすくてすごく良いプロダクトだと思います。Mediumの完全上位互換です。ブログもNotionで書きたいですが、今のところ公式の方法は無いので早く公式の方法が提供して欲しい気持ちです。


家にいる時間が増えたので、これまでにないコンテンツの提供を考えて、授業動画をYouTubeに上げてみました。手間もかかるし、ネタも限られているので既に飽きてきましたが、せっかく環境ができて上げてみたので紹介します。

再生リストも作っています。

高校数学 — YouTube

高校数学と言っていますが、2進数・8進数・16進数の話に関しては数学が苦手だがコンピュータで使うので知りたいという人でも理解ができるように、中学数学までしか使わないように解説しています。

教科書には載ってないが、知っているかどうかが差を付ける知識を解説しているつもりです。なのでネタがそんなにないですが、結構斬新な動画になっているのではと思います。一人でもおもしろいと思ってくれる人がいればいいなという気持ちです。

撮影環境

とりあえず手軽に始められることを重視しました。スマートフォンのマイクやカメラが普通に性能がいいので、これを超えるものを用意するにはかなり高いビデオカメラを買う必要があります。最初は需要があるか分からないので、今回はとにかく簡単に安く環境を作ることを目標にして以下の方針で用意しました。

  • 撮影機材はスマートフォン
  • 動画編集はiMovie

iMovieは凝ったことは一切できませんが、不要な箇所を削除したり、複数の動画をつなげたり、簡単な文字を差し込むくらいなら普通にできるので最初の時点ではこれで良さそうです。

撮影をするにあたり、以下のものを購入してみました。

Amazon | nu board (ヌーボード) A4判 NGA403FN08 | ホワイトボード | 文房具・オフィス用品

大分よい感じです。普通に業務でも使えそうなので今後使ってみようと考えています。

catatsuy

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store