èšèšææ³ãšæ¹éããŸãšããããã¥ã¡ã³ããå®è£ 詳现㯠DEVELOPMENT.md ãåç §ã
- Apple åŒçŽæ UI: èšå®é ç®ãå¢ããããè§Šãã°ãããæäœã§å®çµ
- æ©èœç¶²çŸ ããäœéšå質: å°ãªãæ©èœãå¿å°ãã䜿ããããšãåªå
- Web UI ãžã®ãªã³ã¯å°ç·: éå¯Ÿå¿æ©èœã¯ãã©ãŠã¶ã§éããããã«ãã
- ãµãŒããŒéå¶è ãšã®å ±ç: åºåè¡šç€ºã»æ¯æŽå°ç·ãæŽåãããšã³ã·ã¹ãã ã®æç¶å¯èœæ§ã«è²¢ç®ãã
- ã©ã€ãã©ãªéžå®ã¯ Misskey æ¬å®¶è¿œåŸïŒåŸè¿°ïŒ
- User Respect over Engagement Maximization â ãŠãŒã¶ãŒã®æ³šæã奪ãããã³ã³ãããŒã«ãè¿ãïŒåŸè¿°ïŒ
NoteDeck ã¯ããŠãŒã¶ãŒã®æ³šæã奪ãããã³ã³ãããŒã«ãè¿ããèšèšãæ¡ããX / Threads / Instagram ã«èŠãããæ»åšæéæå€§åã®ããã® UI ãã¿ãŒã³ã¯ãåºåããžãã¹ãæ¯ããçµæžåçæ§ã®ç£ç©ã§ãããMisskey ãšã³ã·ã¹ãã ïŒåºåéäŸåã»åæ£ã»ãŠãŒã¶ãŒäž»æš©ïŒã«ã¯åèŽããªããBluesky / Misskey å ¬åŒ / Mastodon ãåæ§ã«ããããæ¡çšããªãã®ãåãçç±ã«ããã
VSCodeã»Apple çŽæ£ã¢ããªã®ããã«ããŠãŒã¶ãŒãããããããšãæçã§ããããŠãçµãã£ããææŸãããçæ³ãšããã
| ãã¿ãŒã³ | äŸ | äžæ¡çšçç± |
|---|---|---|
| ã¹ã¯ããŒã«é£å UI éé¿ | ã¹ã¯ããŒã«æã«ããã㌠/ FAB ãé ã | "ããå°ãèŠãã" ããã® 1px 皌ããåºåã»ãšã³ã²ãŒãžã¡ã³ãé§åã®æå |
| éå°ãªãããžç œã | "9+", "æ°ç N ä»¶" ã®åŒ·èª¿è¡šç€º | 匷迫çã«éãããè£ çœ® |
| æå»ã®ææ§å | "ãã£ãä»" ãé·ãç¶æã絶察æå»ãé ã | "æ°é®®ãªãã®ããã" æã®æŒåº |
| çµç«¯é èœ | ç¡éã¹ã¯ããŒã«ã§èªäºãäŒããªã | çµããããªãèšèš |
| é¢è±ã®æ©æŠ | æ»ãã»éããã奥ã«ããã確èªã¢ãŒãã«ã§ã®åŒãæ¢ã | æ»åšæéå»¶é·ã®ããã®å¿ççã³ã¹ã |
| èªååçã»å€§é³éãµã ã | åç»èªååç | 泚æã匷å¶çã«åŒã |
| ã¢ã«ãŽãªãºã ä»å ¥ã®éç¥ | "ããªããžã®ãããã" å²ã蟌㿠| ååçäœéšãžã®èªå° |
| è£ é£Ÿã¢ãã¡ã»éå°ãªããŠã³ã¹ | ãã«ãªãã¬ãã·ã¥ã®éå°ãªåŒŸæ§ | ããŒããã³çã« "ããäžå" ãèªçº |
ã¬ã€ã¢ãŠã
- éçã»äºæž¬å¯èœ: åãèŠçŽ ã¯åžžã«åãå Žæã«é 眮ãããããã¹ã«ã¡ã¢ãªãŒãå¹ã = èªç¥è² è·ãŒã
- ã¢ãã©ãŒãã³ã¹å¯èŠ: äž»èŠã¢ã¯ã·ã§ã³ã¯ã¢ã€ã³ã³ã§èŠããŠããããžã§ã¹ãã£ã¯ "ããŸã" ã§ãã£ãŠå¿ é æ©èœã«ããªã
- èªäºã®æç€º: æ¢èªãšæ°çã®å¢çã« "ãããŸã§èªã¿ãŸãã" åºåãç·ã honest ã«è¡šç€ºãã (ã¢ããªã»ã«ã©ã åãªãŒãã³æãåå topmost ã«å± ãäœçœ®ã®äžã« divider ãåºã)
ã¢ãã¡ãŒã·ã§ã³
- æ©èœçã¢ãã¡ã ã: "éãã / éãã / ç§»åãã" ãäŒããããã®ãã®ã«éããè£ é£Ÿã¢ãã¡ã¯å ¥ããªã
- çã (150â250ms): é·ãã¢ãã¡ã¯ "æ°æã¡ãã" ã "æäœãåŸ ãããã" ã«å€ãã
- ease-out äž»äœã»bounce çŠæ¢: 匟æ§ã¯æ³šæãåŒãããã
prefers-reduced-motionå°é: ã¢ã¯ã»ã·ããªãã£å¯Ÿå¿å¿ é - å ±æèŠçŽ é·ç§»: ããŒã â 詳现ãªã©åäžç©ã®ç§»åã¯ãã©ããã³ã°ã§ããããã«
æ å ±ã® honesty
- 絶察ã«ãŠã³ã: "12" ã§ãã£ãŠ "9+" ã§ã¯ãªãïŒãã ã 999 è¶ ã§ "1k" ã¯å¯ïŒ
- 絶察æå»äœµèš: çžå¯Ÿæå» + tooltip ã§çµ¶å¯Ÿæå»
- èª å®ãªããŒãç¶æ : "Loading..." ãšæžããã¹ã±ã«ãã³ UI ã§åœè£ ããªãïŒäœæçã«éã«é ãæããããäžæ¡çšïŒ
- ãšã©ãŒã¯é ãã説æ: é»ã£ãŠå€±æããªã
éç¥ã»æäœ
- æªèªã¯ç²åºŠé«ã ON / OFF: äœãéç¥ããã现ããéžã¹ã
- FAB åžžé§: æçš¿ãã¿ã³ã¯åžžã«åãå ŽæïŒã¢ãã€ã«ã§ãã¹ã¯ããŒã«ã§æ¶ããªãïŒ
- ããŒããŒãã·ã§ãŒãã«ããå®å: IDE ææ³ãšæŽå
- ã³ãã³ããã¬ããäžå¿ã®æ©èœçºèŠæ§: ã¡ãã¥ãŒã§åãå°œãããªã
æ°ãã UI / ã¢ãã¡ / éç¥ãã¿ãŒã³ã远å ãããšãã¯ãå¿ ãããåã:
ããã¯ãŠãŒã¶ãŒãããããããšãå©ããŠããã? ãããšãã¢ããªå ã«ããå°ãçããããšããŠããã?
åè ã ãæ¡çšãããåŸè ã¯åŽäžããã
NoteDeck ã®ããã³ããšã³ãäŸåã©ã€ãã©ãªã¯ãååãšã㊠Misskey æ¬å®¶ (misskey-dev/misskey) ãæ¡çšããŠãããã®ãšæãããæ¬å®¶ã®å®è£
ãåç
§å®è£
ãšããŠæŽ»çšã§ããUI äºææ§ã»åŠç¿ã³ã¹ãã»ä¿å®ã³ã¹ãã»ãã³ãã«ãµã€ãºãåæã«æé©åã§ããã
- æ¬å®¶äºææ©èœã¯æ¬å®¶ãšåãã©ã€ãã©ãªã§ â ãããã£ãŒã« Activity ã¿ããMFM ã¬ã³ããªã³ã°ãç»åã¯ãããçãæ¬å®¶ã«åçæ©èœãããå Žåã¯ã©ã€ãã©ãªãã³ãŒãæ§é ãæ¬å®¶ãèžè¥²ãããæ¬å®¶ã®å®è£
ïŒäŸ:
MkChart*.vueïŒãåç §å®è£ ãšããŠçŽæ¥æŽ»çšã§ãã - ç¬èªæ©èœãæ¬å®¶ã©ã€ãã©ãªã§å®çŸå¯èœãªç¯å²ãŸã§ â æšªææ€çŽ¢ã»Digital Wellbeing çã® NoteDeck ç¬èªæ©èœã§ããæ¬å®¶ã®æ¢åã©ã€ãã©ãªã»ããã§å®çŸå¯èœãªãããã䜿ããæ°ã©ã€ãã©ãªè¿œå ã¯ãæ¬å®¶ã®ã©ã€ãã©ãªã§ã¯å®çŸäžå¯èœããšèšŒæãããæã®ã¿
- æ¬å®¶ã©ã€ãã©ãªã§äžå¯èœãªæ©èœã¯ååå®è£ ããªã â é£åãããã¯ãŒã¯å³ã»ãŠãŒã¶ãŒåãããã©ãŒãã³ã¹ç£èŠ UIã»é«é »åºŠæç³»åãã£ãŒãçãæ¬å®¶ã®ã©ã€ãã©ãªã»ããã§ã¯äœããªãæ©èœã¯ãæ§é çã«å¯Ÿå¿ããªãé åãã«å£ã£ãŠæåããäœããªã
Misskey æ¬å®¶ã¯ä»¥äžã®ã¹ã¿ãã¯ãæ¡çšããŠãããNoteDeck ãåäžãšãã:
| ã©ã€ãã©ãª | çšé |
|---|---|
chart.js |
ãã£ãŒãæ¬äœïŒæãç·ã»æ£ã»ã¬ãŒããŒçïŒ |
chartjs-adapter-date-fns |
æç³»åã®æ¥ä»è»ž |
chartjs-chart-matrix |
ã«ã¬ã³ããŒããŒããããïŒãããã£ãŒã« Activity çïŒ |
chartjs-plugin-gradient |
ã°ã©ããŒã·ã§ã³å¡ã |
chartjs-plugin-zoom |
ãºãŒã ã»ãã³ |
ãã®çµæãé£åãããã¯ãŒã¯å³ïŒCytoscape/Sigma çãå¿ èŠïŒãé«é »åºŠãªã¢ã«ã¿ã€ã æç³»åïŒuPlot çãå¿ èŠïŒã¯æ¬æ¹éã«ããäžå®è£ ãšãªãã
Misskey æ¬å®¶ãæ±ããªãé å â ãã¹ã¯ããããã€ãã£ãæ©èœã»ããŒã«ã«æ°žç¶åã»IDE çæ©èœ â 㯠NoteDeck ã®å·®å¥åæ ¹å¹¹ã®ããæ¬æ¹éã®å¯Ÿè±¡å€:
- Tauri v2 (ãã¹ã¯ãããã©ã³ã¿ã€ã )
- notecli (Rust ããã¯ãšã³ãã»ããŒã«ã« DB / API ã¯ã©ã€ã¢ã³ã / ã¹ããªãŒãã³ã°)
- CodeMirror 6 + Web Worker LSP (AiScript ãšãã£ã¿)
- @tanstack/vue-virtual (ä»®æ³ã¹ã¯ããŒã«)
- Scalar (API ããã¥ã¡ã³ã衚瀺)
- tauri-specta (åä»ã IPC)
- Shiki (ã³ãŒããã€ã©ã€ã â æ¬å®¶ãšã¯ç¬ç«å°å ¥æžã¿ããã ãæ¬å®¶ãåäžæ¡çšã®ããçµæçã«äžèŽ)
ãåäžã©ã€ãã©ãªã䜿ããã¬ãã«ã§ååãæ¬å®¶ã® patch/minor ã«ã¯éäžè¿œéãããã¡ãžã£ãŒããŒãžã§ã³ã倧ããé¢ããå Žåã«ã®ã¿èŠçŽããæ€èšããã
MisskeyïŒActivityPubïŒã¯ãµãŒããŒãäž»èªã®èšèšã«ãªã£ãŠãããæ€çŽ¢ã¯ãµãŒããŒã®ããŒã«ã«ã€ã³ããã¯ã¹ãéç¥ã»ãæ°ã«å ¥ãã»ãªã¹ãã¯ã¢ã«ãŠã³ãåäœããã©ããŒé¢ä¿ããµãŒããŒã«çŽã¥ããè€æ°ãµãŒããŒã«ã¢ã«ãŠã³ããæã€ãŠãŒã¶ãŒã«ãšã£ãŠãããããåæãããããšã¯æ§é äžé¿ããããªãã
NoteDeck ã¯è€æ°ãµãŒããŒãžã®åæãã°ã€ã³ãšããŒã«ã« DB ãçµã¿åãããããšã§ããã®åæãã¯ã©ã€ã¢ã³ãåŽã§ç·©åããã
| åæ | Misskey åäœ | NoteDeck |
|---|---|---|
| æ€çŽ¢ | ãµãŒããŒã®ããŒã«ã«ã€ã³ããã¯ã¹ã®ã¿ | è€æ°ãµãŒããŒãžäžŠåã¯ãšãª + ããŒã«ã« FTS5 ã§å€§å¹ æ¹å |
| éç¥ | ã¢ã«ãŠã³ãããšã«æ£åš | cross-account ã«ã©ã ã§çµ±å衚瀺 |
| ã¿ã€ã ã©ã€ã³ | ãµãŒããŒããšã«åæ | è€æ°ã¢ã«ãŠã³ãã® TL ãããŒãžå¯èœ |
| ãã©ããŒæäœ | ãªã¢ãŒããã©ããŒã® UI é·ç§»ãç ©é | ãã°ã€ã³æžã¿ã¢ã«ãŠã³ãããçŽæ¥æäœ |
| æ¢èªç¶æ | ã¯ã©ã€ã¢ã³ãã»ãµãŒããŒéã§äžæŽå | ããŒã«ã« DB ã§äžå 管ç |
| æçš¿ã®æ°žç¶æ§ | ãµãŒããŒäŸåïŒãµãŒããŒæ¶æ» ã§ããŒã¿åªå€±ïŒ | ããŒã«ã« DB ã«ãã£ãã·ã¥ãšããŠæ®ã |
ãããã³ã«ã®éçã¯åãå ¥ããã ActivityPub ã®ã¢ã€ãã³ãã£ãã£ã¯ãµãŒããŒã«å±ããŠãããããã¯ã¯ã©ã€ã¢ã³ãã§ã¯å€ããããªããNoteDeck ãå®çŸããã®ã¯ããµãŒããŒã«çžãããªãäœéšãã§ãã£ãŠããµãŒããŒã«çžãããªãååšãã§ã¯ãªãããªã¹ãã»ã¢ã³ããã®ç®¡çããããã£ãŒã«ç·šéãªã©ããµãŒããŒåŽã®è²¬åã¯ãµãŒããŒã«å§ããïŒROADMAP.md ã®ãæ§é çã«å¯Ÿå¿ããªãé åããåç §ïŒã
NoteDeck ã¯ãŠãŒã¶ãŒã®ããŒã¿äž»æš©ãå°éããããŠãŒã¶ãŒãæå³çã«ã«ã¹ã¿ãã€ãºããèšå®ã¯ãã¹ãŠããã¹ããã¡ã€ã«ãšããŠç®¡çããããã¯ã¢ããã»ã€ã³ããŒãã»ç«¯æ«éå ±æãå¯èœã«ããã
- ãã¡ã€ã«ã source of truth â localStorage ã¯ãã£ãã·ã¥/èµ·åé«éåã®åœ¹å²
- 人éãèªã¿æžãå¯èœ â JSON5/CSS/AiScript çã®ããã¹ã圢åŒãæ¡çš
- ã¢ããªéäŸå â ããã¹ããšãã£ã¿ã§çŽæ¥ç·šéå¯èœãã¢ããªãæ¶ããŠãããŒã¿ã¯æ®ã
- ããŒã¿ãã« â ãã¡ã€ã«ã³ããŒã§å¥ç«¯æ«ã«æã¡éã¹ã
appDataDir/
âââ notecli.db # SQLiteïŒã¢ã«ãŠã³ã/ãµãŒããŒæ
å ±ïŒ
âââ notedeck/ã#ãšã¯ã¹ããŒãæã¯å§çž®ããåäžããã¹ã`nodeck.json`
âââ keybinds.json5 #ããŒãã€ã³ãç·šéãŠã£ã³ããŠã§ç·šéå¯èœ
âââ navbar.json5 #ããããŒç·šéãŠã£ã³ããŠã§ç·šéå¯èœ
âââ performance.json5 #ããã©ãŒãã³ã¹ç·šéãŠã£ã³ããŠã§ç·šéå¯èœ
âââ settings.json5
âââ profiles/ #ãããã¡ã€ã«ç·šéãŠã£ã³ããŠã§ç·šéå¯èœ
â âââ Main.json5
âââ themes/ #ããŒãç·šéãŠã£ã³ããŠã§ç·šéå¯èœ
â âââ AME.json5
âââ plugins/ #ãã©ã°ã€ã³ç·šéãŠã£ã³ããŠã§ç·šéå¯èœ
â âââ *.is
â âââ *.meta.json5
âââ custom.css #ã«ã¹ã¿ã CSSç·šéãŠã£ã³ããŠã§ç·šéå¯èœ
âââ accounts.json5 #ã¢ã«ãŠã³ãç·šéãŠã£ã³ããŠã§ç·šéå¯èœ
dual-write çµ±åæžã¿ãã¡ã€ã«ïŒsettings.json ã«çµ±åæžã¿ãæ§ãã¡ã€ã«ã¯ backward-compat ã§ç¶æïŒ:
ai.jsonâai.*ããŒã« dual-write çµ±åæžã¿keybinds.json5âkeybinds.*ããŒã« dual-write çµ±åæžã¿performance.jsonâperformance.*ããŒã« dual-write çµ±åæžã¿
ãããã¯ãããã NoteDeck ç¬èªãã©ãŒãããã§ Misskey äºææ§èŠä»¶ããªãããããã©ãã dot-notation ããŒãšã㊠settings.json ã«åã蟌ãã ãæ°ããæžã蟌ã¿ã¯ settings.json ã«åæ ãããæ§ãã¡ã€ã«ã¯ read-only ã§åç
§ãããã
appDataDir ã®å Žæ:
| OS | ãã¹ |
|---|---|
| Windows | %APPDATA%\com.notedeck.desktop |
| macOS | ~/Library/Application Support/com.notedeck.desktop |
| Linux | ~/.local/share/com.notedeck.desktop |
| åœ¢åŒ | çšé | çç± |
|---|---|---|
| JSON | settings.json (ã¹ã«ã©ãŒ preferences) |
VSCode settings.json çžåœããã©ãã dot-notationã$schema ã§ JSON Schema è£å® (å°æ¥)ãå€éšãšãã£ã¿ã§ç·šéãããã |
| JSON5 | ãããã¡ã€ã«ã»ããŒã | ã³ã¡ã³ãå¯ãtrailing comma å¯ãMisskey ããŒããšäºæ |
| CSS | ã«ã¹ã¿ã CSS | ãã®ãŸãŸããšãã£ã¿ã®ã·ã³ã¿ãã¯ã¹ãã€ã©ã€ããå¹ã |
| AiScript (.is) | ãã©ã°ã€ã³ | AiScript æšæºæ¡åŒµå |
settings.json 㯠JSON (JSON5 ã§ã¯ãªã) â VSCode settings.json ãšåãæ±ãã«ãããããå°æ¥ JSONC (ã³ã¡ã³ãèš±å¯) ãµããŒããæ€èšããäœå°ã¯ããããåœé¢ã¯ plain JSONãTOML/YAML ã¯çŸç¶ã®èšå®æ§é ã§ã¯å°å
¥ããç©æ¥µççç±ããªãããäžæ¡çšã
NoteDeck ã®ã¹ã«ã©ãŒèšå® (éžæã»ãã°ã«ã»ãŠãŒã¶ãŒ preferences) ã¯åäžãã¡ã€ã« settings.json ã«éçŽãããVSCode ã® settings.json ãšåãç«ã¡äœçœ®:
- ãã©ãã dot-notation ããŒç©ºé:
theme.manual,modes.realtime,performance.maxFpsç - GUI èšå®ãšãã£ã¿ â raw JSON ãšãã£ã¿ã® 2-way binding: ã©ã¡ãããç·šéããŠãåæ
- äžæ£å€ã¯ schema ã®ããã©ã«ãã«ãã©ãŒã«ããã¯: å®å šæ§
$schemaãããã㣠(å°æ¥) ã§ãšãã£ã¿ã®è£å®ã»æ€èšŒãµããŒã
settings.json ã«å«ãŸãããã®:
| ã«ããŽãª | ããŒäŸ | åè |
|---|---|---|
| ããŒãéžæç¶æ | theme.manual, theme.selectedDarkThemeId |
ããŒã å®çŸ© 㯠themes/*.json5 ã«å¥çœ®ã |
| ã¢ãŒã | modes.realtime, modes.offline |
|
| ãã㯠| deck.activeProfileId, deck.wallpaper |
ãããã¡ã€ã« å®çŸ© 㯠profiles/*.ndprofile.json5 ã«å¥çœ®ã |
| ããã©ãŒãã³ã¹ | performance.maxFps ç |
performance.json ãš dual-write çµ±åæžã¿ |
| AI | ai.provider, ai.model ç |
ai.json ãš dual-write çµ±åæžã¿ (API ããŒã¯é€å€) |
| ããŒãã€ã³ã | keybinds.commandPalette ç |
keybinds.json5 ãš dual-write çµ±åæžã¿ |
settings.json ã«å«ãŸããªããã® (æä¹ çã«å¥ãã¡ã€ã«):
| 察象 | çç± |
|---|---|
themes/*.json5 |
Misskey äºæãã©ãŒãããç¶æ â ã³ãã¥ããã£ããŒãã themes/ ã« drop ããã ãã§äœ¿ããããã«ãããã |
plugins/*.is + *.meta.json5 |
Misskey AiScript ãã©ã°ã€ã³ãã©ãŒãããç¶æ |
snippets/*.json5 |
VSCode ã¹ããããäºæãã©ãŒããã |
profiles/*.ndprofile.json5 |
NoteDeck ç¬èªã ãè€æ°ååšããã³ã¬ã¯ã·ã§ã³ãè¥å€§ååé¿ + åå¥ãšã¯ã¹ããŒãå°ç· |
memos/*.md |
PKM 飿ºã®ãã Markdown + YAML frontmatter ã§å€éš vault (Obsidian/Logseq) ãšããŠçŽæ¥éããåœ¢åŒ |
custom.css |
CSS 㯠JSON ã§ã¯ãªããããã¹ããšãã£ã¿ã§çŽæ¥ç·šé |
accounts.json5 |
ç°å¢äŸåé åºãããŒã¿ããªãã£å¯Ÿè±¡å€ |
| ã¢ã«ãŠã³ãããŒã¯ã³ | Rust DB (secure storage) |
èšèšååã®èæ¯: VSCode ã® settings.json ã¯ãèšå®å
šäœãã§ã¯ãªãã¹ã«ã©ãŒ preferences/toggles/selections ã®éåãããŒãæ¬äœã¯ extension ãã©ã«ãã«ãkeybindings 㯠keybindings.json ã«ãsnippets 㯠.vscode/snippets/ ã«å¥çœ®ããNoteDeck ããã®æ§é ã«å£ããMisskey äºææ§ãèŠä»¶ãšãªãéšå (themes/plugins) 㯠native format ã®ãŸãŸæ®ãã
{
name: "ã¡ã€ã³äœæ¥çš",
createdAt: 1711100000000,
columns: [
{
// Misskey äºæãã£ãŒã«ã
id: "col-1711100000000-1",
type: "tl",
name: null,
width: 400,
tl: "home",
// NoteDeck æ¡åŒµãã£ãŒã«ã
accountId: "abc123", // ããŒã«ã«DBåç
§çš
account: "[email protected]", // ããŒã¿ãã«èå¥å
},
],
layout: [
["col-1711100000000-1"], // 1ã«ã©ã ç®ïŒåç¬ïŒ
["col-2", "col-3"], // 2ã«ã©ã ç®ïŒã¹ã¿ãã¯: 瞊ç©ã¿ïŒ
],
windows: [], // ãã«ããŠã£ã³ããŠã¬ã€ã¢ãŠã
}ã«ã©ã å®çŸ©ã¯ Misskey æ¬å®¶ã® Column åãšäºæãJSON ã¯æªç¥ã®ãã£ãŒã«ããç¡èŠããããïŒ
- Misskey â NoteDeck:
accountIdãªã â ããã©ã«ãã¢ã«ãŠã³ããå²ãåœãŠ - NoteDeck â Misskey: ç¬èªãã£ãŒã«ãïŒ
accountId,account,windowIdçïŒã¯ç¡èŠããã
NoteDeck ç¬èªã®æ¡åŒµãã£ãŒã«ã:
| ãã£ãŒã«ã | å | çšé |
|---|---|---|
accountId |
string |
ããŒã«ã«DB ã®ã¢ã«ãŠã³ãIDåç § |
account |
string |
"user@host" 圢åŒã®ããŒã¿ãã«èå¥å |
windowId |
string |
ãã«ããŠã£ã³ããŠå²ãåœãŠ |
query |
string |
æ€çŽ¢ã«ã©ã ã®ã¯ãšãª |
filters |
object |
ã¿ã€ã ã©ã€ã³ãã£ã«ã¿ |
clipId |
string |
ã¯ãªããID |
userId |
string |
ãŠãŒã¶ãŒã«ã©ã ã®å¯Ÿè±¡ãŠãŒã¶ãŒ |
aiscriptCode |
string |
AiScript ã«ã©ã ã®ã³ãŒã |
flashId |
string |
Misskey Play ID |
pageId |
string |
Misskey Pages ID |
accountId ã¯ããŒã«ã« DB ã«äŸåãããã端æ«éã§äžèŽããªããaccount ãã£ãŒã«ãïŒ"user@host" 圢åŒïŒã䜵èšããã€ã³ããŒãæã«ããŒã«ã«ã¢ã«ãŠã³ããéåŒããã:
| ã±ãŒã¹ | åäœ |
|---|---|
| åäžç«¯æ« | accountId ã§ãã®ãŸãŸè§£æ±º |
| å¥ç«¯æ«ïŒNoteDeckïŒ | account ããããŒã«ã« accountId ãéåŒã |
| Misskey æ¬å®¶ããã®ã€ã³ããŒã | accountId ãªã â ããã©ã«ãã¢ã«ãŠã³ãå²ãåœãŠ |
NoteDeck ã®ããŒã¿ã¯å€§ãã2çš®é¡ã«åããã:
| çš®å¥ | å 容 | ãã¡ã€ã« |
|---|---|---|
| DB | ã¢ã«ãŠã³ãã»ãµãŒããŒæ å ±ã»ãã£ãã·ã¥ | notecli.db |
| èšå® | settings.jsonïŒã¹ã«ã©ãŒ preferences + AIã»ããŒãã€ã³ãã»ããã©ãŒãã³ã¹çµ±åæžã¿ïŒ+ ãããã¡ã€ã«ã»ããŒãã»CSSã»ãã©ã°ã€ã³ | ããã¹ããã¡ã€ã«çŸ€ |
åå: ãããã¯ã¢ããããããã® = èšå®ããlocalStorage ã®ã¿ã«ãããªãèšå®ãååšããŠã¯ãªããªãã
éå»ã«ã¯ modes.realtime / theme.manual / deck.wallpaper çã®äžéšèšå®ã localStorage ã®ã¿ã«ååšãããã¯ã¢ããããæŒããŠããããsettings.json çµ±åã«ãããã®æŒããè§£æ¶ãããç°å¢äŸåããŒã¿ (ã¢ã«ãŠã³ãããŒã¯ã³ / accounts.json5) ã®ã¿ãæç€ºçã«é€å€ããã (ä»ç°å¢ã§ã®åŸ©å
æã«æŽåæ§ãå£ããã)ã
èšå®ã¡ãã¥ãŒã®ãããŒã¿ãã»ã¯ã·ã§ã³ãã以äžã®æäœãå¯èœ:
| æäœ | 察象 | åœ¢åŒ | åè |
|---|---|---|---|
| DB ãšã¯ã¹ããŒã | notecli.db |
SQLite | ã¢ã«ãŠã³ãã»ãµãŒããŒæ å ±ã®å®å šããã¯ã¢ãã |
| DB ã€ã³ããŒã | notecli.db |
SQLite | SQLiteãããæ€èšŒä»ããã€ã³ããŒãåŸã¢ããªåèµ·å |
| èšå®ãšã¯ã¹ããŒã | settings.json + ããã¹ããã¡ã€ã«çŸ€ |
JSON | settings.json (ã¹ã«ã©ãŒ preferences) + profiles/ themes/ plugins/ custom.css ãããŒâå€ã® JSON ãã³ãã«ãšããŠåºå |
| èšå®ã€ã³ããŒã | åäž | JSON | ãã¹ãã©ããŒãµã«é²æ¢ã»ãã¯ã€ããªã¹ãæ€èšŒä»ããã€ã³ããŒãåŸã¢ããªåèµ·å |
ã»ãã¥ãªãã£:
- DB ã€ã³ããŒã: SQLite ããžãã¯ãã€ãïŒ
SQLite format 3\0ïŒãæ€èšŒãWAL/SHM ãã¡ã€ã«ãèªåã¯ãªãŒã³ã¢ãã - èšå®ã€ã³ããŒã:
..ã絶察ãã¹ãå«ããšã³ããªãæåŠãèš±å¯ããããã£ã¬ã¯ããª/ãã¡ã€ã«åã®ã¿å±é
çµ±åæžã¿: ai.json / keybinds.json5 / performance.json 㯠settings.json ã« dual-write çµ±åæžã¿ãexport_settings_json ã¯æ§ãã¡ã€ã«ãå«ããŠãã³ãã«ããŠããããsettings.json ã«çµ±åãããå€ã source of truth ãšãªãã
- ãã£ã¬ã¯ããªã³ã㌠â
appDataDir/以äžããã®ãŸãŸã³ããŒïŒæã確å®ïŒ - åå¥ãã¡ã€ã«ç·šé â ããã¹ããšãã£ã¿ã§ JSON5/CSS ãçŽæ¥ç·šéããåèµ·åã§åæ
ã¢ããªåŽã«ã«ã¹ã¿ã ãã£ã¬ã¯ããªèšå®ã¯å®è£ ããªãããŠãŒã¶ãŒãã·ã³ããªãã¯ãªã³ã¯ã§ä¿åå ãã¯ã©ãŠãã¹ãã¬ãŒãžã«åãã:
# äŸ: profiles/ ã Dropbox ã«åæ
ln -s ~/Dropbox/notedeck/profiles ~/.local/share/com.notedeck.desktop/profilesãã®æ¹åŒã®å©ç¹:
- ã¢ããªåŽã®ã³ãŒã远å äžèŠ
profiles/ã ããthemes/ã ãããšãã£ãç²åºŠã®éžæããŠãŒã¶ãŒåŽã§èªç±- Dropbox/OneDrive/Google Drive/Syncthing/Git/NAS çãäœã§ã䜿ãã
- ã¢ããªãç¥ããªãã¹ãã¬ãŒãžãµãŒãã¹ã«ã察å¿
NoteDeck ã®èšå®æ°žç¶åã¯è€æ°æ®µéã®ç§»è¡ãçµãŠããŠãã:
Phase 1: localStorage â åå¥ãã¡ã€ã« (å®è£ æžã¿)
- èµ·åæã«åèšå®ãã£ã¬ã¯ããªã®ãã¡ã€ã«ååšã確èª
- ãã¡ã€ã«ã 0 ä»¶ã〠localStorage ã«ããŒã¿ãã â ããã¹ããã¡ã€ã«ãšããŠæžãåºã
- ãã€ã°ã¬ãŒã·ã§ã³å®äºåŸãlocalStorage ã¯ãã£ãã·ã¥ãšããŠç¶æïŒåé€ããªãïŒ
- 以éã¯ãã¡ã€ã«ã source of truth
察象: ãããã¡ã€ã«ïŒ.ndprofile.json5ïŒãããŒãïŒ.ndtheme.json5ïŒãã«ã¹ã¿ã CSSïŒcustom.cssïŒãããŒãã€ã³ãïŒkeybinds.json5ïŒããã©ã°ã€ã³ïŒ.is + .meta.json5ïŒãAIèšå®ïŒai.jsonïŒãããã©ãŒãã³ã¹ïŒperformance.jsonïŒ
Phase 2: localStorage-only scalar â settings.json (å®è£ æžã¿)
Phase 1 ã§ãã¡ã€ã«åãããªãã£ã localStorage-only èšå® (theme.manual, modes.realtime, modes.offline, deck.wallpaper ç) ã settings.json ã«éçŽã
- èµ·åæã«
settings.jsonãååšããªããã°ããã©ã«ãå€ã§éå§ - ãŠãŒã¶ãŒãèšå®ã倿Žãããã³ã«
settings.jsonã« debounce persist - åã¹ãã¢ã¯
useSettingsStoreçµç±ã§å€ãååŸ
Phase 3: åå¥ JSON ãã¡ã€ã« â settings.json (dual-write çµ±åæžã¿)
ai.json / keybinds.json5 / performance.json ã®å
容ã settings.json ã® namespace ä»ãããŒã« dual-write ã§çµ±åæžã¿:
ai.jsonâai.*ããŒkeybinds.json5âkeybinds.*ããŒperformance.jsonâperformance.*ããŒ
æ§ãã¡ã€ã«ã¯ backward-compat ãšã㊠read-only ã§ãµããŒããç¶ç¶ãæ°ããæžã蟌ã¿ã¯ settings.json ã«åæ ãããã
Phase 4: æä¹ çã«å¥ãã¡ã€ã«ãšããŠæ®ããã® (çµ±åããªã)
以äžã¯ Misskey äºææ§ã»ã³ã¬ã¯ã·ã§ã³æ§ã»ç¹æ®ãã©ãŒãããã®çç±ã§æä¹ çã«å¥ãã¡ã€ã«:
themes/*.json5(Misskey äºæ)plugins/*.is+*.meta.json5(Misskey äºæ)profiles/*.ndprofile.json5(NoteDeck ç¬èªã ãè€æ°ååšããã³ã¬ã¯ã·ã§ã³)custom.css(CSS ãã¡ã€ã«)accounts.json5(ç°å¢äŸå)
NoteDeck 㯠TauriïŒWebViewïŒããŒã¹ã®ãã¹ã¯ãããã¢ããªã§ãããChrome / Vivaldi / VS Code çã® Electron / Chromium ããŒã¹ã¢ããªã® UX ãã¿ãŒã³ãç©æ¥µçã«åãå ¥ããã以äžã¯ NoteDeck ã®æ¢åæŠå¿µãšãã©ãŠã¶ã»ãšãã£ã¿ã®æ©èœãããã³ã°ãããã³å°å ¥æ¹éã
| ãã©ãŠã¶ / ãšãã£ã¿ | NoteDeck | ç¶æ |
|---|---|---|
| ã¿ã | ãããã¡ã€ã«ïŒã«ã©ã é 眮ã®ã¯ãŒã¯ã¹ããŒã¹ïŒ | èšç»äž |
| ã¿ãã¿ã€ãªã³ã° (Vivaldi) | ã«ã©ã 暪䞊ã³è¡šç€º | â ã¢ããªã®æ¬è³ª |
| Web ããã« (Vivaldi) | ããããŒïŒå·Šãµã€ãããŒïŒ | â å®è£ æžã¿ |
| ã¢ãã¬ã¹ã㌠/ ãªã ãããã¯ã¹ | ã³ãã³ããã¬ãã (Ctrl+K) | â å®è£ æžã¿ |
| æ»ã / é²ã | ã«ã©ã éã®å±¥æŽããã²ãŒã·ã§ã³ | â å®è£ æžã¿ |
| ã¿ãæ€çŽ¢ (Ctrl+Shift+A) | ã³ãã³ããã¬ããã§ã«ã©ã æ€çŽ¢ | â å®è£ æžã¿ |
| 瞊ã¿ã (Edge / Vivaldi) | ããããŒïŒæ¢ã«çžŠé çœ®ïŒ | â å®è£ æžã¿ |
| ããŒããŒãã·ã§ãŒãã«ãã | ã«ã¹ã¿ãã€ãºå¯èœãªããŒãã€ã³ã | â å®è£ æžã¿ |
| Spaces (Arc) | ãããã¡ã€ã«åæ¿ | â å®è£ æžã¿ïŒã¡ãã¥ãŒçµç±ïŒ |
| ã³ãã³ããã¬ãã (VS Code) | ã³ãã³ããã¬ãã | â å®è£ æžã¿ |
| Explorer (VS Code) | Workspace Explorer ã«ã©ã | â å®è£ æžã¿ |
| Output ããã« (VS Code) | Stream Inspector ã«ã©ã | â å®è£ æžã¿ |
| JSON Inspector (DevTools) | Raw JSON ã€ã³ã¹ãã¯ã¿ãŠã£ã³ã㊠| â å®è£ æžã¿ |
| Settings Editor (VS Code) | settings.json Raw JSON ãšãã£ã¿ | â å®è£ æžã¿ |
| ããã¯ããŒã¯ | ãæ°ã«å ¥ã / ã¯ãªãã | â Misskey API çµç± |
NoteDeck ã® UI ã¯ä»¥äžã®éå±€ã§æŽçãããããã©ãŠã¶ / ãšãã£ã¿ã®æŠå¿µãš1察1ã§å¯Ÿå¿ãã:
ââ Level 0: ãŠã£ã³ããŠïŒOS ã¬ãã«ïŒ
â = ãã©ãŠã¶ãŠã£ã³ã㊠/ VS Code ãŠã£ã³ããŠ
â
ââ Level 1: ãããã¡ã€ã«ïŒã¡ãã¥ãŒåæ¿ïŒ
â = 1ãŠã£ã³ããŠ1ãããã¡ã€ã«ãã¡ãã¥ãŒããåæ¿
â
ââ Level 2: ã«ã©ã ïŒã¡ã€ã³ãšãªã¢æšªäžŠã³ïŒ
â = Vivaldi ã¿ãã¿ã€ãªã³ã° / VS Code ã¹ããªãããšãã£ã¿
â 1ã€ã®ãããã¡ã€ã«å
ã®è€æ°ãã¥ãŒ
â
ââ Sidebar: ããããŒïŒå·Šãµã€ãããŒïŒ
â = Vivaldi Web ããã« / VS Code ã¢ã¯ãã£ããã£ããŒ
â ãããã¡ã€ã«åæ¿ãè·šãã§æ°žç¶ããã·ã§ãŒãã«ãã
â
ââ Level 3: ã«ã©ã ã¿ãïŒããã ããŒïŒ
= Vivaldi ã¿ãã¹ã¿ãã¯å
ã®ã¿ãäžèЧ / VS Code ãšãã£ã¿ã°ã«ãŒãå
ã¿ã
ã¢ã¯ãã£ããããã¡ã€ã«å
ã®ã«ã©ã äžèЧ
åºå ž: VS Code ãã¬ããã¯ã©ã
æ¢åã®æ€çŽ¢ããŒã® URI 衚瀺ïŒactiveColumnUriïŒãã¯ãªãã«ãã«ãªãã¬ããã¯ã©ã ã«çºå±:
[ð misskey.io > @taka > ããŒã TL Ctrl+K]
âã¯ãªã㯠âã¯ãªã㯠âã¯ãªãã¯
åã»ã°ã¡ã³ããã¯ãªãã«ãã«ã§ããµãŒããŒäžèЧâã¢ã«ãŠã³ãåæ¿âã«ã©ã çš®å¥åæ¿ãšéå±€çã«ããã²ãŒã·ã§ã³å¯èœã
åºå ž: VS Code Peek Definition (Alt+F12)
ãŠãŒã¶ãŒåãããŒããªã³ã¯ã®ãããŒ/ã¯ãªãã¯ã§ãã«ã©ã å ã«ã€ã³ã©ã€ã³ãã¬ãã¥ãŒãæµ®é衚瀺ãã¹ã¯ããŒã«äœçœ®ã倱ããã«ã³ã³ããã¹ãã確èªã§ããã
- ãŠãŒã¶ãŒåãã㌠â ãããã£ãŒã«ã«ãŒã + æè¿ã®ããŒã
- ããŒããªã³ã¯ â ããŒãå 容 + ãªãã©ã€ããªãŒã®ãã¬ãã¥ãŒ
- ãªããŒãå â å ããŒãã®ã€ã³ã©ã€ã³è¡šç€º
VS Code ã§æãè©äŸ¡ãããæ©èœã®äžã€ãSNS ã¯ã©ã€ã¢ã³ãã§ã¯ãã¹ã¯ããŒã«äœçœ®ãå®ãã䟡å€ãç¹ã«é«ãã
åºå ž: VS Code Sticky Scroll
ã¹ã¬ãã衚瀺ã§èŠªããŒããã«ã©ã äžéšã«ã¹ãã£ãããŒããããŒãšããŠåºå®ãé·ãäŒè©±ã¹ã¬ãããã¹ã¯ããŒã«ããŠãããäœã®è©±é¡ãããèŠå€±ããªãã
åºå ž: Safari ãªãŒãã£ã³ã°ãªã¹ã
ãåŸã§èªãããã¥ãŒãããŒã«ã« DB ã§ãµãŒããŒæšªæç®¡çãMisskey ã®ãæ°ã«å ¥ã/ã¯ãªããããµãŒããŒåäœãªã®ã«å¯Ÿããå šã¢ã«ãŠã³ããæšªæããŠäžå 管çãããŒã«ã«ã«ãã£ãã·ã¥ããããšã§ãªãã©ã€ã³é²èЧãå¯èœã
åºå ž: VS Code ã¯ãŒã¯ã¹ããŒã¹æšªææ€çŽ¢
å šæ¥ç¶ãµãŒããŒã«äžŠåã¯ãšãªãéããçµæãçµ±åè¡šç€ºãæ¢åã®ã³ãã³ããã¬ãã/æ€çŽ¢ããŒãæ¡åŒµãã圢ã§ãããã®ããŒããã©ã®ãµãŒããŒã§èŠãã£ãïŒãã解決ãããŒã«ã« FTS5 ã€ã³ããã¯ã¹ãšã®çµã¿åããã§é«éåã
å
šã¢ã«ãŠã³ãã®éç¥ã1ç®æã«éçŽããã«ã©ã ã¿ã€ããæ¢åã® cross-account éç¥ã«ã©ã ïŒaccountId: nullïŒãçºå±ããããµãŒããŒæšªæã§ã®æªèªç®¡çã»ãã£ã«ã¿ãªã³ã°ãå®çŸã
| æ©èœ | åºå ž | äžæ¡çšçç± |
|---|---|---|
| ããããã | VS Code / Sublime | ããã¹ããšãã£ã¿ç¹æãã¿ã€ã ã©ã€ã³ã®ä¿¯ç°ã«ã¯äžåã |
| Split Diff | VS Code | 2ã€ã®ã¿ã€ã ã©ã€ã³æ¯èŒã¯ SNS ã®æèã§æå³ããªããªã |
| ãªãŒããŒã¢ãŒã | Safari / Firefox | SNS ã®çæã«ã¯äžèŠ |
| ããŠã¹ãžã§ã¹ãã£ãŒ | Vivaldi | å®è£ ã³ã¹ãã«å¯ŸããŠãªã¿ãŒã³ãå°ãªã |
| ã¹ãããã¬ã€ã¢ãŠã | Edge / Windows 11 | ãããã¡ã€ã«ã§ä»£æ¿å¯èœ |