Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
How Skylight was created / Techniques for const...
Search
penpenpng
March 17, 2023
Programming
380
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
How Skylight was created / Techniques for constructing URL Entity.
https://428lab.connpass.com/event/277114/
penpenpng
March 17, 2023
More Decks by penpenpng
See All by penpenpng
Nostr REQ with Rx / Rx で REQ する Nostr
penpenpng
0
15k
Nostr Web Client のための (Service) Worker 活用法
penpenpng
0
470
Other Decks in Programming
See All in Programming
TypeScript+Orvalで実現する型安全かつ堅牢でスケーラブルなマルチチャネル通知基盤 / TSKaigi Night talks ~after conference~
d0riven
0
350
Snowflake Summitでの新機能 CoCo / CoWork / snowflake-summit-2026-overall-what-new-coco
tatsuhiro
1
150
「なぜそう決めたのか」を残し続ける仕組み ― Notion AI カスタムエージェント × Slack連携による設計判断の自動記録 - NIKKEI Tech Talk #47
niftycorp
PRO
0
210
不変条件と整合性境界—ビジネスが決める設計判断と実現パターン / Invariants and Consistency Boundaries
nrslib
14
5.6k
AIとASP.NET Coreで雑Webアプリを作った話
mayuki
0
660
IBM Bobを活用したレガシーアプリの最新化
oniak3ibm
PRO
1
200
Skillsは効率化、Agentsは"自分の拡張"——Builder時代のエージェント編成(CC Night 2026)
wemra
1
140
技術記事、AIに書かせるか、自分で書くか? 〜それでも私が自分の手で書く理由〜 / #QiitaConference
jnchito
2
1.4k
C# and C++ Interoperability - cho-dotnetnew
harukasao
0
280
気圧・高度・GPSを記録&可視化するアプリ「Koudo」を作った話
hjmkth
1
290
並列実装の現場、2ヶ月間実務でAIを使い倒したAIもPCも私も限界が近い
ming_ayami
0
130
ユニットテストの先へ:テスト技法で要求・仕様を整理するJava開発実践 / Beyond_Unit_Testing_Practical_Java_Development_Techniques_for_Organizing_Requirements_and_Specifications
shimashima35
0
410
Featured
See All Featured
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
160
Between Models and Reality
mayunak
4
340
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
560
For a Future-Friendly Web
brad_frost
183
10k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
2.9k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
150
Amusing Abliteration
ianozsvald
1
210
XXLCSS - How to scale CSS and keep your sanity
sugarenia
250
1.3M
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
340
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
410
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
170
GraphQLとの向き合い方2022年版
quramy
50
15k
Transcript
Skylight ができるまで / URL Entity を構成する技法 ぽーまん (@penpenpng.bsky.social) Bluesky/ATProtocol 勉強会
#0
Skylight ができるまで
3月3日、嵐は止み、雲間から青空が覗いた
そしてペンギンは空を飛んだ - [17:08] ペンギン空を飛ぶ
帰った - [17:08] ペンギン空を飛ぶ - [17:30] ペンギン Nostr に帰る
武器商人曰く、 - [17:08] ペンギン空を飛ぶ - [17:30] ペンギン Nostr に帰る -
[19:45] TL 取得方法が確立される
🤔 🤔
~回想~
🤔 🤔
かくして天窓は開かれた - [17:08] ペンギン空を飛ぶ - [17:30] ペンギン Nostr に帰る -
[19:45] TL 取得方法が確立される - ~なぞのじかん~ - [翌 01:11] できた
Skylight の価値 - Skylight の目的は iPhone 民以外のための「天窓」=「青空を少し覗ける」で、拙速が命 - TL が見れてかつ投稿できる、おそらく、たぶん、最初の
web クライアント - Skylight 自体に技術的な面白さはない - ただガワを組み立てただけ - 実際、材料は既にほとんど提供されていた - かすてらふぃさんの gist もあったし、 - Charles などがあれば Skyblue 公式の API コールを観察することもできた PC なしでも iPhone の http 覗き見できて便利。おすすめ。
Skylight は巨人と周囲の人間の肩の上に座っているだけ これを覗けばだいたい様子はわかるが、型定義はかなーり大雑把というか general なのでここだけは自分で Bluesky 向けに書き直した。 型定義までついてくる @atproto/api SDK
があるらしい
Skylight は巨人と周囲の人間の肩の上に座っているだけ かっこいいものを素早く作るには CSS フレームワークに乗るのがいいらしい 最初は CSS を素書きするつもりだった。すんでのところでこの会話を思い出し、軽くて component 志向でなおかつテーマが紫の
spectre.css を採用。
Skylight は巨人と周囲の人間の肩の上に座っているだけ 超絶便利な URL 抽出ライブラリがあるらしい
Skylight は巨人と周囲の人間の肩の上に座っているだけ 職場の先輩の在りし日の PR コメント 「TanStack Query はいいぞ」 いいらしい
Skylight の今後 - 当初の役目は終わったと考えている - もう Bluesky 向けのクライアントは素晴らしいものがたくさんある - が、自分が満足できるまでアップデートは続けていくつもり
- 生み出した手前愛着があり、しばらくは自分のメインクライアントにしたい - 主要な機能で未実装のものが残っているとムズムズするのもある - なんでも完成させることはいいことですよ
URL Entity を構成する技法
TL;DR - URL 添付機能を実装するためだけに SES Problem を解いた
URL が自動でリンクになるわけではない。そう、青空ではね。 何もしないとただのテキストとして投稿される
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)` と読み取るほうが素直だが、ここでは自然な日本語への書き下しを優先している リンク挿入位置からリンク先まで手取り足取り教えてあげなければならないウルトラ面倒仕様
URL が自動でリンクになるわけではない。そう、青空ではね。 Bluesky では「h 抜き」などという古代の儀式はもはや不要なのだ 逆に言えば、リンクにするかしないかを選べる柔軟な仕様 Skylight では URL をリンクにしたくないときにはこれを押せばいい
じゃあ、こんなときどうする? – Case1 https://a.com https://b.com 位置: [0, 13) リンク: Yes
位置: [14, 27) リンク: No
じゃあ、こんなときどうする? – Case1 https://a.com https://b.com 位置: [0, 13) https://b.com リンク:
Yes 位置: [14, 27) リンク: No 位置: [0, 13) ← 位置は a.com と同じだけど……
じゃあ、こんなときどうする? – Case1 https://a.com https://b.com 位置: [0, 13) https://b.com リンク:
Yes 位置: [14, 27) リンク: No 位置: [0, 13) リンク: ??? ← b.com と同じように No になってほしい ← 位置は a.com と同じだけど……
じゃあ、こんなときどうする? – 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
じゃあ、こんなときどうする? – Case2 https://x.com https://y.com 位置: [0, 13) リンク: Yes
位置: [14, 27) リンク: No 果たしてこんなレアケースを考慮する必要があるだろうか。いや、ない。
じゃあ、こんなときどうする? – 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 になってほしい
じゃあ、こんなときどうする? – 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 ということになってる
じゃあ、こんなときどうする? – 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 で一括入力されると……😇
Skylight is Minimal Client だ。そうだよね?
Skylight is Minimal Client だ。そうだよね?
このトリビアの種、つまりこういうことになります 編集前後の URL 列が与えられる。"同一性を保つ" URL のペアを線で結ぶと、△$@♨!! https://a.com https://b.com https://c.com https://b.com
https://a.com https://b.com https://d.com
このトリビアの種、つまりこういうことになります 編集前後の 文字列 が与えられる。"同一性を保つ" 文字 のペアを線で結ぶと、△$@♨!! A B C B
A B D
"同一性を保つ" is 何 - 文字列の編集 を以下の操作の繰り返しと考える - 1文字削除 - 1文字挿入
- 最も効率のいい編集を行う。 このとき、編集前後で削除も挿入もされなかった文字のペアは "同一性を保っている" と言えそう。
- 文字列の編集 を以下の操作の繰り返しと考える - 1文字削除 - 1文字挿入 - 最も効率のいい編集を行う。 このとき、編集前後で削除も挿入もされなかった文字のペアは
"同一性を保っている" と言えそう。 "同一性を保つ" is 何 Shortest Edit Script Problem Edit Graph 上の最短経路の Path において通過した Trace
Edit Graph を使って Shortest Edit Script Problem を解く A B
C B A B D
Edit Graph を使って Shortest Edit Script Problem を解く A B
C B A B D 編集前 編集後
Edit Graph を使って Shortest Edit Script Problem を解く A B
C B A B D 同じ文字 同じ文字
Edit Graph を使って Shortest Edit Script Problem を解く A B
C B A B D 同じ文字 同じ文字
Edit Graph を使って Shortest Edit Script Problem を解く A B
C B A B D
スタート ゴール Edit Graph を使って Shortest Edit Script Problem を解く
A B C B A B D この迷路が Edit Graph
ゴール スタート Edit Graph を使って Shortest Edit Script Problem を解く
A B C B A B D 下への移動 = 文字の削除 ✕
ゴール スタート Edit Graph を使って Shortest Edit Script Problem を解く
A B C B A B D 斜めの移動 = 文字のキープ ✕
ゴール スタート Edit Graph を使って Shortest Edit Script Problem を解く
A B C B A B D 右への移動 = 文字の挿入 ✕
ゴール スタート Edit Graph を使って Shortest Edit Script Problem を解く
A B C B A B D ABC ✕ ✕ _BC BC BAC BA_ BAB BABD スタートからゴールまで = 編集方法
ゴール スタート Edit Graph を使って Shortest Edit Script Problem を解く
A B C B A B D 最短ルート = 最も効率的な編集方法 今回は問題のサイズが小さいので、素直な 動的計画法+経路復元 で十分速く解ける
ゴール スタート Edit Graph を使って Shortest Edit Script Problem を解く
A B C B A B D よって今回同一性を保っている URL は……
ゴール スタート Edit Graph を使って Shortest Edit Script Problem を解く
A B C B A B D この 2 ペア
ゴール スタート Edit Graph を使って Shortest Edit Script Problem を解く
A B C B A B D この 2 つの URL に与えられた リンク化フラグだけ維持すればよい
ゴール スタート Edit Graph を使って Shortest Edit Script Problem を解く
A B C B A B D この 2 つの URL に与えられた リンク化フラグだけ維持すればよい
ご清聴ありがとうございました Skylight は favicon とロゴタイプのコントリビューションをお待ちしています