eyemono.log

ブログにつぶやき表示機能を付けた

Created At: 2025/04/27 02:16
Updated At: 2025/05/04 00:01

動機

ブログエディタを作ろうとしてやめた話と関連するのですが、このエディタ実装作業中は「ブラウザでブログを更新できる仕組みを作れば更新頻度上げられそ~~」という気持ちがありました。結局実装がめんどくさくて却って更新頻度が落ちていたわけですが。

更新ハードルの低いコンテンツって結局Twitterみたいな短文SNSになるわけで、じゃあもうブログに短文SNSを載せようよという気分になり、Nostr表示ページを実装しました。

Monologue
eyemono.moeのひとりごと
Monologue favicon https://log.eyemono.moe/monologue
Monologue

独り言なのでmonologueです。“eyemono.blog”にせず”eyemono.log”にしていたのはこれを考えていたからです。

仕組み

Nostrの読取専用クライアントを実装した形になります。

Nostrとは

Nostrは分散型のSNSプロトコルです。

  • Websocketベースの通信
  • コミュニティによって管理されており特定団体に依存していない
    • Nostrにイーロンマスクは居ない
  • 公開鍵暗号を使用したアカウントシステム
    • 「メールアドレスで登録」みたいな概念が無い

…といった他には無い面白い特徴を持ったプロトコルです。

より詳細なNostrの思想・仕様・利用についてはNostrの面白さをエンジニア目線で解説してみるを参照してください。

Nostr の面白さをエンジニア目線で解説してみる
Nostr の面白さをエンジニア目線で解説してみる favicon https://zenn.dev/mattn/articles/cf43423178d65c
Nostr の面白さをエンジニア目線で解説してみる

本ブログでの実装

で、僕はこのNostrのクライアントを自作しています。Streetsという名前です。

NostrのクライアントをSolidJSで自作してみた
🎄この記事はtraP Advent Calendar 2024 4日目の記事であり、Nostr Advent Calendar 2024 4日目の記事でもあり、SolidJS Advent Calendar 2024 4日目の記事でもあります。  前回のtraP Advent Calendarの記事:AtCoder環境を持ち運ぶ 前回のNostr Advent Calendarの記事:nostterに画像最適化機能つけたよ(サーバー編) 前回のSolidJS Advent Calendarの記事:solidjsとurqlで実装 もぜひご覧ください こんにちは、@d_etteiu8383です。最近は@eyemono.moeとも名乗ってます。本記事では、SolidJSを使用して分散SNS Nostrのクライアントを自作した話をします。 実際に出来たもの:https://streets.eyemono.moe StreetsColumn based Nostr clientStreetsGitHub - eyemono-moe/streets:
NostrのクライアントをSolidJSで自作してみた favicon https://trap.jp/post/2414/
NostrのクライアントをSolidJSで自作してみた
Streets
Column based Nostr client
Streets favicon https://streets.eyemono.moe
Streets

このStreetsのコードを流用して、ブログにNostrの投稿を表示するページを作りました。Nostrはデータの読取をするだけならアカウントやAPIキーは不要なため、皆さんはそれがNostrであるということを意識せずに僕の投稿を見ることができます。

monologueの表示例

現在はまだ実装途中で、コンテンツのパースなどしていないため埋め込み画像や引用投稿が表示されていません。この辺りはおいおい実装していく予定です。

コア部分の実装にはStreetsと同様にrx-nostrを使用させていただいています。Nostrのめんどくさい部分を綺麗に隠蔽しており、かつReactiveXの資産を活かせてめちゃくちゃ便利です。

GitHub - penpenpng/rx-nostr: A library based on RxJS, which allows Nostr applications to easily communicate with relays.
A library based on RxJS, which allows Nostr applications to easily communicate with relays. - penpenpng/rx-nostr
GitHub - penpenpng/rx-nostr: A library based on RxJS, which allows Nostr applications to easily communicate with relays. favicon https://github.com/penpenpng/rx-nostr
GitHub - penpenpng/rx-nostr: A library based on RxJS, which allows Nostr applications to easily communicate with relays.

本ブログでの実装部分は https://github.com/eyemono-moe/log/blob/main/src/components/solid/Monologue.tsx 辺りにあります。Streetsではキャッシュをしようとしたりして無駄に複雑になっちゃっているんですが、今回は僕の投稿さえ見れればいいので非常にシンプルな実装になりました。

SolidJSではfrom utilityを使うことで、RxJSでのobservablesを簡単にsignalに変換することができるため、表示部分もシンプルです。

過去投稿のページネーションとかも読めばわかるぐらいのシンプルな実装になっています:https://github.com/eyemono-moe/log/blob/main/src/utils/nostr/createInfiniteEvent.ts


ということで今後はNostrでの僕の投稿も見てやってください。Twitterがいつ消えるかわからない今、Nostrは面白い選択肢だと思います。