トップコート:Rust をフルスタックで開発するための完全なフレームワーク

2026/07/18 5:41

トップコート:Rust をフルスタックで開発するための完全なフレームワーク

RSS: https://news.ycombinator.com/rss

要約

日本語翻訳:

Topcoat は、シンプルさと生産性を重視したモジュール型でバッテリー込みの Rust フルスタックフレームワークです。現在初期実験段階にあり、Node.js や複雑なビルドステップを必要としません。資産バンドリングにはコンパイルされた Rust バイナリを使用し、進化に伴う不具合(breaking changes)が発生する可能性があります。

その核心的な革新は、サーバーサイドレンダリングであり、Rust サーバー側で型チェック済みの

$(...)
式を瞬時にブラウザ側の JavaScript に変換することで、 별도의 API レイヤを不要にします。このアプローチは、シグナルによる効率的なインタラクティビティ、非同期コンポーネント内での直接データベース照会、
#[shard]
マークで特定された更新を実現し、レイテンシーを引き起こす往復通信を排除します。フレームワークは
view!
マクロによる強力な HTML テンプレート、Rust の制御フローに馴染みのある機能、Web フォント、アイコン(Iconify を含む)、Fontsource、および部分的な HTML スワップのための htmx などのユーティリティをサポートしています。

主な特徴には、ディレクトリ構造からルートツリーを推論するオプションの自動ルーティング、機能フラグで有効化する組み込み Tailwind CSS サポート、ファイルを積極的にキャッシュする資産パイプラインが含まれます。

Cx
コンテキスト、メモ化 (
#[memoize]
)、暗号化されたセッション/クッキー、そして複雑なミドルウェアではなく単なる関数としてモデル化した認証などのリクエスト処理機能により、样板を削減します。含まれる
#[component]
,
attributes!
,
class!
などのマクロもまた、コンポーネントの作成とスタイリングをさらに簡素化します。

本文

Topcoat: Rust 向けフルスタックフレームワーク

Topcoat は、モジュール化され機能完備の Rust フレームワーク です。シンプルさと生産性を最優先しており、フルスタックアプリケーション開発に最適です。

注意: 本プロジェクトは初期段階であり実験的であるため、破壊的な変更が発生する可能性があります。 新しいプロジェクトのセットアップについては「Getting started」ガイドをご参照ください。


基本構造とサンプルコード

Rust を使用してサーバーサイドでレンダリングし、クライアント側でもインタラクティブな挙動を実現するサンプルです。

use topcoat::{
    Result,
    router::{Router, RouterBuilderDiscoverExt, page},
    view::{component, view},
};

#[tokio::main]
async fn main() {
    // ルートを自動的に発見してビルド
    topcoat::start(Router::builder().discover().build()).await.unwrap();
}

// ルート "/" のページ定義
#[page("/")]
async fn home() -> Result {
    view! {
        <!DOCTYPE html>
        <html>
            <body>
                // コンポーネントの呼び出し
                hello(name: "World")
            </body>
        </html>
    }
}

// サーバーサイドでレンダリングされ、JS にも翻訳されるコンポーネント
#[component]
async fn hello(name: &str) -> Result {
    view! { <h1>"Hello, " (name) "!"</h1> }
}

Topcoat の特徴

🚀 余計なコードなしでクライアント側リアクティビティを実現

Topcoat はすべてのマークアップをサーバーサイドでレンダリングします。これにより、以下の利点があります。

  • 非同期処理と DB アクセス: コンポーネント内で直接データベースに問い合わせたり、非同期処理を行えます。
  • ボイラープレートの排除: 従来の API レイヤーを作るために必要な余分な記述が不要です。
  • サーバーへの往復通信の回避:
    $(...)
    表現は型チェックされた Rust コードで、Topcoat はこれをサーバーサイドで評価し、同時に JavaScript に翻訳してブラウザ側で即時再実行します。
  • ビルドステップの簡素化: Wasm バンドルやクライアント側のビルドステップが不要です。
