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
Blueskyのプラグインを作ってみた
Search
Hakkadaikon
May 31, 2025
Programming
1
700
Blueskyのプラグインを作ってみた
ゴリラ.vim #36 ~ Vim x SNS ~ で登壇した内容
https://gorillavim.connpass.com/event/353161/
Hakkadaikon
May 31, 2025
Tweet
Share
More Decks by Hakkadaikon
See All by Hakkadaikon
Nostr x BTC
hakkadaikon
0
30
PHP x Nostr
hakkadaikon
0
130
Emacs x Nostr
hakkadaikon
2
330
My Introduction To Nostr
hakkadaikon
0
200
Nostr × C#
hakkadaikon
0
210
思考の速さで使うクライアント ~vimクライアント作ってみた~
hakkadaikon
0
430
ゴリラ.vim #30 ライブコーティング
hakkadaikon
0
96
vimを読もうとした話
hakkadaikon
0
300
継続的な勉強会には何が必要か語り合ってみた!
hakkadaikon
0
97
Other Decks in Programming
See All in Programming
スタートアップを支える技術戦略と組織づくり
pospome
7
8.7k
AI 時代だからこそ抑えたい「価値のある」PHP ユニットテストを書く技術 #phpconfuk / phpcon-fukuoka-2025
shogogg
1
580
競馬で学ぶ機械学習の基本と実践 / Machine Learning with Horse Racing
shoheimitani
14
13k
無秩序からの脱却 / Emergence from chaos
nrslib
1
6.3k
Building AI Agents with TypeScript #TSKaigiHokuriku
izumin5210
5
780
Reactive Thinking with Signals and the new Resource API
manfredsteyer
PRO
0
110
AIエージェントでのJava開発がはかどるMCPをAIを使って開発してみた / java mcp for jjug
kishida
4
750
Promise.tryで実現する新しいエラーハンドリング New error handling with Promise try
bicstone
3
710
Amazon Bedrock Knowledge Bases Hands-on
konny0311
0
150
イベントストーミングのはじめかた / Getting Started with Event Storming
nrslib
1
650
All(?) About Point Sets
hole
0
200
Stay Hacker 〜九州で生まれ、Perlに出会い、コミュニティで育つ〜
pyama86
2
2.3k
Featured
See All Featured
Why You Should Never Use an ORM
jnunemaker
PRO
60
9.6k
The World Runs on Bad Software
bkeepers
PRO
72
12k
Building Adaptive Systems
keathley
44
2.8k
The Invisible Side of Design
smashingmag
302
51k
A better future with KSS
kneath
239
18k
Being A Developer After 40
akosma
91
590k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
231
22k
Designing Experiences People Love
moore
142
24k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
9.8k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
118
20k
GraphQLとの向き合い方2022年版
quramy
49
14k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Transcript
Blueskyの Vimプラグインを つくってみた ゴリラ.vim #36 発火大根
と…その前に
開催決定おめでとう ぼくもちょっとスポンサーしました
自己 紹介
名前 : 発火大根 Bluesky歴 : 2年ちょい(2023/5/1開始) 本業 : SRE (転職してちょうど3ヶ
月目) 趣味 - SNSで穀潰し (主にNostr/vim-jp/…) - 卓球 (月1) - 誘われて謎解きをやったりとか
色んなとこでLTやったりオフ会やったり お世話になったりしてます
2024.09.23 Nostrasia 2024 - 海外の方に登壇いただいたり - マグロ解体ショーやったり - 配信されてるのでみてね
Blueskyでやった 私の活動紹介
2023/9/2 NGワードチェックつき 投稿専用クライアント
2024/2/21 Vim script + Indigo Blueskyクライアント PoC
最近つくったやつ
WebSocket プロトコルスタック - C言語製 - libc不使用 (Linuxの場合)
さて
目次 1.以前作ったBlueskyプラグインPoCの問題 2.今回作ったプラグイン
2024/02/21 Bluesky勉強会で こんな話をしました
VimからSNSがやれたら、 なんだかよさそうだぞ。 Vimは思考の速度で編集できる 開発<->SNSのシームレスな移行が可能 検索やスクラップがやりやすくなる!
しかし この時作ったPoCは 問題を抱えていた
①Neovim依存
NeovimのVim scriptで 書いてる →拡張性に難あり
②ツール依存
CLIツール Indigoに 依存 https://github.com/bluesky-social/indigo
もうちょっと なんかないものか…
目次 1.以前作ったBlueskyプラグインPoCの問題 2.今回作ったプラグイン
Vimmer大好き denops https://github.com/vim-denops/denops.vim - denoでぃの(での)でプラグインかける - 速い - Vim/Neovim共通のプラグインが書ける -
Vimmerの間では、オリンピックより denopsのリリースが話題になっていた ことも
Firehose API - ATProtocolの仕様のひとつ - WebSocket経由でイベントがとれる - いろんなエンドポイントがある - app.bsky.feed.post
- app.bsky.feed.repost - app.bsky.feed.like – etc…
Firehose API - Firesky - John Spurlockさん作成 - Firehose APIで出来ている
- めっちゃ速く投稿流れてく - GIGAZINEでニュースにも - ちょっとみてみよう https://firesky.tv/
Denops + Firehose
wss://bsky.network/xrpc/com.atproto.sync.subscribeRepos WebSocketサーバーが用意されてる なら、denops依存だけで つくれるのでは!? (denoは標準でWebSocketがつかえる)
websocatコマンドで ためしにsubscribe してみよう
なにこれ
RFC8949: Concise Binary Object Representation (CBOR)で エンコードされている
atproto/api Blueskyの公式リファレンス実装 を使うことにした https://github.com/bluesky-social/atproto
それなりには動いた…が
2025/5/31 便利なものをみつける
Jetstream
Jetstreamの特徴 - ATProtoのイベントを シンプルなJSON形式で配信 - CBORがデコード不要
こっちのが便利じゃん! 依存も減らせる!
こっちに乗り換えよう! (発表当日だけど)
乗り換えた&動いた!
- denopsはいいぞ - ATProtocolはいいぞ - jetstreamはいいぞ まとめ
Demo (でも)
function! s:start() abort command! BskyStart call denops#request('denops-bsky', 'start', []) endfunction
function! s:stop() abort command! BskyStop call denops#request('denops-bsky', 'stop', []) endfunction augroup denops_bsky autocmd! autocmd User DenopsPluginPost:denops-bsky call s:start() autocmd User DenopsPluginPost:denops-bsky call s:stop() augroup END BskyStart : subscribe開始 BskyStop: 停止
Thank you for your attention!