LT:作ったUserScriptの紹介
Scrapbox Drinkup #12 RETURNSのLT案の一つ
自分はtakker.iconさんが作ったもの(ScrapBubble, external-completion, etc)の存在を知っているけど、未知の人にとっては「そういうものが存在する」という事もおもろい気がするblu3mo.iconLT:UserScriptを支える技術#63cf2cc679e11300007a9d6a
ということで、試しにUserScriptの紹介だけするページを作ってみる
紹介するだけなのに、たくさん説明したくなってしまう
いつの間にかLT:UserScriptを支える技術と同じ内容を書いている気がする
やること
MVPつくる
21:56:12 あと4分でlimit!
なーんかLT:UserScriptを支える技術に書いたことをもう一度書いているだけな気がしてきた……
ならコピペすればいいだけなのだが、いかんせんスマホから書いているため、簡単にコピペ作業できない……
ともかく、骨組みを作ることを優先しよう
❌発表にかかる時間を測定する
5分以上かかるなら内容を減らす
練習する機会を逃した
/scrapbox-drinkupに移動する
こんにちは。takkerですtakker.icon
飛び入りLTの機会に備えて作った資料です
作っておいて機会がなかったらなんか恥ずかしいですけど……まあ気にしない
LT枠は一杯になっていた(2023/01/29)cFQ2f7LRuLYP.icon
日陽ってLT枠をとらなかったチキンですtakker.icon
スケジュール上は、懇談会・飛び入りLTという項目があるのでそこでワンチャン……
自己紹介
2020年にScrapboxを使い始めました
よく/villagepumpにいます
UserScriptをよく作っています
Scrapboxをガンガン改造している
https://gyazo.com/cff17c688e3d34c4c7cc0cc2be5ab181
右上:Page Menuを横倒しにしたもの
横倒しなのは、/takker/カーソルのある状態でPageMenuを押すと、menuが押されずに.expandable-menuが閉じてしまうの回避策
左上:/takker/scrapbox上でリアルタイムに残り時間を表示するUserScript
左下:Porterっぽい編集バーを生やすUserScript
popup menu
https://gyazo.com/5753dada2556e8f162fd5f5d46745508
/takker/PopupMenuのbuttonにFontAwesomeを使うUserCSSで小さくまとめている
いくつかのボタンは、PopupMenuのbuttonを非表示にする方法を使って、一定条件下でのみ表示されるようにしている
実際に動いてるの初めて見たMijinko_SD.icon
直近だとscrapbox-local-graphを作りました
(TODO:GIF作る)
https://gyazo.com/47fb719c83929fdf20e917c9e0b2505a
LT:UserScriptを支える技術#63cf59681280f000005cdcbb
demoする?
関連ページリストをグラフという別の見方で一覧できるのが興味深いと感じている
複数の2 hop linksでつながったページがわかるなど、関連ページリストではわからない関係性もみれる
まあそれがどう便利かまではわかりませんが……
takker.iconはグラフの活用法に明るくないので、どなたか強い人の意見を聞いてみたいところです
takker.iconが作ってきたUserScriptを簡単に紹介していこうと思います
インパクトのありそうなUserScriptから先に紹介
ScrapBubble
選択範囲に似ているリンクを入力補完するUserScript
ScrapBubble
リンク先のページ本文や関連ページリストをバブル表示するUserScript
リンクにカーソルをかざすと現れる
https://gyazo.com/fe4d5b4144e609ee923ca4eae768ae52
from /motoso/ScrapBubbleを試す#61def646774b17000038df35
https://gyazo.com/aea1046bc4bd6f5b7d81320e4feb4330
わあ!どなたかGIFを作って下さった!!
ありがたや!!!takker.icon*4
→LT:UserScriptを支える技術#63cf58bc1280f000005cdcb6
過去の自分に感謝
自分が撮ったやつだったのか……忘れてたtakker.icon
daiiz.iconさんのScrapScriptsがベース
特徴
クリックなしでScrapboxをブラウジングできる
リンク先を表示する (ScrapScriptsにもある)
表示した本文中のリンクの本文をさらに表示する (ScrapScriptsにもある)
リンクの関連ページリストを表示する (ScrapScriptsにもある)
関連ページリストから更にバブルを表示する(ScrapBubble固有の機能)
以下全てScrapScriptsにはない特徴です
ページ内容の表示
インデントを表示する
XSS対策あり
動画やタイトル付きオーディオを表示できる
コードをコピー可能
表示したページ本文を選択してコピーできる
複数のprojectを透過的に扱う
project分断問題を避ける方法として考えたもの
private projectに書いたことをpublic projectから参照できる
書き出したことを公開か非公開かで分けたとしても、全て自分が考えたこととしてページをつなげられる
ここにも画像を貼る
External Linksも表示できる
https://gyazo.com/7c805495f71e0735f28df214cab99e37
External Linksの2 hop linkを実現できるのが興味深いと思っている
(TODO: /shokaiの適当なリンクから、同じprojectのほかのページが関連ページに表示されている画像を貼るか新規撮影する)
当たり前のようにAPI解析してるのつよいMijinko_SD.icon
デメリット
編集する動線が消えている
Scrapboxは、本文を読むとき常にページを開く必要がある
これにより、「開いたついでにページをちょっと編集する」といったことができる
bubbleすると開かずに中身をみれてしまうため、「ついでに編集する」という動線が消える
チラチラして見づらいUI
まあこれは好み
不便かもしれないが、takker.iconは多少の不便なら慣れてしまう質なせいか、気になっていない
この点でScrapboxに似たような機能
あんまり project
選択範囲に似ているリンクを入力補完するUserScript
yosider.iconさんのコメントを着想に作ったもの
[]を書いてからリンクる語を書くのではなく,書いた語を選択してリンクする場合はpopupが出ないので難しい?yosider.icon/forum-jp/どこからもリンクやタグ付けされてないページを探したい#5c7627a8e5172d0000572185
/icons/知らんかった.iconyosider.icon
https://gyazo.com/47292d286e8b30d9a53256e436f1274c
後述する外部projectの入力補完
外部projectのリンクも、内部projectのリンクとして補完される
複数のprojectを透過的に扱うことを前提とした仕様
外部project linkは、右のアイコンをクリックすると入力できる
誤字っても出てくるの知らなかったMijinko_SD.icon
external-completion
emoji selector
「体調が悪かったので作った」とは🤔Mijinko_SD.iconsuto3.icon
[a]って/arplaかMijinko_SD.icon
ScrapJupyter
miyamonz.iconさんが作成した、コードブロック記法に書かれた任意のJSを実行するUserScript
https://gyazo.com/cab41adb9f3b9d8bd01368d2bf1a3c58.mp4
ちょっとしたコードを実行して試すのに便利
特に、スマホでコードを書きたくなったときに便利
スマホだと開発コンソールを開けないから
takker.iconはこれをTypeScriptとJSXに拡張した改造品を使っている
https://github.com/takker99/ScrapJupyter
CSPの都合でgithubなどのコードをimportできないのが不便
TamperMonkeyと組み合わせて解決することを考えている
FirefoxだとCSP壊れてるたのは草Mijinko_SD.icon
FirefoxのCSPガバガバ説takker.icon
URLに?devとつけると、UserScriptが無効化された環境でテストできるようにしているらしいMijinko_SD.icon
UserScript開発を支援するツール
ライブラリ
scrapbox-userscript-std
ScrapboxのUserScriptを作るときによく使うコードスニペットを、一つのrepoにまとめたもの
すべてTypeScriptで記述している
これ便利Mijinko_SD.icon
拡張機能
TamperMonkey
scrapboxのCSPを突破したいときに使う
サーバー側がCORSで拒否しない限り、ほぼ全てのドメインとfetchできる
WebSocketやEventSourceなど、fetchで使えないものは無理
scrapbox-keicho
初出は/ci7lus/たのしいScrapboxUserScript
使用例
/takker/選択範囲をKeichoに尋ねるPopupMenu
外部リンク
ツール
開発方法
以前はコードブロック記法に直接JSを書き、自分のページからimportして使っていた
書き換える→リロード→試す→書き換える→……の繰り返し
hot reloadなんてない
使っているUserScriptが多くなるにつれてリロードに時間がかかるようになり、苦痛だった
今
TypeScriptで書いている
型で事前にバグの大部分を取り除ける
型でカバーできない箇所も、deno testである程度チェックしている
Denoをつかっている
URLで各種開発支援機能を使えるのが非常に便利
例えば型チェックはdeno check --remote の後にコードブロック記法のURLを貼れば実行できる
公開projectにコードを書いてあれば、これで型の恩恵を受けられる
Nodeだとこんなことできない(はず)
gitも使っている
/programming-notes/文芸的プログラミングの限界
簡単なUserScriptや試しに作った即席コードは、Scrapboxで直接書いている
型チェックは手動でやる
大規模になったり複雑化したりすると、gitに移動してlocalで編集する
入力補完が効くので楽
リアルタイムに型チェックや文法チェックが走るのも快適
コードブロック記法だと、文法エラーすらdeno checkするまでわからない
gitを使う基準
ソースコードが増えてきた
versionが増えた
TyepScriptはそのままweb browserで実行できないので、bundleする
scrapbox-bundler
esbuildをweb browserで動かすアプリ
スマホでもUserScriptをbundleしたかったので作った
bundleがよくわからないユーザーでも、リンクをクリックするだけでコードを生成できる点が強み
webページのスタイルが雑だったりUIが不便だったりするが、目的は果たせているので改善するモチベが湧かない……
今まで作ってきた
ここは研究100連発っぽく紹介していく
間に合わないのでカットかなあ
ショートカットキー
/takker/ScrapBindings
/takker/Popup Menuに独自のkeyboard shortcutを割り当てるUserScript
popup menu
/takker/複数行に打ち消し線を引くPopup Menu その2
/takker/複数行に打ち消し線を引くUserScript
/takker/複数行に打ち消し線を引くPopup Menu@0.3.0
/takker/unlink Popup menu
/takker/一旦改行を消して句点で改行し直すPopupMenu
/takker/改行を消すPopupMenu
/takker/句点で箇条書きにばらすPopup Menu
/takker/Ankiの穴埋めを作るPopupMenu
/takker/選択範囲を辞書検索するUserScript
/takker/popup#5f7554581280f00000c1df6a
/takker/popup#5f7554581280f00000c1df7a
/takker/選択範囲をMarkdown記法に変換してclip boardにcopyするPopupMenu
/takker/replace text UserScript
改造品
Page Menu
/takker/メモ帳を表示するPage Menu
/takker/Kakeruを開くPage Menu
web app on scrapbox
/takker/WebからコピペしたらSB記法に変換する - Scrapboxとあそぶ
改造品
/takker/takker99/ScrapBubble
user向け部品
/takker/Projectを横断してリンクを置換するUserScript
/takker/URLを外部リンク記法に変換するUserScript (TamperMonkeyなし)
/takker/選択範囲無しでページを切り出すUserScript
/takker/custom-new-page-3
/takker/Inboxに素早く入れるUserScript
/takker/IME onの時、キー入力をScrapboxに渡すUserScript
developper向け部品
scrapbox-userscript-std
入力補完
takker.iconの大規模UserScript開発の原点
emoji selectorをFirefoxで動くよう改造するついでに、コードをリファクタリングしようとしたのが始まりだった
emoji selector
external-completion
(今までに撮影したGIFを貼る)
外部projectの入力補完をするUserScript
emoji selectorが別のprojectのアイコンを補完していることから、同様に別のprojectのリンクも補完できるようなUserScriptを作れると思い、作成した
versionがいくつもある
/takker/external-completion
/takker/external-completion-2
/takker/emoji-completion
/takker/scrapboxのページを一つにまとめるUserScriptした
/takker/scrapbox-external-backup
/takker/scrapbox-external-backup@0.2.0
/takker/key boardだけでpage遷移
/takker/Markdown形式でページのURLをコピーするPageMenu
/takker/scrapbox記法のtableをmarkdownに変換する
/takker/Gyazoにuploadした画像URLをコピペするPage Menu
/takker/svg URLを画像にするPopup Menu
/takker/選択したGyazo画像のtrimmingページを開くPopup Menu
改造品
/takker/関連ページリストを吹き出し表示するUserScript
/takker/足跡を表示するuserscript
/takker/scrapbox-history-slider
/takker/scrapbox-speech-input
/takker/scrapbox-icon-button
/takker/更新行をスクロールバーに表示するUserScript
/takker/scrapbox-pomodoro-timer-2
/takker/授業計画をばらすPopup Menu
/takker/mobileからtimestampを行頭に挿入するUserScript
/takker/mobileでURLを外部リンク記法に変換するPage menu
/takker/アナログ時計を表示するUserScript
/takker/井戸端を開いてからの経過時間を表示するUserScript
/takker/takker-workflow
/takker/takker-scheduler-3
/takker/takker99/takker-scheduler/mobile
/takker/takker-workflow@0.0.1/next-action-viewer
/takker/Open Google Calendar PageMenu
/takker/次に取るべき行動の一覧を表示するPage Menu
/takker/今日やるリストを表示するPageMenu
/takker/telomereを維持して別projectにページをexportするUserScript
/takker/scrapbox-embed-tweet
/takker/scrapbox-url-customizer-2
/takker/url-info
/takker/scrapbox-headless-script
/takker/scrapbox-api-helper
/takker/scrapbox-selection-2
/takker/scrapbox-keyboard-emulation-2
/takker/scrapbox-insert-text
/takker/scrapbox-dom-accessor
/takker/scrapbox-position-2
/takker/key2keyCode
/takker/Vim-keymap-converter-2
/takker/@takker/ScrapJupyter
/takker/Scrapboxのページ遷移を検出
UserScriptでできること、できないこと
できること
DOM操作
今開いているページの任意の位置に任意の文字列を書き込む
開いていない任意のprojectの任意のページに任意の文字列を複数箇所に同時に書き込む
Scrapbox上に新しいweb appを動かす
全く関係ないアプリとかも作って動かせる
preactなどのweb frameworkももちろん使える
最初に紹介したUserScriptはpreactで書いている
CDN配信されているJSを読み込む
cdnjsからなら読み込める
できないこと
CSPで許可されていない外部リソースを取得する
connect-srcはTamperMonkeyで突破できる
それ以外は無理
iframe
許可された外部コンテンツ以外は埋め込めない
worker-src
script-src
ESModulesのimport
せめてcdnjsのコードくらいはimportさせてほしい……
Scrapbox本体の内部に介入する
defaultの入力補完アルゴリズムを入れ替えるとかは無理
UserScriptの良いところ
公式で実装(されていな|される予定がな)くても、なければ作ればいんだよ!の精神で実装できる
External Linksの2 hop linkや数式をpreviewするUserScript
未知の領域
UserScriptでやったこと無いこと
動画・音声
→LT:time-mirrorをいじりたいへ続く
お絵かき
canvasを使った画像処理なら少しやった
/takker/PDFjsのviewerから画像データとテキストデータを取得するUserScript
1ページに複数枚スライドが入っているPDFを分割する機能と、余白を削る機能でcanvasのAPIをちょいっと使った
カラーコードを入力したら48×48の正方形で画像出力してくれるやつもそうだが、canvas部分はMijinko_SD.iconさんのをそのまま使っているので該当せず
webRTC
しらん
webGL
yutaro.iconさんがやってる
GlslCanvasをちょこっとだけいじった
本格的なものは作っていない
ツール
GitHub Actions
使い方あまりわかっていない
以下を実装したい
PRのたびに自動でreleaseする
Docker
なんもわからん
学習資料ください
入門 Dockersta.icon
今後作りたいもの
scrapvimの開発再開
前座としてMousetrapのTS化をやりたいときにやってる
https://github.com/takker99/mousetrap/tree/typescript
キーボードショートカットを増やしたい
/takker/アイコン補完 (scrapbox-select-suggestion)の実装
UIを取り替える必要があって、難航している
タスク管理ツール
自作にこだわらずに、専用のツールかNotionを使うべきじゃないかと半分真剣に考えているtakker.icon
ただスクボの情報群とつなげることを考えると、どうしてもscrapboxで作りたくなってしまう
web scraperの改良
個人的に作っているやつ
音声入力
miyamonz.iconさんの実装が一番筋がよさそうなので真似したい
他にもうまい使い方がないか探りたい
スマホで音を使った操作ができると便利かも?
授業中とかは無理だが
TeX入力支援
おわり
以上、takker.iconが作ったUserScriptの紹介でした
他にも話したいことはあるが割愛
UserScriptを開発する上で使っている技術
→LT:UserScriptを支える技術
takker.iconの普段のScrapboxの使い方etc.
UserScriptは想像以上に出来ることの幅が広い
最近はwasmの力でなんでもできる(大嘘)
これは本当に大嘘。できない訳では無いが、terminalで動かすのと比べるとperformanceがガタ落ちする
とくにFFmpeg.wasmが顕著
GPUでエンコードできないのが痛い
WebCodecs APIで改善はされそう
みなさんも、自分が欲しいと思った機能をUserScriptで実装してみてはいかがでしょうか
何も参照できない状態で「作ったUserScriptを紹介して」と言われて出せるもの
(=自分が重要だと思っているscript群)
app
ScrapBubble
選択範囲に似ているリンクを入力補完するUserScript
部品
scrapbox-userscript-std
支援ツール
scrapbox-bundler
ここに載せなかったscriptの判断基準
印象が薄い
逆に縁の下の力持ちなのかもしれない
自分しか需要がない
設定が特殊なもの
自分のメンタルモデルに特化しているもの
壊れている
使っていない
tampermonkey系は最近使っていない
使っていても、OCRをコピーするやつくらい
その他、あんまり重要だと思っていないもの
pin-diaryはここに該当する
便利なのかな……便利なのかどうかすら考えたことがなかったtakker.icon
自分が作ったUserScriptをリストアップしましょう
めんどい……takker.icon
実はなんと、有志が今までに開発されたUserScriptを作っていらっしゃいました!
ありがたや
こんなところで役に立つとはwogikaze.icon
ここから/takker/を抽出しよう
code:js
const res = await fetch("/api/pages/villagepump/今までに開発されたUserScript/text");
const text = await res.text();
const links = [...text.matchAll(/\[\/takker\/^\]+\]/g)].flat()
.filter((link) => !link.endsWith(".icon]"));
await navigator.clipboard.writeText(
...new Set(links).join("\n")
);
//alert(JSON.stringify(links));
Sublime Textとかのマルチカーソルを使うとこういう処理が楽な印象blu3mo.icon
cmd-fで"takker"を検索する
該当箇所全てにカーソルを置く
「カーソルのある行を選択」を全てのカーソルでやる
選択された部分をコピーして別のどこかに貼り付ける
便利そうtakker.icon
スマホからだとどうすればいいかな
やはりUserSc(ry
ショートカットキー
/takker/ScrapBindings
/takker/Popup Menuに独自のkeyboard shortcutを割り当てるUserScript
popup menu
/takker/複数行に打ち消し線を引くPopup Menu その2
/takker/複数行に打ち消し線を引くUserScript
/takker/複数行に打ち消し線を引くPopup Menu@0.3.0
/takker/unlink Popup menu
/takker/選択範囲をKeichoに尋ねるPopupMenu
/takker/一旦改行を消して句点で改行し直すPopupMenu
/takker/改行を消すPopupMenu
/takker/句点で箇条書きにばらすPopup Menu
/takker/Ankiの穴埋めを作るPopupMenu
/takker/選択範囲を辞書検索するUserScript
/takker/popup#5f7554581280f00000c1df6a
/takker/popup#5f7554581280f00000c1df7a
/takker/選択範囲をMarkdown記法に変換してclip boardにcopyするPopupMenu
/takker/replace text UserScript
改造品
Page Menu
/takker/メモ帳を表示するPage Menu
/takker/Kakeruを開くPage Menu
web app on scrapbox
/takker/WebからコピペしたらSB記法に変換する - Scrapboxとあそぶ
改造品
/takker/takker99/ScrapBubble
user向け部品
/takker/Projectを横断してリンクを置換するUserScript
/takker/URLを外部リンク記法に変換するUserScript (TamperMonkeyなし)
/takker/選択範囲無しでページを切り出すUserScript
/takker/custom-new-page-3
/takker/Inboxに素早く入れるUserScript
/takker/IME onの時、キー入力をScrapboxに渡すUserScript
developper向け部品
scrapbox-userscript-std
/takker/scrapboxのページを一つにまとめるUserScript
/takker/scrapbox-external-backup
/takker/scrapbox-external-backup@0.2.0
/takker/key boardだけでpage遷移
/takker/Markdown形式でページのURLをコピーするPageMenu
/takker/scrapbox記法のtableをmarkdownに変換する
/takker/Gyazoにuploadした画像URLをコピペするPage Menu
/takker/svg URLを画像にするPopup Menu
/takker/選択したGyazo画像のtrimmingページを開くPopup Menu
/takker/関連ページリストを吹き出し表示するUserScript
/takker/足跡を表示するuserscript
/takker/scrapbox-history-slider
/takker/授業計画をばらすPopup Menu
/takker/scrapbox-speech-input
/takker/external-completion
/takker/external-completion-2
/takker/emoji-completion
/takker/scrapbox-icon-button
/takker/mobileからtimestampを行頭に挿入するUserScript
/takker/mobileでURLを外部リンク記法に変換するPage menu
/takker/更新行をスクロールバーに表示するUserScript
/takker/アナログ時計を表示するUserScript
/takker/井戸端を開いてからの経過時間を表示するUserScript
/takker/scrapbox-pomodoro-timer-2
/takker/takker-workflow
/takker/takker-scheduler-3
/takker/takker99/takker-scheduler/mobile
/takker/takker-workflow@0.0.1/next-action-viewer
/takker/Open Google Calendar PageMenu
/takker/次に取るべき行動の一覧を表示するPage Menu
/takker/今日やるリストを表示するPageMenu
/takker/telomereを維持して別projectにページをexportするUserScript
/takker/scrapbox-embed-tweet
/takker/scrapbox-url-customizer-2
/takker/url-info
/takker/ScrapScripts
/takker/scrapbox-headless-script
/takker/scrapbox-api-helper
/takker/scrapbox-selection-2
/takker/scrapbox-keyboard-emulation-2
/takker/scrapbox-insert-text
/takker/scrapbox-dom-accessor
/takker/scrapbox-position-2
/takker/key2keyCode
/takker/Vim-keymap-converter-2
/takker/@takker/ScrapJupyter
/takker/Scrapboxのページ遷移を検出