Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
N-Feedのできるまで
Search
shigepon7
February 21, 2024
Programming
0
310
N-Feedのできるまで
2024/2/21 Bluesky/ATProtocol 勉強会 #3 の @shigepon.net の資料です
shigepon7
February 21, 2024
Tweet
Share
Other Decks in Programming
See All in Programming
TypeScript でバックもやるって実際どう? 実運用で困ったこと3選
yuichiro_serita
17
7.6k
これが俺の”自分戦略” プロセスを楽しんでいこう! - Developers CAREER Boost 2024
niftycorp
PRO
0
130
Discord Bot with AI -for English learners-
xin9le
1
110
Modular Monolith Monorepo ~シンプルさを保ちながらmonorepoのメリットを最大化する~
yuisakamoto
11
4k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
1
140
イマのCSSでできる インタラクション最前線 + CSS最新情報
clockmaker
5
3.9k
14 Years of iOS: Lessons and Key Points
seyfoyun
1
700
Missing parts when designing and implementing Android UI
ericksli
0
390
今からはじめるAndroidアプリ開発 2024 / DevFest 2024
star_zero
0
800
rails statsで大解剖 🔍 “B/43流” のRailsの育て方を歴史とともに振り返ります
shoheimitani
2
690
コンテンツの主権を守るため(?)、高機能画像CDNからAWS自前対応に乗り換えた話
lengthtail
1
120
DevFest Tokyo 2025 - Flutter のアプリアーキテクチャ現在地点
wasabeef
4
630
Featured
See All Featured
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
26
1.8k
The Language of Interfaces
destraynor
154
24k
Become a Pro
speakerdeck
PRO
25
5k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
48
2.2k
Scaling GitHub
holman
458
140k
Why You Should Never Use an ORM
jnunemaker
PRO
54
9.1k
Large-scale JavaScript Application Architecture
addyosmani
510
110k
Raft: Consensus for Rubyists
vanstee
136
6.7k
Put a Button on it: Removing Barriers to Going Fast.
kastner
59
3.6k
A Philosophy of Restraint
colly
203
16k
Designing on Purpose - Digital PM Summit 2013
jponch
116
7k
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