✅Linksに相当するFooterをつける
調査
ページAのメタ情報的な扱い
links: Aに「Aが持つリンク先ページ」を持たせている
ページAの情報全部入りかしら
links:
relatedPages:
links1hop: obj
links2hop: obj
つまり前処理として以下をしている
ページAに「Aが持つリンク先ページ名」を持たせる
ページAの1hop, 2hopを計算して、持たせる
これ自力でつくるのが、ぱっとはわからんなぁ
実装練る
projectのページ数をNとする
とりあえずAに「AのlinkTo」を持たせる
Q: AのlinkFromを求めるには?
「linkToにAを持つページ」を総当りで調べればよい
オーダーは1ページあたりO(N)、projectdとO(N*N)
Q: Aのlinks1hopを求めるには?
links = linksTo and linksFrom = links1hopだとすると、もう求まっている
Q: Aのlinks2hopを求めるには?
A.linkTo[i].linkFromを全部Aに持たせればよい
code:イメージ.py
for linkTo in A.linkTos:
linkToPageOfA = linkTo
for twohopTargetOfA in linkToPageOfA.linkFroms:
A.links2hop.append(twohopTargetOfA)
オーダーは?
1ページが持つリンク数をLとすると、1ページあたりO(L*L)
projectではO(N*L*L)
Q: オーダー総合は?
O(N*N) + O(N*L*L)
5000page、1ページが持つリンク数平均を10とすると
時間かかりそうやな
感想
^2、^3のオーダー感
テスト書いて足元固めていかないとクリアできる気がしない
実装箇所
Pageクラスかなぁ
linkTos
linkFroms
link1hops
これはlinkTosとlinkFromsをマージして返すだけ
link2hops
main
code:main.py
if __name__ == '__main__':
...
s = file2str(filename)
obj = str2obj(s)
proj = Project(obj)
...
generate_and_save_special_pages(proj, BASEDIR, args)
...
convert_and_save_all(proj, BASEDIR, args)
convert_and_save_all() では page.lines をファイルに保存してるから、lines に各種リンク情報を反映させておく必要がある
code:たとえば.md
## (ページタイトル)
(ページ内容)
↓ ここから下を追加する必要がある ↓
## Links
...
...
どこまで表示させるか、のコントロールえぐそうだがsta.icon
重みつけてしきい値で制御できるようにせなあかんよな
まあただのテキストだし、とりあえず全部入れればいいか
まずは動かしてみそ
projectオブジェクトはpagenameのリストしか持ってないので、別途pageのインスタンスを持たせる必要がある
しかしgenerate_and_save_special_pages()もconvert_and_save_all()も自関数内でPageインスタンスつくってる……
ので、main側で「pageインスタンス全部保持するマン」つくって、この関数達に渡す必要があるdone
pageインスタンス全部保持するマンを使って、各pageインスタンスのlinks系プロパティに値を入れていく
実装 linkto
まずは「自分が持つリンク一覧」、つまりlinkToをつくるところから
部品
2 1のうち「ページとして存在しないもの」を弾く
部品使って実装
ok
今は全然リンク張ってない
どういうふうに張るべきか
linkto/from, 2hop全部をもれなくテストできる感じで張りたい
[https://gyazo.com/ca77761384ed5e1f6c61000b5ff94eaa]みたいな?
いや、列挙でええか
孤立点
code:graph
A
linktoが1つ
code:graph
A-->X
linktoがnつ
code:graph
X<--A-->X
linkfromが1つ
code:graph
X-->A
linkfromがnつ
code:graph
X-->A<--X
2hoplinkが1つ
code:graph
A-->X<--B
2hoplinkがnつ
code:graph
C
|
v
A-->X<--B
反映してみたのでちょっと図にする
https://gyazo.com/9ba7e0d7682feeb1115628a0af61b093
o
linksには何も表示されない
t1
https://gyazo.com/58150d8883ee95a142042e329b701bf9
linksとしては、linktoを持ってるx
pagexの2hopとして、a,b,tn
tn
https://gyazo.com/915f048576ea6648f44d3d9c8caf068a
x
https://gyazo.com/f6d48613f1eecc2c325901e087fec486
2hop は fn の y 分
y
2hop は fn の x 分があるはず
https://gyazo.com/64f088af3ecf2d229feb4ede47133fc8
yeah
だいぶわかってきたsta.icon
動作確認
長いので略す
bf: python scbjson2ghpages.py -i testdata-for-to-markdown.json --print-page
af: ... --print-page
code:terminal
$ ... --print-page "pageX" | grep -i linkto
linkto: 2
$ ... --print-page "pageY" | grep -i linkto
linkto: 1
$ ... --print-page "link-linkto-N" | grep -i linkto
link-linkto-N
linkto: 2
$ ... --print-page "link-linkto-1" | grep -i linkto
link-linkto-1
linkto: 1
$ ... --print-page "link-linkfrom-1" | grep -i linkto
linkto: 0
$ ... --print-page "link-linkfrom-N" | grep -i linkto
linkto: 0
$ ... --print-page "link-zero" | grep -i linkto
linkto: 0
良さそう
まあ細かい問題がこれからわんさか出るだろうけどーsta.icon
train.icon久々にかなり集中出来た気がする
code:trita
1 2021/05/05 Wed 08:24 08:39 _ 3 朝食 ゆで卵 セット rep:1 m:7
1 2021/05/05 Wed 08:39 08:53 taberru
1 2021/05/05 Wed 08:53 10:54 1 scrapbox markdown ★2hは滅多にないです
実装 linkfrom
引用
Q: AのlinkFromを求めるには?
「linkToにAを持つページ」を総当りで調べればよい
オーダーは1ページあたりO(N)、projectdとO(N*N)
計算端折るなら、linkTo計算時に、to側のページのインスタンスのlinkFromも書き換える……こうだな
どうしよかな
code:py
@staticmethod
def construct(page_instances, pagenames_in_project_by_dict):
# linkto
for page_inst in page_instances:
page_inst.update_linkto(pagenames_in_project_by_dict)
改めて計算書くのもかえってだるい気がしてきた
page_inst.append_to_linkfrom() みたいなのつくってしまうか?
つくった
が、反映されん
https://gyazo.com/99b84a2f13e5072ce413bee77ac8dbd6
pageseekerからgetしたインスタンスのappend_to呼んでるんだけど、反映されてないな
なぜ
参照渡しだから問題ない認識なんだが
printしてる側の変数名がコピペのままだった!
動作確認
https://gyazo.com/9e2a9b62fb2bf02060d42e2fcfda0dbe
良さそう
計算時間は問題なさそう
ではページ一覧に「被リンク数が多い順」入れてみるか
https://gyazo.com/c542cbb29ef0cda147b97b101985d6c9
なんで
ああ、中で新たにインスタンス化してるからだ
https://gyazo.com/7da2e22e08c4bb2a62323f108a8016fc
外から渡すようにする
ok
https://gyazo.com/525cd8cd2b8bfdf5a64f59d68a6577f8
おお、いい感じやん
https://gyazo.com/005d61cddb6feaee045a21e3d2edaf3d
結果だいぶ違うけど
https://gyazo.com/3b3efe6a80a06cdbdb2ae0de78683db9
細かい順位が前後している
scrapbox: 読んだアニメ → 読んだラノベ
scrapbox-sta: 読んだラノベ → 読んだアニメ
この二つで言えば数は僅差なので、たぶん俺の実装が甘い
読んだアニメタグのうち捕捉できてないものがあるとか
考えられる要因
一部のハッシュタグやリンクを上手く検出できてない
codeの中にあるリンク記法も検出してしまっている
ここはまだできてないsta.icon
が、codeの中に書いてる「リンク先が存在する」リンクってあまりないので、ここまで差はでないと思う
Scrapbox本家がmost linkedに別の意味を込めている
hashtagによるリンクを0.5、linkを1にして計算しているとか?
まあいったん放置でsta.icon*2
footerつけてみます
convert_and_save_all() では page.lines をファイルに保存してるから、lines に各種リンク情報を反映させておく必要がある
ここかな
code:py
def convert_and_save_all(project, page_instances, basedir, args):
use_dryrun = args.dryrun
for i,page_inst in enumerate(page_instances):
pagename = page_inst.title
scblines = page_inst.lines
if use_dryrun:
print('No.{:05d} page "{}", '.format(i+1, pagename), end='')
markdown_lines = convert_one_page(scblines)
# ★ここで markdown_lines に links 系のコンテンツを追加する
# generate_links() とか
markdown_lines.insert(0, '## {}'.format(pagename))
save_one_file(markdown_lines, pagename, basedir, use_dryrun)
ああああー
リンクの順番も制御するためには、page.linkto_pagenames じゃなくて page.linkto_pages じゃないとダメだわ
つまり list of instance へのポインタを持たせる
ん、ちょっと混乱してきた
ページAのlinktoを表示したい場合、どういう順番で表示すればいい?
たとえばTN
TNはXとYにリンクしている
XとY、どっちを先に列挙すべき?
これは先に出現した方でいいか
入れた
こんな感じになった
code:md
## pageX
x
<br>
<br>
## Links
- :point_left: PageB(PageB.md) - :point_left: PageA(PageA.md) emojiでリンクの方向を示してみた
コーヒー.icon入れてもお釣り来るな、5分くらいはかかる
jemojiが反映されない。。。
https://gyazo.com/d5c384f4750d414716ace4d61f650894
調べてるけど既知問題ではなさそう
時間差?
わからんsta.icon
safe: true
と記述してしまうと、これらのプラグインが動作しません。
なんだと
見当たらん!
のでemoji路線は諦める
見出し分けるか
Links: from other
Links: to other
が、otherまわりの英語、細かい使い分けわからんのでやめとくか
the other とか others とかマジでわからん
→と←でいいか
反映
https://gyazo.com/146c5bd8981e07f6e07fb048e55ead2d
← がここにリンクしている、で→がここからリンクしているの意
まああとは慣れでしょ
では最後、2hop-link行こう
引用
A.linkTo[i].linkFromを全部Aに持たせればよい
code:イメージ.py
for linkTo in A.linkTos:
linkToPageOfA = linkTo
for twohopTargetOfA in linkToPageOfA.linkFroms:
A.links2hop.append(twohopTargetOfA)
Q: 分量爆発しない?
例: AがlinktoをT個持ってて、A.linktoが平均F個のlinkfromを持ってる場合
Aの2hop link欄にはT*F個のリンクが並ぶ
いや、考え方違うなsta.icon
A.linktoごとに項目を用意するべきだ
そしてA.linktoそのものを取捨選択するべきだろう
A.linktoのうち上位10個まで表示する、とか
2hop-linkの作り方、想像以上に難しそう。。。
実装どうしよ
A.linkTo[i].linkFromだよな
A.links2hopを参照したとき、何をどう返せばいい?
普通にA.linkTo返せばよくない?
code:呼び出し元でこうすればええやん.py
for pageinst_linked_from_A in A.linkto_page_instances:
twohop_pageinsts_from_A = pageinst_linked_from_A.linkfrom_page_instances
...
ってことは、Pageインスタンスでは何か持たせる必要はなくて、linksつくるレイヤーで上記呼び出しを勝手に書けって話になる
あとは上記の100フィルターを入れるくらいで
やってみるか
あ、そうか
2hop link表示したら、linkto一覧表示する必要ないんだ
https://gyazo.com/1d830b93a2ad005e5dda74b89a7e59f4
ここがlinktoの一覧になってる
さすがに誰かが既に名前つけてると思うけど
done
表示数上手いことコントロールしたい
とりあえずカウンタつくった
8-8 cutと命名したものを入れてみた
https://gyazo.com/22de6bc83cd49a68f5dd580e29a37f35
ページAの2hop-linkについて、
Bの個数がN以上の場合、上位Nまでを表示する
Cの個数がN以上の場合、上位Nまでを表示する
B,C = 8,8にした
数字はテキトー
Q: 上位とは?
が、8-8 cut だと入らんかもなー
ビルド8min経っても帰ってこない
failed
16-8-4にした
https://gyazo.com/c1e3ed9670bafb7d725d30210e58e075
ページAのLinks(ここではlinkfrom)と2hop-linksについて
1と2の3の表示数に制限を設ける
N個まで
これをx-x-xの形で表現することにした
16-8-4
1は16個まで
2は8個まで
3は4個まで
いや何が悲しくてこんな微調整せなあかんのって話なんだけどもsta.icon*2
Jekyll!!
通った!
9min 1sec
https://gyazo.com/6e33ec40bbc12f5089fe136dcd97f2a9
ぎりぎりな塩梅やな。。。
2hop-link部分の実装、現状まとめ
Scrapbox本家のアルゴリズムむずそうなので、いったん適当につくる