#
520
2025/10/19
今日のトレンド

P2PとRustのsqlx設計

皆さん、おはようございます!マイクです。今日は2025年10月20日、日曜日ですね。今日の「zenncast」では、Zennで今トレンドの記事をいくつかご紹介していきますよ。

それでは、早速今日の内容に移りましょう!

今日紹介する記事は全部で5本あります。まず最初の記事からいってみましょう!

サーバー代0円! P2Pと無料サービスだけでリアルタイム対戦オセロを作った話

この記事では、ブラウザで動作するリアルタイム対戦オセロゲームを、サーバーコストをかけずに開発した方法を紹介しています。主要な技術としてWebRTC(PeerJS)を利用し、シグナリングサーバーをRender、フロントエンドをGitHub Pagesにデプロイすることで、完全無料のゲームを実現しました。

このゲームは、サーバーレスの対戦を可能にし、Webブラウザさえあればインストール不要でプレイ可能、友達に生成されたURLを送るだけで対戦が開始できます。システムは、フロントエンドとシグナリングサーバーの2つから構成され、シグナリングサーバーがIPアドレスなどの初期接続情報を交換することでP2P接続を確立します。

WebRTCはブラウザ間で直接データをやり取りするための技術で、P2P通信を実現しますが、相手のIPアドレスを知るためにシグナリングサーバーが必要です。このゲームでは、Renderを利用したシグナリングサーバーを用意し、P2P接続確立後は直接データのやり取りを行います。

PeerJSを利用することで、WebRTCの複雑なAPIを簡略化でき、直感的にP2P通信を実装可能です。具体的な実装例も紹介されており、フロントエンドとサーバー側のコードは非常にシンプルです。

プレイ方法は、まずAさんがゲームページを開いて固有のIDを取得。その後、招待URLをBさんに送信し、BさんがそのURLを開くことで接続が確立され、対戦が開始されます。

著者は、P2P技術を活用することでサーバーコストをかけずにゲームを作成できたことに満足しており、今後はこの仕組みを基に、より複雑で戦略的なオリジナルゲームの開発に挑戦したいと考えています。この記事がWebRTCやP2P技術への興味を引くきっかけになれば幸いです。

。.

続いて、次の記事です!

Rustのsqlxを使ったリポジトリ層の設計パターン

Rustのsqlxは、非同期処理に対応したデータベースライブラリであり、近年人気を集めています。本記事では、sqlxを用いたリポジトリ層の設計パターンについて考察します。使用するバージョンはsqlx 0.8で、PostgreSQLを例にとります。

1つ目のパターンは、リポジトリ構造体にコネクションプール(`PgPool`)を埋め込む方法です。このアプローチはシンプルですが、トランザクションに対応できないという致命的な欠点があります。

2つ目のパターンは、リポジトリメソッドが引数として`impl Executor`を受け取るものです。この方法ではトランザクションに対応できますが、Executorを毎回渡す必要があり、データベースとリポジトリの関連性が欠落するため、管理が難しくなります。

3つ目のパターンでは、newtypeパターンを用いて、リポジトリをトレイトとして実装します。これにより、データベースの特定が型ベースで行えるようになり、トランザクションにも対応できます。この方法は記述量がやや多いものの、将来的なスケーラビリティを考えると優れた選択肢です。

結論として、newtypeパターンとトレイトの組み合わせが多くのケースで適していると述べ、特に将来の拡張を見越した設計が推奨されます。記事がRustを用いたサーバーサイド開発の助けになることを願っています。

。.

さて、続いて3つ目の記事です!

いきなりログイン画面を見せて11%のユーザーを失ったわけ

アプリ「KORENANI」を開発中に、初回起動時にいきなりログイン画面を表示したことで約11%のユーザーが離脱した事例について分析しています。ユーザーがアカウントを作成せずにログインを試みて失敗した理由は、混乱を招くデザインが主な要因です。具体的には、新規登録への動線が目立たず、ユーザーの行動を誤解していたことが挙げられます。

改善策として、Welcome画面を追加し、新規ユーザーと既存ユーザーの選択肢を明確に分けて提示することにしました。これにより、アプリの価値を伝えつつ、新規ユーザーにとっての体験をよりシンプルにすることを目指しています。改善後の効果測定は今後行い、ログイン試行からの失敗率や新規登録率の変化を確認する予定です。

