2020年を振り返る
相変わらず適当なペースでCosenseを作っていた
色々大変な年であったが、株式会社Helpfeelの労働環境としては個人的には変化なかった
完全リモートワークでずっとやっていたので
久しぶりに個人の能力的な成長があった年だった
あまり外出しなかった
COVID-19で外に出れないので
電車に乗ったのも、春と秋の健康診断の2回くらい
GoToトラベルで伊豆下田には行った
飲食も観光も完全に密を避けれた
部屋に露天風呂があって2泊3日で12回ぐらい入って最高だった
https://gyazo.com/97a250efb01db1cec31adedbb577b8bf
外出しなかったぶん食べ物は色々変化があったかも
2020年の食べ物に書く
仕事
書ける成果のうち主な物は下のような感じ
他にも色々やってはいる
プロトタイプ作って自分で自分のプルリクをレビューして叩いてcloseしたり
bug修正やライブラリアップデートなど
2月ごろ
4月にユーザーが増える事を予想していた
準備はしていた
Node.jsのcluster化など
それだけでは足りなかった
4月頭、Covid-19で急に1.5倍ぐらいユーザーが増えた
急激にリクエストが増えると、これまで問題として現れていなかった不具合が表面に出てくる
サービスが30分ほど不調になった事が3日間、合計5回ほどあった
CPU使用率やIOPSなどのmetricsを見てscrapboxのサーバー側の事を考えれるようになった
超久しぶりにプレッシャーで胃が痛くなって気持ち悪くなった
なんとか乗り越えた
クソデカJSONとの戦い
titlesの取得を複数回に分割する with daiiz.icon
サーバーでクソデカJSON作るとNode.jsのパフォーマンスが落ちる
pagingして解決
WebWorkerからUIスレッドへのpostMessageをchunk分割する
WebWorkerからUIスレッドにpostMessageでクソデカJSON送ると、UIスレッドがフリーズする
chunkingして解決
Auto project backupを1ページずつJSON化してwritable streamに出力する
数百MBのクソデカJSON生成するとnodeがJavaScript heap out of memoryで落ちる
人が多いprojectがそれなりの期間運用されて、ページが蓄積されバックアップも巨大になった
streamでJSONをパーツ毎に動的に作って流して解決した
JSONという効率の悪いフォーマットを選んだ事を少し後悔もした
末尾まで受信しないとparseできないフォーマットよ
あと、でかいobjectをconsole.logするとdevtoolにobject出力が残り続けてメモリリークするというのもあったな
この頃に得たインフラ・パフォーマンスチューニングの感覚と作法は、自分が成長した感があったshokai.icon
詳解システムパフォーマンスで読んだ事柄も役に立った
実際やってみないと身には付かない
mLabからMongoDB Atlasへの移行や、Elasticsearchなどにも役に立った
逆にCovid-19の影響で、いくつかの機能への要望が激減した
Offline modeなど
人々がインターネットの無い場所に行く頻度が減ったのだろう
2020/8ごろ、GCSファイルアップロードを実装した
signed URLを使ったファイルアップロード
cloud functionsでサムネイル作ったり
ずっとほしかった機能を、やったことない新アーキテクチャで実装して、ちゃんと動いてよかったshokai.icon
署名付き URL を活用して Cloud Storage に画像ファイルを直接アップロードするアーキテクチャを設計する | Google Cloud Blogとはちょっと違った方式になっている
サーバー側のコードを書かずにスマホ等のクライアント側だけでアプリの実装を完結させる為の機能だと思うけど、こういうの普通にwebアプリにも有用なので便利ですね
リクエストが一切app serverを通らないのでサーバー負荷が全く無い
クライアントがリクエスト→Node.js app serverでsigned URLを発行、リダイレクト
こうするとServiceWorkerでファイルをcache storageに入れる事もできる
なかなか効率よい実装ができた
mLabからMongoDB Atlasに移行した
5月か6月ごろ、急に「サービス終わるから」と言われてヒエーと思いつつ、まあなんとかなるだろと楽観
実際そんな大変ではなかったが
どうしても数分のダウンタイムは発生するので念のため夜中にやった
昼間にサーバーを見守りつつ夜中にインフラ変更してたら若干体調悪くなった
移行した
Scrapbox本体
Scrapbox セミオンプレ版全部
staging環境
Helpfeelも
サーバー構成を細かく設定できて面白い
MongoDB AtlasはHeroku addonがない
mLabはHeroku addonで使ってた
これは実際Atlasを使ってみて理由がよくわかった
DBaaSは、パフォーマンス・メトリクス情報を利用者に提示する事で教育する
利用者はCPU・メモリ・サーバー構成を自由に変更し、試行錯誤する
アプリケーション毎に最適なDB構成は違うから、運用ログに基づいて設計にフィードバックするべき
heroku addonは料金プランが1次元だから、そういう細かいチューニングができない
複数の人が並列してページ作る、リンクする、ページ分割する、ページのマージ、の粗がなくなってきた
色々やった
Update LinksとMerge pagesのボタン2つが1つに統合された
他のページから新たにリンクされたら、関連ページリストをリロードする
他のページからリンクされたら関連ページリストが更新される
これまでは編集したページ側しか更新されていなかった
タイトル変更したページ内のリンク記法も更新する
Socket.IO再接続後の挙動
titles API再読み込みをwindowがactiveになるまで待つ等
などなど
merge pageで合流できる様になった
これまで
存在しないページをslackなどから共有されて複数人が同時に書き始めると
タイトルに_2がついて別ページに書く事になってしまっていた
合流できるようになった
https://gyazo.com/feb47a04d1c23d6627c57cf1f709da7b
/help-jp/Micorsoft Azure Active Directory認証や/help-jp/メール認証を追加したりもした
絶妙なアイディアで整合性を取った
実装は普通
実装よりも仕様を練るのをがんばった
新機能と既存の仕様の辻褄をなんとかうまく合わせた
全文検索にElasticsearchを導入しはじめている with balar.icon
まだ試験的な段階
クリスマスに実装した
今の所調子よく動いてる
一旦実装を終えて、どこをどう直していくか整理してだいたい見えたところ
来年はオンラインでdrinkupなどやりたい