関連ページが広がってきた
こんにちは
shokaiですshokai.icon
https://gyazo.com/a652d746a1935ecd2e30a156580c7cb7
双方向リンク
このページからリンクしてるページ
このページにリンクしてるページ
当日のプレゼン動画
https://youtu.be/SPNq_oRrhdA?t=5137
https://gyazo.com/0c905752be9c3d5775376511c951bfbe.mp4
色々つながって面白い
意外性がある
こんな話もしていたのか〜という
実は、色々つながり過ぎないようにもしています
今日はそのへんの工夫を話します
1つの会社で複数のprojectを使っている時も便利!
https://scrapbox.io/files/62832eaf37fee7001d6bf854.png
会社が成長すると、複数のプロジェクトを使い分ける必要が出てくる
例:業務委託先との連絡用project
関連ページリストとは?
[リンク]を書くと、エディタの下に表示されるページのリストのこと
https://gyazo.com/343caf0f14cc565ce656a43e9a02aad2.mp4
共通のリンク先を持つページ
ページA ---> 共通のリンク先 <--- ページB
[ページ名]のリンク先が存在しないページであっても、関連リンクは通る
ページA ---> 存在しないページ <--- ページB
つまり、リンク先のリンク先まで関連ページとして一望できるという事です
別カテゴリのページへのリンクが媒介となって、意外な関係性が表現される 「和歌山」→「みかん」、「愛媛県」→「みかん」 ならば「和歌山県」と「愛媛県」はみかんつながりになっているわけだし、
「増井」→「Rubyプログラミング」、「高林」→「Rubyプログラミング」 ならば「増井」⇔「高林」は意味がある。
こういう関係は普通のハイパーテキストやWebでは考えられていない気がするのだがどうだろうか。
2005年時点での増井俊之.iconによる考察
17年前…!!!!!そんなに前から考えられていたのかteramotodaiki.icon
子供の中学受験で地理を教えるための「勉強Wiki」というのを作ってたのでした 増井俊之.icon
論文サーベイのprojectなんだけど
論文だけではなく著者のページもある
つながりが見えてくる
夫婦関係が重要 増井俊之.icon
普通、文献管理ツールというと「弟子」なんて書く欄はない
正規化されていないデータを色々書ける自由記述欄がつながって、人間を介して研究の流れが見えてくる
かもしれない
External links 実装までの道のり
準備が重要だったshokai.icon
表示エリアの確保
新しい機能を追加すると、既存の機能と衝突する
機能同士のコンセプトに矛盾が生じたり
UIの置き場に困ったりする
今回はこっち
似たような名前のページが多すぎる時に、関連ページを折り畳む機能
表示エリアを確保する為に実装した
https://gyazo.com/fd7eb811dcc83e8f4271a58e00994571.mp4
例:Sprint.50、Sprint.51、Sprint.52
とりあえず、末尾が連番のページが対象ですshokai.icon
今後もうちょっと賢くなる予定
これめっちゃ便利で助かってるakix.iconteramotodaiki.icon
連番利用は実用的でいいですね 増井俊之.icon
Kindleの漫画折り畳みみたいだ
何もかもリンクされたら邪魔じゃないか?
全ての逆リンクを表示するとExternal linkが何十万件になる
検索範囲が広すぎてDBの負荷もヤバイ事になる
現実的なレスポンス時間で計算可能なqueryにしたいshokai.icon
全く知らない他人のprojectを見せられてもしょうがない
public設定のprojectであっても、他人の反応に一喜一憂せず、考えを深める為に自分と向き合ってテキストを書きたい
External linksに表示されるべきなのは
自分が参加しているproject
これは当然
自分が参加していないproject
興味を持ったprojectだけに絞りたい
自分が興味を持ったprojectのリスト
https://gyazo.com/875c6b64c064406be4b46762a6cd632c
緑は未読あり
そういうことだったのか!!yuiseki.icon
検索もできる
追加・削除
projectにアクセスしたら自動的に追加
右のhttps://gyazo.com/e79cd503b3eee602f29afeeabf286823で削除
https://scrapbox.io/files/62832ea5a10630001d155b7b.png
https://gyazo.com/174116d2536200413dc8954002c21813
表示されるのは
自分が参加しているproject
watch listに入っているproject
検索の実装
Pageのschemaで重要なのは3つ
code:models/page/schema.js
const schema = {
projectId: id,
title: string,
}
schema.index({ projectId: 1, title: 1})
schema.index({ projectId: 1, links: 1})
linksには、このページ内にあるリンク記法がリストされている
この発表資料の場合["External Links", "トラックバック", "リンク", "関連ページスタック"]みたいな感じ
1回のqueryで取得できる
code:find-1-hop-links.js
const pages = await Page.find({
$or: [
{ projectId: 今見てるprojectのID, links: 今見てるページのタイトル }, // 逆リンク
]
})
projectIdで検索範囲を絞る
titleとlinksを使って、1 queryで双方向リンクをまとめて取得できる
Pageのschemaに.projectLinksを追加した
code:models/page/schema-ver2.js
const schema = {
projectId: id,
title: string,
}
schema.index({ projectId: 1, projectLinks: 1})
projectLinksには、このページ内にある別projectリンク記法がリストされている
この発表資料の場合
["/shokai/Scrapbox開発プロセス", "/nishio/pMovidea", "/help-jp/ブラケティング"]
/:projectName/:pageTitleという形式で保存している
2つqueryを追加すると取得できる
code:find-external-links.js
const pages = await Page.find({
$or: [
{ // 逆リンク
projectId: { $in: 検索対象projectリスト },
projectLinks: /${今見てるproject名}/${今見てるページのタイトル}
},
{ // 順リンク
projectId: projectLinksの、projectName部分
title: projectLinksの、pageTitle部分
}
]
})
projectIdで検索範囲を絞る
projectLinksとtitleで、双方向リンクをまとめて取得できる
つまり1 hop linkの、検索対象projectを広げたバージョンで実装できる
負荷が高まるとしたら
検索対象のprojectが多くなりすぎて、ストレージからのmongo documentのFETCHが巨大化するケースぐらいだと思う
そういう場合は、長期間アクセスしていないprojectをwatch listの検索対象から除外すればいいかな?たぶん
まあなんとかなりそう
まとめ
関連ページリストがproject外にも広がってきた
広がりすぎてもしょうがない。つながったらうれしい範囲をコントロールする仕組みを事前に仕込んだ
検索範囲が広がったけど、現実的な計算時間で処理できるqueryを構築できた
チャンネル登録と高評価お願いします
pastak.icon 求人のお知らせと休憩があります