view! {
    // 初期状態:false
    signal open = false;

    // ブラウザ内で完結;サーバーとの往复通信は発生しない。
    <button @click=$(|_e| open.set(!open.get()))>"What is Topcoat?"</button>
    // クリックした時のみ表示(クライアントサイドでトグル)
    <p :hidden=$(!open.get())>"A fullstack Rust framework."</p>
}

シャード(Shard)によるサーバー側更新が必要な場合

最新の検索結果のように、サーバー側の更新が必須な場合は、コンポーネントを

#[shard]
アトリビュートでマークします。

  • 変更を検知するとサーバー側で再レンダリングを実行し、新しい HTML をそのまま置換します。
  • $(...)
    引数の値が変化した際に自動的にトリガーされます。
#[component]
async fn search() -> Result {
    view! {
        signal query = String::new();

        // ユーザー入力を検知し、シグナルを更新
        <input @input=$(|e: Event| query.set(e.target.value))>

        // 入力値の変化に応じてサーバー側で再レンダリング
        search_results(query: $(query.get()))
    }
}

// サーバーサイドロジックを持つシャードコンポーネント
#[shard]
async fn search_results(cx: &Cx, query: String) -> Result {
    view! {
        <ul>
            // データベース問い合わせなど、ご自身で実装するサーバーサイドロジック:
            for product in search_products(cx, &query).await? {
                <li>(product.name)</li>
            }
        </ul>
    }
}

🎨 強力で見慣れた HTML テンプレート

view!
マクロは、HTML と Rust の両方の精神を尊重しています。テンプレート内に Rust の制御構造を自由に使用できます。

  • ループ処理 (
    for
    )
  • 条件分岐 (
    if
    )
  • 動的な属性やテキストの埋め込み
view! {
    <nav>
        // アイテムリストのループ
        for item in nav_items {
            <a
                href=(item.url)
                // 現在のパスの場合のみクラスを付与
                if item.url == current_path {
                    aria-current="page"
                    class="active"
                }
            >
                (item.label)
            </a>
        }
    </nav>
}

コード整形(Formatting)

プロジェクト全体でマクロの形式を整えるには、

**topcoat fmt**
CLI コマンドを使用します。

🗂️ モジュールベースのルーティング

ビルドステップを伴わずに、アプリのモジュール構造からルートツリーを自動的に推測するオプションを提供します。

