Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
N-Feedのできるまで
Search
shigepon7
February 21, 2024
Programming
440
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
N-Feedのできるまで
2024/2/21 Bluesky/ATProtocol 勉強会 #3 の @shigepon.net の資料です
shigepon7
February 21, 2024
Other Decks in Programming
See All in Programming
Simple Storage Service(S3) is not simple
iwatsukayura
0
230
Domain-Driven Transformation
hschwentner
2
2.3k
sbt 2.0: takeoff
eed3si9n
0
110
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
510
Androidだけじゃない、DroidKaigiで広がった私の技術スタック
akkeylab
0
120
Agents on Rails - Rails at Scale 2026
irinanazarova
0
520
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
590
mrbgem 三角測量 開発
ogom
0
220
GemmaをJevのように使ってみる / Use Gemma like Jev
kishida
5
740
UPDATE をやめる — EF Core でマスタをバージョン管理する
panda728
PRO
0
1.2k
速く作れる。その次は、速く確かめられる開発へ 〜AIネイティブ開発を支える、Shift Down〜 / Can build fast. Next, moving to development where we can verify fast.
rkaga
8
5.6k
個人開発者よ、Honoを使え(おじさんver)
tanahiro2010
2
160
Featured
See All Featured
Typedesign – Prime Four
hannesfritz
42
3.2k
Bootstrapping a Software Product
garrettdimon
PRO
306
120k
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
310
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
1.1k
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
680
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.6k
Building the Perfect Custom Keyboard
takai
2
900
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
2
2k
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
5
780
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
56
3.5k
AI Search: Where Are We & What Can We Do About It?
aleyda
0
8.1k
Transcript
N-Feedのできるまで @shigepon.net(ひで部) 2024/2/21
自己紹介 handle: @shigepon.net (通称:しげぽん) did: did:plc:64aqvld6on6kzrejzqha4w6j 本名は知っててもバラさないのがマナーです
Bluesky始めた日: 2023/5/10 Blueskyでやってること: 生存確認の「おはよう」とFeedGeneratorの提供 自宅Kubernetesクラスタ 自宅自作スマートホーム(Slackがインターフェイス) Rustでatproto扱うaerostreamというcrate書いてたら公開させられました
概要 N-Feedというちょっと説明の難しいカスタムフィードをひで部の活動の 中で作りました。 • どういう経緯で作る事になったのか • どういう仕組みで動いているのか を説明することで、
N-Feedとは何なのか? を理解してもらおうというものになっています。
U-Feedのできるまで (N-Feedちゃうやんけ)
Ucho-tenとU-Feed ばいそにさん(@bisn.ucho-ten.net)のbskyクライアントのUcho-ten このUcho-tenのコンセプトにあわせて、正式リリースに時期をあわせて カスタムフィードを用意できないかとひで部で事前に相談されていました そこで生まれたのがU-Feed U-Feedとは「SNSの中で生まれるバズ」と無縁なポストのみを表示する
カスタムフィードのこと(ばいそにさん間違ってたらごめん) U-Feedは「ポストを構成する全ての名詞が、過去一定時間内に他のポス トに出現していない」ことを条件にピックアップするというカスタム フィード(ってバラして良かったんだっけ?ばいそにさん) これを実現するにはある技術が必要 → 「形態素解析」
形態素解析 知ってる人は知ってると思うのでその場合は寝ててください (私の解釈が間違ってる時は優しく訂正してください) 英語の場合は文を単語に分割する時には、空白や記号を区切り文字として 分割するだけで単語の羅列を取り出す事が可能 日本語の場合は特定の文字を区切り文字としても単語にまで分割すること が不可能なので、文法的解釈にあてはめて単語に分割する必要がある
この単語分割の技術のことを形態素解析と呼んでいます U-FeedはRustで記述していたのでLindera(ベースはkuromoji)を利用して います (https://github.com/lindera-morphology/lindera)
初期のU-Feed 1. Firehoseから流れてくるポストを拾う 2. 形態素解析にかけて単語に分割し名詞だけをリストアップする 3. 過去の名詞リストと照合して出現していない名詞しか含んでいないなら カスタムフィードに表示するためのポストのリストにキャッシュする 4. 抽出した名詞を過去の名詞リストに突っ込む
5. 1.に戻って繰り返す この繰り返し処理を常時動かしておき、カスタムフィードの表示リクエス トがきたら、キャッシュしておいたポストのリストを返すということで、 初期のU-Feedを実現していました 現行のU-Feedは別の仕組になってますがこれはまた別のお話
奈良Feedのできるまで (N-Feedちゃうやんけ)
奈良Feed 奈良Feedは私が作成する以外にも存在したのですが、キーワードとして 奈良を必要としているためか、奈良市以外の情報がほぼ出てこずに、私の 必要な情報を探すのに適していなかったため、自分用に奈良というカスタ ムフィードを用意する事になりました 奈良FeedもU-Feedと同様にFirehoseから得たポストに形態素解析をかけ て奈良に縁のある単語(自治体名称、観光地、食べ物、飲み物、商業施設、 駅名等)を含んでいるものを蓄積しておいてカスタムフィードとして閲覧
できるようにしていました ところがそれだけ網を広げてもあまりにも情報が少ない! 過去のポストも遡って奈良の情報をピックアップしたい! と思ったので、過去のポストも遡って検索できる仕組みを構築する事に
Elasticsearch 全文検索やってる方は必ず一度は通るElasticsearch 初期のBlueskyの検索エンジンは期待通りの検索結果を得る事が難しかっ たので、検索性能の改善も期待して過去ポストもElasticsearchに入れる仕 組みを作成 全部のポストを入れるとさすがに多いので、langsにjaを設定しているポ ストと、そのポストを投稿した人の過去ポストをElasticsearchに入れる
という形で検索インデックスを作成 Elasticsearchを使えばkuromojiという形態素解析器と連携してポストに含 まれる単語でインデックスを作成できる 結果として奈良フィードはBlueskyの原初にまで遡って奈良の情報を表示 する事ができるように
Elasticsearch内に蓄積された情報 (2/21時点でのKibanaの画面)
ランダムFeedのできるまで (N-Feedちゃうやんけ(3回目))
ランダムFeed ばいそにさんがまたぼそっとつぶやきました 「自分の過去ポストをランダムに表示できたらおもしろいんじゃないか」 (とかなんとかそんなことを言ってたと思う) それElasticsearchあるからできるよってうっかり発言してしまった私 以下のような仕組を作ってランダムFeedは動いています
1. FeedGeneratorへのアクセスから要求元のアカウントのDIDを取得 2. その人の過去ポストの総数を取得 3. 0からその過去ポストの総数までの乱数を10コ作成 4. 作成日時順に並べた過去ポストから<乱数番目>のポストを10コ抽出
N-Feedのできるまで (N-Feedちゃうやんけ…いや、あってるやんけ!)
N-Feedができるまで N-Feedって私も何やようわからんかったんでずっと無視してました ばいそにさんとないへぶさん(@moja.blue)が「自分の投稿内容に関連した 投稿が3つくらいつづいて表示されるようなフィード」で私を召喚 気が向いたので、関連した、という曖昧な部分を具体化する事に挑戦 ポストに含まれる名詞の中でより特徴的であろう名詞を抽出してみる事に
当時の記録がこれ shigepon.net : 隣の柿はよく客食う柿だ -> 柿 moja.blue : 播磨屋を一代で今の播磨屋にブランディングしたのは今の社長の功績で,それまではクローバー製菓という地方のお 菓子下請け工場だった.社屋のデザインから創造するに,おそらく,神がかり的なことがあったのだろう. -> 一代 bisn.ucho-ten.net : よくわからんけどAppViewが分割されたとかなんとかの影響なのかな -> appview aming.bsky.social : 自ら噂話をしてるわけでもないのに社内の色んな情報が集まってくる...なぜ -> 社内 saw.bsky.social : 洗濯物ぶっ飛んでったわ。ワハハ。拾ってこよ -> ワハハ
ワハハのタイムライン ワハハのタイムラインはおもしろそうだということで、当時のタイムライ ンより「ワハハ」を含むポストを3つほど拾ってきて表示したのがこちら 普通におもしろい むしろワハハフィードで良いのではないか?(いや良くない) これと同様の処理を5回繰り返してカスタムフィードにしたのがN-Feed
0: 洗濯物ぶっ飛んでったわ。ワハハ。拾ってこよ 1: すぎる家あったけえなぁ わたしもできたらそんな家庭に産まれるか自分で作るかしたかったけど無理っぽいなぁ ワハハ せめ て自分だけでも楽しく生きよう 2: 原稿に怒涛の赤入れがきたけど楽しくなってきちゃったな。誰と仕事するかは本当に重要だわ。ワハハ 3: エコバッグ忘れたので袋買います…… ところで現地着予定時刻ですがこれから電車~ワハハ
ないへぶさんによるわかりやすい説明 カスタムフィードを閲覧しにきた人 の最新ポストを5コほど抽出 各々のポストから形態素解析で名詞 を抽出し特徴的な単語を1つ選択 カスタムフィードを閲覧しにきた人 以外の過去ポストの中からその単語
を含むポストを新しい順に3つ検索 リロードする度に検索するので、前回 表示時点以降で新しいポストがあれば タイムラインも変化します 閲覧した人のポスト→過去ポスト1→ 過去ポスト2→過去ポスト3の順でタ イムラインを構築
N-Feedの障害 私のカスタムフィードは私の自作crateであるaerostreamというものを 使ってRustでバイナリを構築しておりasyncは利用せずに実装 (https://github.com/shigepon7/aerostream) 一方でElasticsearchをたたくためのcrateはasyncで実装されている (https://github.com/elastic/elasticsearch-rs) このため初期のN-FeedはElasticsearchをたたくところだけtokioのランタ
イムを用意してblock_onで検索していたが、複数スレッドで同時にリクエ ストがとんできた時にランタイムエラーが出ていて落ちていた模様 要は手抜きしてたので不安定だった 結局ureqを使ってElasticsearchを叩くように書き換えたので安定した その後自宅Kubernetes環境が全部消えたのはまた別の物語…
このおはなしの出演は… U-Feed バズと無関係 奈良フィード 奈良を再発見
ランダム 自分の胸に手をあててよう考えてみ N-Feed なんとなくないへぶさんが練り上げた
良いFeed生活を @shigepon.net(ひで部) 2024/2/21