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 のフィードを作ろう / 20250620-niigata-5min-tech
Search
girigiribauer
June 20, 2025
Programming
0
44
Bluesky のフィードを作ろう / 20250620-niigata-5min-tech
2025/06/20 Niigata5分Tech #20 で話した資料です
girigiribauer
June 20, 2025
Tweet
Share
More Decks by girigiribauer
See All by girigiribauer
なんとなく使っていたクリップボードの不思議 / 20250926-niigata-5min-tech
girigiribauer
0
28
タスクにもストック型・フロー型があるということに Todoist を使い始めて気づいた話 / 20250725-niigata-5min-tech
girigiribauer
0
55
『Bluesky 公式アカウント移行まとめ』のアップデートをした話 / 20241018-niigata-5min-tech
girigiribauer
0
100
コンテナクエリはコンテナ技術の話ではなく CSS の話です / 20240920-niigata-5min-tech
girigiribauer
1
86
公共交通のオープンデータ事始め / 20240823-niigata-5min-tech
girigiribauer
0
100
私と Vim / 20240426-niigata-5min-tech
girigiribauer
2
190
がんばらない勉強会の続け方 / 20240426-niigata-5min-tech-omake
girigiribauer
1
570
初めての chrome extension で Plasmo 使ってみた / 20240329-niigata-5min-tech
girigiribauer
0
130
時間配分を常に意識するために、通知する仕組みを作った話 / 20220527-peacock-meets-up-01
girigiribauer
0
250
Other Decks in Programming
See All in Programming
ユーザーも開発者も悩ませない TV アプリ開発 ~Compose の内部実装から学ぶフォーカス制御~
taked137
0
220
CSC305 Lecture 01
javiergs
PRO
1
380
Swiftビルド弾丸ツアー - Swift Buildが作る新しいエコシステム
giginet
PRO
0
1.3k
LLMとPlaywright/reg-suitを活用した jQueryリファクタリングの実際
kinocoboy2
4
580
ててべんす独演会〜Flowの全てを語ります〜
tbsten
1
210
Navigation 2 を 3 に移行する(予定)ためにやったこと
yokomii
0
450
SpecKitでどこまでできる? コストはどれくらい?
leveragestech
0
130
どの様にAIエージェントと 協業すべきだったのか?
takefumiyoshii
0
130
高度なUI/UXこそHotwireで作ろう Kaigi on Rails 2025
naofumi
3
1.1k
Web Components で実現する Hotwire とフロントエンドフレームワークの橋渡し / Bridging with Web Components
da1chi
2
570
気づいて!アプリからのSOS 〜App Store Connect APIで始めるパフォーマンス健康診断〜
waka12
0
200
Astroの使用感とディレクトリ設計についての考察
saku0109
0
130
Featured
See All Featured
Documentation Writing (for coders)
carmenintech
75
5k
Gamification - CAS2011
davidbonilla
81
5.4k
Facilitating Awesome Meetings
lara
56
6.5k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
51k
The Straight Up "How To Draw Better" Workshop
denniskardys
237
140k
Automating Front-end Workflow
addyosmani
1371
200k
Building Flexible Design Systems
yeseniaperezcruz
329
39k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.1k
RailsConf 2023
tenderlove
30
1.2k
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
30
9.7k
Thoughts on Productivity
jonyablonski
70
4.8k
Transcript
/JJHBUB5FDI #MVFTLZͷϑΟʔυΛ࡞Ζ͏ HJSJHJSJCBVFS
ࣗݾհ w ωοτ্ͰHJSJHJSJCBVFSͱ͍͏ϋϯυϧωʔϜͰͬͯ·͢ w چ໊ݹຽͰ͢ 2
#MVFTLZ͍͍ͧ w ϒϧʔεΧΠ͍͍͓ͧ͡͞ΜʮϒϧʔεΧΠ͍͍ͧʯ 3
#MVFTLZͷϑΟʔυͱ w ཁ͢ΔʹࣗͳΓͷϩδοΫͰฒͨɺߘͷλΠϜϥΠϯΛ࡞ΕΔ w ΧελϜϑΟʔυΛੜ͢ΔαʔόʔαʔϏεͷ͜ͱΛ ϑΟʔυδΣωϨʔλʔͱݺͿ w ࠷খݶͷϑΟʔυΛ࡞ͬͯɺϑΟʔυΛཧղ͠Α͏ʂ 4
ϑΟʔυʹؔ͢Δոใ w ոใͱ͍͏ͷɺܾͯ͠σΟεΔҙਤͰ͋Γ·ͤΜ w ༗ࢤͷํʑ͕։ൃͨ͠ɺ(6*Ͱϙνϙν͢Δ͚ͩͰϑΟʔυ͕࡞ΕΔαʔϏ ε͕৭ʑ͋Δʢ͢Β͍͠ʣ w ྫಛఆΩʔϫʔυ܈Λઃఆͯ͠ɺͦΕΒΛؚΉϑΟʔυΛ࡞Δ w ཁ͢ΔʹϑΟʔυδΣωϨʔλʔͷδΣωϨʔλʔ
w άάΔͱ͜ͷลͷ(6*ͷૢ࡞ͷํΈ͍ͨͳͷ͕ͨ͘͞ΜҾ͔͔ͬͬͯ͘Δ w ͕ͩཉ͍͠ใͰͳ͍ɾɾɾ 5
ϑΟʔυʹؔ͢Δެࣜใ w ։ൃऀެࣜυΩϡϝϯτΛݟΑ͏ w IUUQTEPDTCTLZBQQEPDTTUBSUFSUFNQMBUFTDVTUPNGFFET w ελʔλʔΩοτ͕Ұ൪Θ͔Γ͍͢ w IUUQTHJUIVCDPNCMVFTLZTPDJBMGFFEHFOFSBUPS w
ͱ͍͑ͬͱ͗མͱͤΔͷͰɺࢀߟʹͭͭࣗ͠લͰ࡞Δ w ඞཁʹԠͯ͡"51SPUPDPMʢΞοτϓϩτίϧʣΛݟΔ w IUUQTHJUIVCDPNCMVFTLZTPDJBMBUQSPUP w ྫϨίʔυΛՃ͢Δ"1*ͰɺʮͲ͜ʹʯʮԿΛʯ͕ͬͪ͜ʹॻ͍ͯ ͋Δʢਖ਼ͪΐͬͱΘ͔ΓͮΒ͍ʣ 6
࠷খݶͷ#MVFTLZϑΟʔυ w αʔόʔΛ༻ҙ͢Δ w దͳ+40/Λฦ͢ΤϯυϙΠϯτΛؚΉ8FCαʔϏεΛ༻ҙ͢Δ w खݩͰ"1*Λୟ͍ͯϑΟʔυΛొ͢Δ 7 \؆୯ʂ/
αʔόʔΛ༻ҙ͢Δ w ݻఆϙετ͚ͩͰ͍͍ͳΒແྉͷTUBUJDTJUFͰେৎ w σʔλϕʔεඞਢͰͳ͍ɺϑΟʔυͷϩδοΫ࣍ୈ 8
దͳ+40/Λฦ͢ΤϯυϙΠϯτΛؚΉ8FCαʔϏεΛ༻ҙ͢Δ w XFMMLOPXOEJEKTPO w ࢄ*% %*% %FDFOUSBMJ[FE*EFOUJGJFS Λ׆༻ͯ͠ɺ8$͕ඪ४Խͯ͠ ͍Δ%*%%PDVNFOUΛฦ͢
w #MVFTLZଆ͔Β͍߹Θ͕ͤདྷΔ 9
దͳ+40/Λฦ͢ΤϯυϙΠϯτΛؚΉ8FCαʔϏεΛ༻ҙ͢Δ 10 const app = new Hono(); app.get("/.well-known/did.json", (c)
=> { return c.json({ "@context": ["https://www.w3.org/ns/did/v1"], id: "did:web:feeds.bsky.girigiribauer.com", service: [ { id: "#bsky_fg", type: "BskyFeedGenerator", serviceEndpoint: "https://feeds.bsky.girigiribauer.com", }, ], }); });
దͳ+40/Λฦ͢ΤϯυϙΠϯτΛؚΉ8FCαʔϏεΛ༻ҙ͢Δ w YSQDBQQCTLZGFFEHFU'FFE4LFMFUPO w IUUQTEPDTCTLZBQQEPDTBQJBQQCTLZGFFEHFUGFFETLFMFUPO w ͜ͷϨεϙϯεʹԊͬͯฦͯ͋͛͠Δ͚ͩ w ϦΫΤετʹGFFEύϥϝʔλ͕͋ΓɺෳϑΟʔυͷͲΕ͔ΒͷΞΫηε
͔ผͰ͖Δ w ͜ͷ"1*#MVFTLZଆ͔Βୟ͔ΕΔͷ 11
12
దͳ+40/Λฦ͢ΤϯυϙΠϯτΛؚΉ8FCαʔϏεΛ༻ҙ͢Δ 13 const app = new Hono(); app.get("/xrpc/app.bsky.feed.getFeedSkeleton", async
(c) => { return c.json({ feed: [ { post: "at://did:plc:tsvcmd72oxp47wtixs4qllyi/app.bsky.feed.post/ 3ldcooerekc2y", }, ], }) });
खݩͰ"1*Λୟ͍ͯϑΟʔυΛొ͢Δ w ࠓ#MVFTLZଆͷ"1*Λୟ͘ w ελʔλʔΩοτͷTDSJQUTQVCMJTI'FFE(FOUTࢀর w Ճ͢ΔํͷใQVU3FDPSE w IUUQTEPDTCTLZBQQEPDTBQJDPNBUQSPUPSFQPQVUSFDPSE
w Ճ͞ΕΔํͷใBQQCTLZGFFEHFOFSBUPS w IUUQTHJUIVCDPNCMVFTLZTPDJBMBUQSPUPCMPCNBJOMFYJDPOTBQQ CTLZGFFEHFOFSBUPSKTPO 14
खݩͰ"1*Λୟ͍ͯϑΟʔυΛొ͢Δ 15 const agent = new AtpAgent({ service: "https://bsky.social"
}); await agent.login({ identi fi er: handle, password }); // தུ const image = await fs.readFile(path); const blobResponse = await agent.com.atproto.repo.uploadBlob(image, { encoding: "image/png", }); // தུ const result = await agent.com.atproto.repo.putRecord({ repo: agent.session?.did ?? "", collection: "app.bsky.feed.generator", rkey: "helloworld", record: { did: "did:web:feeds.bsky.girigiribauer.com", displayName: "Helloworld feed", description: "Hello! Hello!", avatar, // BlobRef createdAt: new Date().toISOString(), }, });
/FYUTUFQ w ϑΟʔυʹΞΫηε͖ͯͨ͠ਓͷEJEΛΔʹ"VUIPSJ[BUJPOϔομʔ Λղੳͯ͠+85͔ΒऔΓग़͢ w IUUQTHJUIVCDPNCMVFTLZTPDJBMGFFEHFOFSBUPSCMPCNBJOTSD BVUIUT- w &YQSFTTKTґଘʹͳͬͯΔ෦͕͋ΔͷͰؾΛ͚ͭͯͶ w
໘നϑΟʔυΛ࡞ͬͯΈΔ w ϑΟʔυҎ֎ʹ৭ʑΤϯδχΞϦϯάͰ͖Δͧ 16
·ͱΊ w #MVFTLZͷϑΟʔυɺࣗͰΧελϚΠζͨ͠λΠϜϥΠϯΛఏڙͰ͖Δ Έ w #MVFTLZͷ"1*ɺ͔ͬͪ͜Βୟ͘ͷɺ͜͏͔Βୟ͔ΕΔͷͷ྆ํ ͕ࠞͬͯ͟ॻ͍ͯ͋Δ w Φʔϓϯͳϓϩτίϧͱ"1*ΛͬͯɺࣗͳΓͷใۭؒΛ࡞Ζ͏ 17
w ϒϧʔεΧΠ͍͍͓ͧ͡͞ΜʮϒϧʔεΧΠ͍͍ͧʯ 18 https://internet.watch.impress.co.jp/docs/yajiuma/2024244.html
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ 19