Scrapbox に戻ってきた

Scrapbox に戻ってきた
Roam Research をしばらく触ってたが、結局馴染まなかった
一番キツかったのはブラケットが二重なこと
markdown が根本にあるからブラケットが二重だったりするんだろうなあ
Roam を体験してみると、Scrapbox の 2-hop link のありがたみが染みた
とはいえ、収穫もあった
3カラム方式が便利だった
左サイドバーに Daily Notes へのリンク、任意のページへのリンクが追加できる
右サイドバーは最初は使い方が謎だったんだけど、任意のページを表示できる
表示だけではなく、編集もできるのでメインのカラムで書きながら別ページにコピペしたり、block への ref を貼ったり、割と便利
todo の管理
cmd + Enter で todo が追加/完了がトグルできるのが意外と便利だった
もう Todoist じゃなくていいな、とおもったので Todoist を身辺整理してしまったぐらい
テンプレート
;; でテンプレートを挿入できるのが便利
Scrapbox は new の時に挿入できるだけで、一度ページにしてしまうと基本コピペするしかないはず?
もしくは popup menu?
Block reference
Scrapbox でも当該行をリンクすることができるけど、行の内容が出ないのがツラい
Block に対してファジー検索できるのは面白かった
リンクにしてない部分もサジェストしてくれるので、とりあえずリンクせずに書き付けておいて、後からガッと張るみたいなことできるけど、なんかその2段階方式があると逆にリンクが育たない感覚があった
current time
日記をつける時にラク
これは早速 Scrapbox にフォーマットを追加して、ctrl-t で優先的に時間が出るようにした
tomorrow/today/yesterday
これも Daily Notes 周辺の参照にラク
モバイルで両方のPWAを使ったが、Roamの方が出来がよく感じた
起動すると Quick Capture というシンプル版がまず起動して、それを後から同期するという仕組み
Scrapbox は、出先などでメモりたい時に起動が遅くてちょいストレス
とはいえ、この QC は手動で同期しないもいけないのでダルい
この時代にモバイルでノートテイクすることが減ってはいるが
つーわけで、Roam の体験をある程度維持しつつ、Scrapbox で生きていくにはどうするか、と考えた
最初はWebサービスにして、iframe でがんばれるか...?とおもったが、Scrapbox がちゃんと iframe 対策していて無理だった
モバイルのことも考えると何かと便利かなと...
Electron とか React Native あたりも考えたけど、あまり詳しくないのでやめた
となるとChrome拡張だよなあ、というわけでまた Chrome Extension を書きはじめた
Scboloo にちょい手を入れてるのを含めると、スクボ関係の CE は4つめくらい...
いい加減大統一拡張つくりたい気持ちはある
3カラムはどうやって実現するかは迷い中
CSS Grid でやりたい気はする
とりあえず todo をなんとかできるか調べてみたが、Scrapbox でタスク管理している人でもたぶん x みたいなのを自分で書くか、ポップアップメニューから〜というやつっぽい
ポップアップメニューをプログラマブルに出して選択できればラクそうだけど、文字選択状態にならないと引っ張り出せなそう
それはめんどい
グループウェアとしての Scrapbox の思想においては機械的な編集、変更を容易にさせないというのはすげーわかるのだが、こと独りジャーナルをやるには足枷になってしまう気がする
とはいえ、入力はしていても、最終的にはプログラムが書き込んでるわけだからどっかで介入できるっしょ〜とおもったが、そういえば Scrapbox は WebSocket で通信しているんだった
ws か〜となって以前諦めた記憶が蘇ってくる
が、WebSocket をインターセプトして送受信をジャックすればなりすませるんじゃね...?と思いつく
普段の仕事では絶対に書かないのだが、const originalWs = window.WebSocket; originalWs.prototype.send = data => {...} というようなコードを全てが始まる前に挿し込めばインターセプトできる(治安が悪い)
あとは Scrapbox の通信を眺めて、それらしい commit を send してやると変更することができた
ハマりどころ
parentId
たぶん HEAD の commitId のこと
commit するとサーバから commitId が返ってくるので、繰り返し編集する際にはこの値を保持しておく必要がある
任意の commit を送ると、Scrapbox 側のステートと齟齬が出る
恐らく入力されたものがローカルの状態を更新して、それを commit することでサーバとは同期しているんだとおもうが、こうなってると機械的に送った commit が開いてるページでは反映されなくなってしまう
さすがに WebSocket をインターセプトできても、レスポンスを偽装することはできなそうだったので、別で iframe を開いておいて iframe で commit すると開いてるページでは他のセッションが更新した情報が WebSocket から流れてきて、更新が反映される
(微妙な実装)
前述の commitId も親 frame 側の更新でも更新されてしまうので、親 frame で commitId を受け取ったら iframe 側に伝播させておく必要があった