2021年を振り返る
会社が大きくなってきた
従業員数は24名から49名へと、2倍の人数に増えました
人が倍に増えたのに、自分視点では何も問題を感じなかった
これはすごい事
労働環境を悪化させずにスケールさせるのは大変な事だと思う
twitterしてると、他社の人が「会社が拡大して何もかも最悪になった」とか愚痴を言ってるのをたまに見かける
少なくとも、自分の労働環境ではそういう不都合を感じなかった
勤怠システムが導入されたり、労務関係が整備されたり、色々なサポートを感じる 「俺は◯◯というサービスのUIがどうしても無理で、この作業やると頭おかしくなっちゃうからやりたくないんだよ〜」と愚痴言ってたらbalar.iconが巻き取ってくれたり等
でも無限にやる気が出てしまって、自分史上最多の530 pull requestをリリースした
作るだけ作って自己レビューでcloseした物や、他リポジトリも含めるともっと多い
労務関係の制度はすごい
わりと毎月全力を出し切った感があるのだが、ちょうど8時間×平日の数の勤務時間になっていた
残業時間は月3〜8時間ぐらい
有給も95%使い切った
楽しく全力を出せた
がんばってはいない
3月あたりに、10割でやったらどうなるか一ヶ月試してみて、まあこんなものかというのがわかった
それからは7〜8割の力でいいペースで続けられた
逆にこのペースで月の残業20時間とかやってたら体壊すと思った
つまり俺は全力を出し切ると8時間しか保たないので、残業は無理
8時間という制度はそれなりに考えられて決まった数字なんだろうな
[Scrapbox 2021/9以降やりたい事]の様なまとめページを作るようになった
背景
2020/12からbalar.iconがscrapbox開発に参加した
その前はしばらく一人でやってた
人が増えるにあたって重要な事は、shokai.iconが現状をどう捉えて、何をしようとしているかを共有する事だ
以下を明確に定義しつつ、自ら推進もする
このプロダクトはどういう意義を持つのか
それを使って人間がどうなるか
どんな機能で構成されていているのか
やらなかった場合
無限に会議をし続ける事になる
音声で考えを他人に説明する。そんな事不可能なのに
内容
現状認識
プロダクトの現状、ユーザーの求めている事を軽く分析する
アプリケーション全体として今重要な事
現状認識を土台にして、じゃあこのへんが必要だ
これが無いと
コンセプトが立たず、複数の機能がただ機能としてバラバラに存在するだけ
1つのアプリケーションにならない
4分類のタスクリスト
やるべき
やりたい(長期的)
やりたい(1 pull requestでできる)
運用改善
だいたい2〜3ヶ月毎に新しいページを作り、更新する
タスクリストは個別のページになっている
例
こういうのを書いておくと、プログラマーではない人でも感想や文句を言いやすい
細かいタスクではなく、現状認識とか、今重要な事とかのレベルでも話ができる
個別のアイディアにもコメントできる
プロトタイプを作った上で考えを修正していく
作っている途中や、作った物を触っていると新たにイメージが湧いてきたりする
全て言葉にしていく
これの効果は他の誰よりもshokai.icon自身にあったと思う
元々、各タスクにはこの2つが書いてあった
1. それをやると何がどう良くなるのか
2. 具体的にどういう手順で実現するのか
やり方も、その良さも説明されているので、見るとテンションがぶち上がってしまう
全てが関わり合って、連動している
タスク同士の大きな流れとして捉えられるまとめページを整備した
楽しすぎる
新機能の下準備としてのデータセットを作ってる段階から既に確かな手応えを感じる
Notaでは、「自律」という言葉をよく使います。メンバーそれぞれが、自分のプロフェッショナルとしての仕事の領域を持ちながらも、お互いに自分の仕事を開示して、レビューし合い、自在に連携していくことを指します。
自律という言葉は俺は最初の採用面談の時にしか聞いてないけど、自分の中にそういう考えはある
仕事を開示する事で連携をしていく
考えをまずは書く
Scrapboxに実装した機能2021
全文検索してから下までスクロール
自分が参加してる全projectに対象を広げて全文検索して、下に継ぎ足す
画像検索(OCR)
アップロード先をgyazoではなくscrapboxにして画像をアップロード
search formから検索すると、画像に写ってるテキストがヒットする
https://gyazo.com/47d9323ca0c9044c6163638af32a9ae2
新旧2バージョンのindexの移行
新indexがない時はとりあえず旧indexで検索結果を返し、準備ができたら新しいのに乗り換える
サーバー起動時にindex templateがなかったら自動的に作る
検索結果のPage rankソート
これずっとやりたかった。かなりいい感じになったと思う
たくさんリンクされてるページのスコアを上げる
スコアの高いページからリンクされてるページのスコアを上げる
新しいページのスコアも少し上げる
SEOのような悪意あるプレイヤーが介在しない、理想的なグラフ構造ができてる文書群をまずは作る
それから検索をやる
カラーテーマ
黒背景テーマもできた
監査ログ
誰がいつ何したか記録している
business project専用機能
アイコン記法の補完Popup
https://gyazo.com/98bac55f2d3daafedec1e0d47f13a66a
[を入力してpopupを表示
ctrlキーを押す毎に、アイコンとリンクが切り替わる tabもしくはshift + tabで選択
enterで決定
Gyazoのアップロード方式をOAuthにした
ついに3rd party cookie依存せずにGyazoにアップロード可能になった
appleめ
でも、おかげでGyazoのOCRテキストを取得して検索するのもできそう
まだやってないけど
Gyazo Teamsへのアップロード等も
段階的に移行していった
設定画面からopt-inで3rd party cookieからOAuthに移行できるようにした
3rd party cookieでの画像アップロード後に、ページ本文に「OAuthにしましょう」を表示
画像アップロードしようとしたら「OAuth認証してください」
CIがたまにランダムにfailする原因をつきとめた
コードが正しければ100% testが通過するようにできた。最高
navbar固定
socket.io 4 & redis 6への移行
クッソ大変かつ胃が痛くなった
一回リリース失敗して素早くrollbackした
全パターンに対応できるよう、アプリケーション側で差を丸めてから臨んだ
socket.io 2と4でプロトコルに互換性が無い
Heroku Redisのプランによって環境変数がREDIS_URLだったりREDIS_TLS_URLだったりする
中身もredis://だったりrediss://だったり
スマホからファイルアップロード
流れるゴミ箱
https://gyazo.com/6bd921cff9dd3a1ef84a7ee431d6bccd
mongooseの更新
mongooseのsetterという機能の挙動が途中のバージョンで変わっていた
がんばって全てsetter使わないよう書き直した
mongodbを4.x系に更新
mongooseさえ上がってしまえば後は問題なかった
オンプレ版のmongodbに推奨バージョンをもうけた
3.6未満はサーバー起動させない
4.2未満には警告を表示
おかげでmongodb 3.6から使える$exprが気兼ねなく使えるようになった
いくつかのqueryが効率化した
https://gyazo.com/bf173251c45e6ce1f1e233ccdee3cd5b
AquaSKK + FirefoxはcompositionEnd後に一瞬ディレイを入れないと、変換中に表示される▼が文字として入力確定されてしまう お絵かき機能関係
色とペンの太さを個別指定するようにした
https://gyazo.com/ba4fcee3269e50fb020ddb021ffd23f6
undoもできるようになった
project watch list横断検索
全文検索→下にスクロール→project横断検索→下スクロール→watch listも検索
スクロールする毎に検索対象を広げていくイメージ
ProjectCSSの読み込みで一切チラつかなくなった
before / after
https://gyazo.com/4f52af5d5901f61e22d0026d623773c8https://gyazo.com/d115e08c4a2e65408016ce9389144213
<style>を先に読み込んで、読み込み完了するまで<App>を非表示にしている
highlight & scroll
全文検索や関連ページから画面遷移する時に、マッチする位置までスクロールする
https://nota.gyazo.com/ef81993dbbd899d6381aabb5f3bda3ca
パッとわかる
「やる気を出すテクニック」の中で、「関連ページリスト」がどう言及されているのか
「最終的に見つかれば良い」の中で「リンク」がどう言及されているのか
エディタ内だけでなくUI要素にもマッチしてしまうので
x-assets-versionsヘッダというのを作り、全ての通信に付けた
ServiceWorkerでバージョンをチェックして、上がっていたら更新する
バックグラウンドに行ったブラウザウィンドウの扱い
一定時間使ってないウィンドウのwebsocketを切断する
これがサーバーのCPUリソースをかなり食っていた
たしかサーバー台数20%ぐらい減らせたはず
ウィンドウがactiveになったらすぐ再接続する
WebWorkerはデカイforループを回している
ブラウザがactiveではない時、ループにsleepを入れてゆっくり処理させるようにした
CircleCIのjobを並列化した
全testが4〜6分で完了するようになった
デプロイも速くなった
クソデカJSON
接続エラーのstatus bar表示
区別して表示するようにした
新バージョンデプロイ由来のgraceful shutdownによる切断
バックグラウンドに行ったウィンドウを一定時間後にオフライン状態にしてるんだけど、それはエラーではない
ユーザーの回線が切れたのが原因の切断
いろいろ工夫してたら不具合報告がゼロになった
master branchをそのままデプロイ
1プルリクをmergeする毎にどんどんリリースする
shift押しながらペーストするとできる
新しいproject menuとuser menu
RTL対応
アラビア語やヘブライ語を表示・編集できるようになった
アラビア語と日本語が混在していても、それなりに編集できる
https://gyazo.com/b66fd2ad41812dc231e687ec3dbb26d8
アラビア語は右から左に書く
日本語の部分のテキスト選択は左から右になっている
アラビア語部分になると右から左に選択される
RTL/LTRニュートラル文字
( ) [ ] { } 等
隣接する文字がRTLかLTRかで変化する
استمع (؟·معلومات)، ومعناها
エディタの中身の、特に座標系と当たり判定まわりを全て書き直した
既存の動作を守りながら両対応させた
auto project backupだけは30日後に時限削除
project全部削除してから、間違えて消しました!って言ってくる人が現れるかもしれないので
今のところない
JSON exportしたbackupだけは30日残しておく
Twitter URL貼り付けでtweet埋め込み
ctrl + shift + vかcmd + shift + v
Safariで謎のテキスト選択が発生する問題
mousedownとmouseupとclickの順序がおかしい
safariのdevtoolの中でも発生している
タップしただけでdrag and dropが発動して、devtoolのタブの位置が入れ替わったりする
異常に速いmousedownを無視するようにして対応した
YouTubeの再生リストやYouTube musicの埋め込み
Date modified with shokai.iconソート
https://gyazo.com/53ef2b1cf2fc3500f2eea20b8c9d3214
ページリストを自分のアイコンが付いたページのみに絞り込む
さらに未読マークも付く
更新チェックにも、mentionにも使える
backspaceキー押しっぱなしで高速に3行以上を削除してから何度もundoするとline_id does not existsエラーになる問題を修正
2年ほど前から、たまにline_id does not existsエラーで保存できない事があった
編集ではなくundo stackを積む所にbugを入れちゃってたのを見つけて、直せた
印刷した時によりまともな見た目になるようにした
business project専用機能
https://scrapbox.io/files/619b2d217df970001d6e29cf.png
project settingsで設定できる
オンプレ版のサーバー全体にも設定できるのだった。ヘルプ書き忘れてた
同じ設定値を各IdPがそれぞれ別の名前で呼んでいるので大変だった node-sassからdart-sassへ
数式記法を書きながらプレビュー表示
https://gyazo.com/dbf4f7f46a0b99074cdca44091893b1a
ページ内検索
https://gyazo.com/0006e0c5d67b058ed23bc388b4755e3b
mobileでquicksearchを選択して画面遷移してもdropdownが開きっぱなしで邪魔
これ直したはずなのにまた再発してる気がするshokai.icon
Project JSON importを複数のリクエストに分割する
これまで
1ファイルをそのまま送信していた
30MBまでしかimportできなかった
クライアント側でJSONファイルを分割してから、複数回にわけて少しずつimportリクエストをサーバーに送信するようにした
ほぼ無限サイズのimportが可能になった
JSONを分割するクライアントのメモリがあふれない限り
Copy plainのindent行頭に中黒を付けた
RetinaのGyazo画像が正しいサイズで表示できるようになった Retinaディスプレイでキャプチャすると縦横のピクセル数が2倍になる
DPIが2倍の144dpiの画像としてキャプチャされる
しかしHTMLやwebブラウザには、画像のDPI情報を考慮して表示しない
144dpiの画像を72dpiで表示してしまう
すると、こういう画像がブラウザでは2倍サイズで表示されてしまう
https://gyazo.com/14abdf449e4165e0850760a29560f3a5
project間のファイル複製
https://gyazo.com/30853388fc160f6b52dc96a8999038aa
これ押すとproject間でファイルを複製できる
Project menuとUser menuに分割
https://gyazo.com/318652b15a7118ead9fcb8745bd9f590
参加してるprojectとwatch listを同時にインクリメンタルサーチ
検索してない状態の時はタブ切り替えで片方ずつ表示する
検索しはじめると両方を並べて表示する
たまに参加してるかしてないかを自分でも忘れてるprojectがあるので
知人をprojectに追加する
business project専用機能
https://gyazo.com/482f4fd49126ac91c20595116512a131
無駄なやりとりがslackで行われているのを見た
「招待URLください」→「はい」→「参加しました。admin権限ください」→「はい」
「お前はadminとしてこのprojectに入れ」で完結させる
攻撃に使われる文字をコードブロック記法の中では可視化するようにした
なんか仕事の事ばっかだな
普通に旅行行ったり、作ったことない料理したり、ゲームしたりしてたんだけど
やっぱ今はscrapbox作ってるのが一番面白いな。娯楽的な意味で
こういう状況なかなかない、人生で3回くらいしか巡ってこないチャンスなので楽しませていただきます