この経験から、ユーザビリティ向上のためには認知度やユーザー行動を理解することが重要であり、データに基づく判断が必要だと学びました。特に、新規と既存ユーザーの導線の違いやビジュアルヒエラルキーの正しい設計が大切です。最終的には、ユーザーの体験を向上させるための継続的な改善が必要であることを強調しています。

。.

続いて4つ目の記事です!

iOS ファーストな CMS をショートカットで構築する

この記事では、iPhoneから簡単にWebサイトを更新するために、ショートカットを利用してCMSツール群を構築する方法について紹介しています。具体的には、日記サイトを想定し、GitHub上の`entries.json`や`/images`ディレクトリを操作する機能を持つCMSを作成しました。CMSの主要機能には投稿、編集、削除があり、これらはすべてショートカットを通じて実現されています。

技術的には、GitHub REST APIを使用し、最小限のCRUD(作成、取得、更新、削除)操作を行います。具体的には、`PUT`メソッドで新しいコンテンツを作成し、`GET`メソッドで既存のコンテンツを取得、`PUT`メソッドで更新、そして`DELETE`メソッドで削除します。各操作には必要なヘッダ情報とリクエストボディを設定する必要があります。

さらに、共有シートを活用したインタラクティブなショートカットの作成方法も紹介されており、写真アプリからの画像アップロードや、Webページ情報の動的取得が可能です。全体として、個人サイトの運用には非常に便利なツールであると評価されていますが、アクセストークンをショートカット内に直書きする必要があるため、多人数での運用には注意が必要です。個人の小規模なサイト運用に最適な方法として、ぜひ試してみることが推奨されています。

。.

最後に5つ目の記事です!

serdeに入門しよう!

serdeはRust向けのシリアライゼーションライブラリで、シリアライズ(データをフォーマットに変換)とデシリアライズ(フォーマットからデータへ変換)を行うための機能を提供します。具体的なフォーマット変換はserde_jsonやtomlなどのクレートが担当します。本記事では、serde_jsonを使ったJSONへのシリアライズを中心に解説します。

まず、依存関係をCargo.tomlに追加する必要があります。`serde`のderive機能を有効にし、`serde_json`を導入します。deriveマクロを利用することで、ボイラープレートコードの記述を減少させることができます。

serdeの基本的な使い方として、`#[derive(Serialize, Deserialize)]`を使って構造体を定義し、簡単にJSONにシリアライズ・デシリアライズが可能です。項目名の変更や命名規則の統一も簡単に行うことができ、例えばスネークケースからキャメルケースへの変更が可能です。

また、`Option`型を使うことでnullableな値を扱ったり、デフォルト値を設定することができます。特定のフィールドをシリアライズまたはデシリアライズからスキップすることも可能で、条件付きでスキップする機能も提供されています。さらに、Rustのenum機能を利用して複雑なデータ構造を表現することもでき、タグを使ってシリアライズの形式を変更することもできます。

最後に、serdeはJSON以外にもTOMLなど様々なフォーマットをサポートしており、シリアライズのメソッド名は使用するクレートによって異なるため、各クレートのドキュメントを参照することが重要です。Rustを使用するエンジニアにとって、serdeは非常に便利なツールとなるでしょう。

。.

さて、今日はここまでです!今日お伝えした記事を駆け足でおさらいしますね。

1つ目は、サーバー代0円でリアルタイム対戦オセロを作る方法。
2つ目は、Rustのsqlxを使ったリポジトリ層の設計パターンについて。
3つ目は、初回起動時にログイン画面を見せたことでユーザーが離脱した事例。
4つ目は、iOSから簡単にWebサイトを更新するためのCMS構築法。
5つ目は、Rust向けのシリアライゼーションライブラリであるserdeの入門。

次回も楽しい内容をご用意してお待ちしていますので、ぜひお楽しみに!詳しい内容はショーノートに書いてありますので、チェックしてくださいね。また、番組の感想も大募集中です!それでは、また次回お会いしましょう!お相手はマイクでした!さようなら!

Related episodes

内容の近いエピソードを推薦しています