src/
|-- app.rs              -> /            (ルート用の <html> レイアウトもここ)
`-- app/
    |-- about.rs        -> /about
    |-- _marketing.rs                  (レイアウト、URL セグメントなし)
    |-- _marketing/
        `-- pricing.rs  -> /pricing
    |-- posts.rs        -> /posts
    |-- posts/
        `-- id.rs       -> /posts/{post_id}
    `-- api/
        `-- health.rs   -> GET /api/health

📦 資産バンドリング(Asset Bundling)

バンドラーはコンパイルされたバイナリ内の

asset!
呼び出しをスキャンし、すべてのファイルをローカルの資産ディレクトリにコピー(またはダウンロード)します。これにより、攻撃的なブラウザキャッシュ戦略を用いて効率的に配信できます。

const FERRIS: Asset = asset!("./ferris.png");

view! { <img src=(FERRIS)> }
  • Web フォント:
    Fontsource
    (Google Fonts) との統合をサポート。
  • アイコン:
    Iconify
    アイコンセットとの簡単な統合をサポート。

🎨 Tailwind CSS のネイティブサポート

プロジェクトに Tailwind CSS を統合するには、

tailwind
フィーチャーを有効にします。Node.js の依存関係が不要です。

view! { 
    // スタイルシートを自動バンドルして読み込む
    <link rel="stylesheet" href=(topcoat::tailwind::stylesheet!())> 
}

Topcoat を学び始める:学習リソースと機能一覧

まずは以下のステップから始めましょう。

  1. [Getting started]: 新しいプロジェクト作成、CLI インストール、開発サーバー実行。
  2. ソースコードの形式化:
    topcoat fmt
    でマクロを含む形式を整える。

主要な機能カテゴリ

🛠️ レンダリング系

  • view!
    マクロ
    : テンプレート構文、制御構造、条件付き属性などの定義。
  • #[component]
    マクロ
    : 子コンテンツを持つ非同期関数をコンポーネントとして定義。
  • attributes!
    マクロ
    : 再利用可能なランタイム属性断片の作成。
  • class!
    マクロ
    : 静的・条件的なエントリからスペース区切りのクラスリストを生成。

🚦 ルーティング系

  • Router: ページ、レイアウト、API ルート(手動定義と自動検出)。
  • モジュールベースのルーティング: モジュールツリーからルートテーブルを自動的に導出。

🔗 リクエストとの連携

  • リクエストコンテキスト (
    Cx
    )
    : ページ、レイアウト、コンポーネントが読み取る値へのアクセス。
  • アプリコンテキスト: タイプにキー付けし、長期間存続する値をリクエスト間で共有。
  • メモ化(Memoization):
    #[memoize]
    を用いてリクエスト単位のキャッシュとファノートデデュプリケーションを実現。
  • 関数・ミドルウェアではないモデル: 認証などのリクエストスコープの懸念事象をモデル化する推奨手法。
  • クッキー: サイン付け、暗号化、プレフィックス付きを含むクッキー・ジャルの読み書き。
  • セッション: ブラウザ由来ストレージを用いたセッション認証(ライフサイクル、スライド式有効期限、トークンローテーション)。

📂 資産システム

  • Assets: Rust で資産を宣言し、コンテンツハッシュ付き URL で配信。
  • Fonts: Web フォントをバンドリングして配信。
  • Icons: Iconify アイコンセットのダウンロードまたは独自の宣言。

⚡ クライアント側リアクティビティ

  • ランタイム: シグナル、
    $(...)
    表現、
    @
    イベントハンドラ、
    :bind
    属性。
  • Expressions: Rust/JavaScript の双方向表达式言語とその語彙。
  • Procedures: ブラウザから呼び出せる非同期サーバー関数。
  • Shards: 引数が変更された際にサーバー側で再レンダリングされるコンポーネント。

🔌 サードパーティ統合

  • Tailwind: Node を使わず、資産パイプラインに組み込まれた Tailwind CSS。
  • htmx: リクエスト/レスポンスヘッダーヘルパーを用いて、サーバー側から部分的な HTML スワップを駆動。

同じ日のほかのニュース

一覧に戻る →

2026/07/18 7:26

カイザー看護師が語る、AI や職場監視が看護業務とケアの質を悪化させていることへの懸念

## Japanese Translation: カイザーパーマネンテの看護師たちは、AI 駆動による職場の監視が患者の安全を危険にさらすと非難し、通話時間の短縮や同情に基づいたケアの抑制を強いるとしている。カイザーはこれらのツールをウェルビーイングの促進に資すると擁護するが、批評家たちは過度な監視が士気を損ない誤りのリスクを高めるとの見解を示している。調査により、現在のおよび元看護師 7 名が、通話が 15 分を超えた場合に批判を受けたりパフォーマンス評価が下されるなどしたと報告されたことが明らかになっている。ソフトウェアはトーン分析、非生産性の予測、共感度の評価、および月次スコアへの通話指標の統合を実行する。特筆すべきは、これらの短時間に関連する患者からの苦情は一切記録されていないことである。この controvers は抗議運動を刺激し、3 月に 1 日間のストライキや昨年の秋のパイケティングを引き起こした。これはカリフォルニア看護師協会による新契約(コールセンターの看護師を含む約 2.5 万人のスタッフに適用)の交渉と一致しており、その中で AI が中心的役割を果たすと予想されている。カイザーは、すべてのコンタクトセンターツールには人間の審査と監督が含まれているとし、セキュリティ上の理由から詳細は非公開としている。2024 年の公記録請求により、通話時間に関連する患者からの苦情は一切見つかっていないが、看護師たちは安全上のリスクが依然として現実であると主張している。批評家たちは、厳格な時間制限の実施がバーンアウトや士気の低下、高リスク環境におけるエラーを招く可能性を警告している。カリフォルニア州では、AI を規制し、自動化された推奨事項を上回る従業員に対する報復を防ぎ、感情的状態の AI 予測を禁止する法案(元々 SB 7 の後継である上院法案 947)などの検討が行われている。ゴブナーニュースームは以前に同様の措置(SB 7)を拒否した。カイザーパーマネンテは現在、カリフォルニア州で最大の民間雇用主であり、カリフォルニア人 900 万人以上とその他の地域に住む 300 万人以上の人のサービスを提供している。

2026/07/17 18:42

AWS:誤った見込見積もりデータの件、被害額 17 億ドル

## Japanese Translation: 7 月 16 日 Pacific Daylight Time 午後 7 時 38 分、AWS は重大なソフトウェアの誤作動により、請求見積もりが数十億ドル〜数兆ドルという異常値を表示し始めました。この問題の原因は、価格計算が「バイト」単位ではなく「ギガバイト」単位で行われていた単位の不一致によるものです。この影響を受けたアカウントには、支出ゼロのアカウントも含め、推計課金額として 4 億 3000 万ドルが表示された例もあります。当初これらの警告はフィッシング攻撃に見えましたが、AWS はそれが本物の表示誤りであることを確認しており、実際の顧客請求に変更はなく、即時対応が必要な事態でもないとしています。この問題は請求計算サブシステムの更新失敗後に発覚し、単純なロールバックでは不十分で、適切な単位価格を用いて履歴の計量データを再計算する必要があったためです。エンジニアたちは内部計算エラーを修正するため、数時間以内に完全に解決できると予想しています。過去の重大な AWS 障害(2011 年の「フィールド内のコンマ」バグなど)に類似したこの出来事は、より厳格なエンドツーエンドの統合テスト(実際のお金での課金検証や XTS などのテスト通貨を使用するテストを含む)の実施、ならびに将来のバグや誤設定による爆発的なコスト増を防ぐための堅牢な支出上限の設定への要請を再び喚起しています。

2026/07/18 1:57

HN を感謝し、人生の職に導いてくれた 15 年間のお陰様です。

## Japanese Translation: Recurse Center は明日、設立から 15 周年を迎えます。これは YC Summer 2010 の発案「OkCupid for jobs」から誕生したもので、当初は失敗しましたが、組織はその後、他の不十分なコンセプトを数年間検討した後、自己主導型のプログラミングリトリートとして開始されました。2 つの小規模なバッチを実施した後、Hacker News に掲載され、素晴らしい反応を受けました。口コミとともに HN は応募者の 2 つ目の最大sources(第二の主要な申請者獲得源)となり、個人ネットワークを越えて世界中のプログラマーと親交を持つことが可能になり、彼らは互いに親友となりました。現在までに、これらの無料のリトリートは 3,000 人以上の方々にポジティブな影響を与えています。数十億円規模のビジネスではありませんが、創設者たちは、このような福祉志向の組織を運営することは非常に報われることであると考えており、ポール・グラハム氏の「価値は直接的な利益を必要としない」という観察例を挙げています。このモデルは、サービスの提供を通じて全球的な友情とオープンソース協力を育むことが、スケールよりもコミュニティの成長を優先する起業家にとって依然として持続可能で鼓舞的な道であることを証明しています。

トップコート:Rust をフルスタックで開発するための完全なフレームワーク | そっか~ニュース