Upgrade to Pro — share decks privately, control downloads, hide ads and more …

How Skylight was created / Techniques for constructing URL Entity.

How Skylight was created / Techniques for constructing URL Entity.

penpenpng

March 17, 2023
Tweet

More Decks by penpenpng

Other Decks in Programming

Transcript

  1. かくして天窓は開かれた - [17:08] ペンギン空を飛ぶ - [17:30] ペンギン Nostr に帰る -

    [19:45] TL 取得方法が確立される - ~なぞのじかん~ - [翌 01:11] できた
  2. Skylight の価値 - Skylight の目的は iPhone 民以外のための「天窓」=「青空を少し覗ける」で、拙速が命 - TL が見れてかつ投稿できる、おそらく、たぶん、最初の

    web クライアント - Skylight 自体に技術的な面白さはない - ただガワを組み立てただけ - 実際、材料は既にほとんど提供されていた - かすてらふぃさんの gist もあったし、 - Charles などがあれば Skyblue 公式の API コールを観察することもできた PC なしでも iPhone の http 覗き見できて便利。おすすめ。
  3. Skylight の今後 - 当初の役目は終わったと考えている - もう Bluesky 向けのクライアントは素晴らしいものがたくさんある - が、自分が満足できるまでアップデートは続けていくつもり

    - 生み出した手前愛着があり、しばらくは自分のメインクライアントにしたい - 主要な機能で未実装のものが残っているとムズムズするのもある - なんでも完成させることはいいことですよ
  4. URL が自動でリンクになるわけではない。そう、青空ではね。 // 本文を「test https://example.com」とせよ "text": "test https://example.com", "entities": [{

    // 投稿にはリンクを含めよ "type": "link", // リンク先は「https://example.com」とせよ "value": "https://example.com", // 本文5文字目直後から24文字目までをリンクにせよ "index": { "start": 5, "end": 24 } }] index は 0-based indexing なので `範囲 [5, 24)` と読み取るほうが素直だが、ここでは自然な日本語への書き下しを優先している リンク挿入位置からリンク先まで手取り足取り教えてあげなければならないウルトラ面倒仕様
  5. じゃあ、こんなときどうする? – Case1 https://a.com https://b.com 位置: [0, 13) https://b.com リンク:

    Yes 位置: [14, 27) リンク: No 位置: [0, 13) ← 位置は a.com と同じだけど……
  6. じゃあ、こんなときどうする? – Case1 https://a.com https://b.com 位置: [0, 13) https://b.com リンク:

    Yes 位置: [14, 27) リンク: No 位置: [0, 13) リンク: ??? ← b.com と同じように No になってほしい ← 位置は a.com と同じだけど……
  7. じゃあ、こんなときどうする? – Case1 https://a.com https://b.com 位置: [0, 13) https://b.com リンク:

    Yes 位置: [14, 27) リンク: No 位置: [0, 13) リンク: ??? ← b.com と同じように No になってほしい ← 位置は a.com と同じだけど…… URL 文字列をキーにして リンク化フラグを保持すればいい? (例) a.com -> Yes b.com -> No
  8. じゃあ、こんなときどうする? – Case2 https://x.com https://y.com 位置: [0, 13) リンク: Yes

    位置: [14, 27) リンク: No 果たしてこんなレアケースを考慮する必要があるだろうか。いや、ない。
  9. じゃあ、こんなときどうする? – Case2 https://x.com https://y.com 位置: [0, 13) https://x.com https://y.com

    https://y.com リンク: Yes 位置: [14, 27) リンク: No 位置: [0, 13) リンク: Yes 位置: [14, 27) リンク: No 位置: [28, 41) リンク: ??? 果たしてこんなレアケースを考慮する必要があるだろうか。いや、ない。 ← Yes になってほしい
  10. じゃあ、こんなときどうする? – Case2 https://x.com https://y.com 位置: [0, 13) https://x.com https://y.com

    https://y.com リンク: Yes 位置: [14, 27) リンク: No 位置: [0, 13) リンク: Yes 位置: [14, 27) リンク: No 位置: [28, 41) リンク: ??? URL をキーにする手法は 同じ URL を複数貼られると破綻する 果たしてこんなレアケースを考慮する必要があるだろうか。いや、ない。 ← Yes になってほしい ← でも y.com は No ということになってる
  11. じゃあ、こんなときどうする? – Case3 https://a.com https://b.com https://c.com https://b.com https://a.com https://b.com https://d.com

    「Ctrl+A, Ctrl+V により編集されるケース」さえなければ、被編集文字列は文字列中の 1つの連続部分列である仮定を置けるので話が楽だった …… Ctrl+A, Ctrl+V で一括入力されると……😇
  12. "同一性を保つ" is 何 - 文字列の編集 を以下の操作の繰り返しと考える - 1文字削除 - 1文字挿入

    - 最も効率のいい編集を行う。 このとき、編集前後で削除も挿入もされなかった文字のペアは "同一性を保っている" と言えそう。
  13. - 文字列の編集 を以下の操作の繰り返しと考える - 1文字削除 - 1文字挿入 - 最も効率のいい編集を行う。 このとき、編集前後で削除も挿入もされなかった文字のペアは

    "同一性を保っている" と言えそう。 "同一性を保つ" is 何 Shortest Edit Script Problem Edit Graph 上の最短経路の Path において通過した Trace
  14. ゴール スタート Edit Graph を使って Shortest Edit Script Problem を解く

    A B C B A B D 斜めの移動 = 文字のキープ ✕
  15. ゴール スタート Edit Graph を使って Shortest Edit Script Problem を解く

    A B C B A B D ABC ✕ ✕ _BC BC BAC BA_ BAB BABD スタートからゴールまで = 編集方法
  16. ゴール スタート Edit Graph を使って Shortest Edit Script Problem を解く

    A B C B A B D 最短ルート = 最も効率的な編集方法 今回は問題のサイズが小さいので、素直な 動的計画法+経路復元 で十分速く解ける
  17. ゴール スタート Edit Graph を使って Shortest Edit Script Problem を解く

    A B C B A B D よって今回同一性を保っている URL は……
  18. ゴール スタート Edit Graph を使って Shortest Edit Script Problem を解く

    A B C B A B D この 2 つの URL に与えられた リンク化フラグだけ維持すればよい
  19. ゴール スタート Edit Graph を使って Shortest Edit Script Problem を解く

    A B C B A B D この 2 つの URL に与えられた リンク化フラグだけ維持すればよい