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

N-Feedのできるまで

shigepon7
February 21, 2024

 N-Feedのできるまで

2024/2/21 Bluesky/ATProtocol 勉強会 #3 の @shigepon.net の資料です

shigepon7

February 21, 2024
Tweet

Other Decks in Programming

Transcript

  1. 自己紹介  handle: @shigepon.net (通称:しげぽん)  did: did:plc:64aqvld6on6kzrejzqha4w6j  本名は知っててもバラさないのがマナーです

     Bluesky始めた日: 2023/5/10  Blueskyでやってること: 生存確認の「おはよう」とFeedGeneratorの提供  自宅Kubernetesクラスタ  自宅自作スマートホーム(Slackがインターフェイス)  Rustでatproto扱うaerostreamというcrate書いてたら公開させられました
  2. Ucho-tenとU-Feed  ばいそにさん(@bisn.ucho-ten.net)のbskyクライアントのUcho-ten  このUcho-tenのコンセプトにあわせて、正式リリースに時期をあわせて カスタムフィードを用意できないかとひで部で事前に相談されていました  そこで生まれたのがU-Feed  U-Feedとは「SNSの中で生まれるバズ」と無縁なポストのみを表示する

    カスタムフィードのこと(ばいそにさん間違ってたらごめん)  U-Feedは「ポストを構成する全ての名詞が、過去一定時間内に他のポス トに出現していない」ことを条件にピックアップするというカスタム フィード(ってバラして良かったんだっけ?ばいそにさん)  これを実現するにはある技術が必要 → 「形態素解析」
  3. 初期のU-Feed 1. Firehoseから流れてくるポストを拾う 2. 形態素解析にかけて単語に分割し名詞だけをリストアップする 3. 過去の名詞リストと照合して出現していない名詞しか含んでいないなら カスタムフィードに表示するためのポストのリストにキャッシュする 4. 抽出した名詞を過去の名詞リストに突っ込む

    5. 1.に戻って繰り返す  この繰り返し処理を常時動かしておき、カスタムフィードの表示リクエス トがきたら、キャッシュしておいたポストのリストを返すということで、 初期のU-Feedを実現していました  現行のU-Feedは別の仕組になってますがこれはまた別のお話
  4. Elasticsearch  全文検索やってる方は必ず一度は通るElasticsearch  初期のBlueskyの検索エンジンは期待通りの検索結果を得る事が難しかっ たので、検索性能の改善も期待して過去ポストもElasticsearchに入れる仕 組みを作成  全部のポストを入れるとさすがに多いので、langsにjaを設定しているポ ストと、そのポストを投稿した人の過去ポストをElasticsearchに入れる

    という形で検索インデックスを作成  Elasticsearchを使えばkuromojiという形態素解析器と連携してポストに含 まれる単語でインデックスを作成できる  結果として奈良フィードはBlueskyの原初にまで遡って奈良の情報を表示 する事ができるように
  5. ランダムFeed  ばいそにさんがまたぼそっとつぶやきました  「自分の過去ポストをランダムに表示できたらおもしろいんじゃないか」 (とかなんとかそんなことを言ってたと思う)  それElasticsearchあるからできるよってうっかり発言してしまった私  以下のような仕組を作ってランダムFeedは動いています

    1. FeedGeneratorへのアクセスから要求元のアカウントのDIDを取得 2. その人の過去ポストの総数を取得 3. 0からその過去ポストの総数までの乱数を10コ作成 4. 作成日時順に並べた過去ポストから<乱数番目>のポストを10コ抽出
  6. N-Feedができるまで  N-Feedって私も何やようわからんかったんでずっと無視してました  ばいそにさんとないへぶさん(@moja.blue)が「自分の投稿内容に関連した 投稿が3つくらいつづいて表示されるようなフィード」で私を召喚  気が向いたので、関連した、という曖昧な部分を具体化する事に挑戦  ポストに含まれる名詞の中でより特徴的であろう名詞を抽出してみる事に

     当時の記録がこれ shigepon.net : 隣の柿はよく客食う柿だ -> 柿 moja.blue : 播磨屋を一代で今の播磨屋にブランディングしたのは今の社長の功績で,それまではクローバー製菓という地方のお 菓子下請け工場だった.社屋のデザインから創造するに,おそらく,神がかり的なことがあったのだろう. -> 一代 bisn.ucho-ten.net : よくわからんけどAppViewが分割されたとかなんとかの影響なのかな -> appview aming.bsky.social : 自ら噂話をしてるわけでもないのに社内の色んな情報が集まってくる...なぜ -> 社内 saw.bsky.social : 洗濯物ぶっ飛んでったわ。ワハハ。拾ってこよ -> ワハハ
  7. ワハハのタイムライン  ワハハのタイムラインはおもしろそうだということで、当時のタイムライ ンより「ワハハ」を含むポストを3つほど拾ってきて表示したのがこちら  普通におもしろい  むしろワハハフィードで良いのではないか?(いや良くない)  これと同様の処理を5回繰り返してカスタムフィードにしたのがN-Feed

    0: 洗濯物ぶっ飛んでったわ。ワハハ。拾ってこよ 1: すぎる家あったけえなぁ わたしもできたらそんな家庭に産まれるか自分で作るかしたかったけど無理っぽいなぁ ワハハ せめ て自分だけでも楽しく生きよう 2: 原稿に怒涛の赤入れがきたけど楽しくなってきちゃったな。誰と仕事するかは本当に重要だわ。ワハハ 3: エコバッグ忘れたので袋買います…… ところで現地着予定時刻ですがこれから電車~ワハハ
  8. ないへぶさんによるわかりやすい説明  カスタムフィードを閲覧しにきた人 の最新ポストを5コほど抽出  各々のポストから形態素解析で名詞 を抽出し特徴的な単語を1つ選択  カスタムフィードを閲覧しにきた人 以外の過去ポストの中からその単語

    を含むポストを新しい順に3つ検索  リロードする度に検索するので、前回 表示時点以降で新しいポストがあれば タイムラインも変化します  閲覧した人のポスト→過去ポスト1→ 過去ポスト2→過去ポスト3の順でタ イムラインを構築
  9. 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環境が全部消えたのはまた別の物語…
  10. このおはなしの出演は…  U-Feed  バズと無関係  奈良フィード  奈良を再発見 

    ランダム  自分の胸に手をあててよう考えてみ  N-Feed  なんとなくないへぶさんが練り上げた