2025年10月22日水曜日

Lokoを使ってブログアプリを作る方法を解説

あなた:

ロコへようこそ

 

🚂 Loco は Rust on Rails です。

 

木箱 ドキュメント Discordチャンネル

英語 ·中文·フランス語·ポルトガル語 (ブラジル) ·日本語· 한국어 · Русский ·スペイン語

ロコって何ですか?

 

LocoRailsに強く影響を受けています。RailsとRustの知識があれば、きっと馴染みやすいでしょう。Railsしか知らず、Rustは初めてという方には、Locoは新鮮に感じられるでしょう。Railsの知識は必須ではありません。

詳細なガイド、例、API リファレンスなど、Loco の仕組みの詳細については、ドキュメント Web サイトをご覧ください。

Locoの特徴:

 
  • Convention Over Configuration:Ruby on Railsと同様に、Locoはボイラープレートコードの必要性を減らすことでシンプルさと生産性を重視しています。合理的なデフォルト設定を採用しているため、開発者は設定に時間を費やすことなくビジネスロジックの作成に集中できます。

  • Rapid Development:開発者の高い生産性を目標とする Loco の設計は、定型コードの削減と直感的な API の提供に重点を置いており、開発者が迅速に反復処理を行い、最小限の労力でプロトタイプを構築できるようにします。

  • ORM Integration:堅牢なエンティティを使用してビジネスをモデル化することで、SQLを記述する必要がなくなります。エンティティ上でリレーションシップ、検証、カスタムロジックを直接定義することで、保守性と拡張性が向上します。

  • Controllers: Webリクエストのパラメータ、本文、検証を処理し、コンテンツに応じたレスポンスをレンダリングします。最高のパフォーマンス、シンプルさ、拡張性を実現するために、Axumを使用しています。また、コントローラーを使用すると、認証、ログ記録、エラー処理などのロジックを追加できるミドルウェアを簡単に構築できます。これらのロジックは、リクエストをメインコントローラーアクションに渡す前に使用できます。

  • Views:Loco はテンプレート エンジンと統合して、テンプレートから動的な HTML コンテンツを生成できます。

  • Background Jobs:Redis ベースのキューまたはスレッドを使用して、計算負荷の高いジョブや I/O 負荷の高いジョブをバックグラウンドで実行します。ワーカーの実装は、Worker トレイトの perform 関数を実装するだけです。

  • Scheduler:従来の、面倒なことが多い crontab システムを簡素化し、タスクやシェル スクリプトのスケジュール設定をより簡単に、よりエレガントに行えるようにします。

  • Mailers:メーラーは、既存のlocoバックグラウンドワーカーインフラストラクチャを使用して、バックグラウンドでメールを配信します。すべてがシームレスに実行されます。

  • Storage:Loco Storageでは、複数の操作を通じてファイルの操作を容易にします。ストレージは、メモリ内、ディスク上、またはAWS S3、GCP、Azureなどのクラウドサービス上に配置できます。

  • Cache:Loco は、頻繁にアクセスされるデータを保存することでアプリケーションのパフォーマンスを向上させるキャッシュ レイヤーを提供します。

Loco のその他の機能については、ドキュメント Web サイトをご覧ください。

はじめる

 
cargo install loco
cargo install sea-orm-cli # Only when DB is needed

これで、新しいアプリを作成できます (「SaaSアプリ」を選択)。

❯ loco new
✔ ❯ App name? · myapp
✔ ❯ What would you like to build? · Saas App with client side rendering
✔ ❯ Select a DB Provider · Sqlite
✔ ❯ Select your background worker type · Async (in-process tokio async tasks)

🚂 Loco app generated successfully in:
myapp/

- assets: You've selected `clientside` for your asset serving configuration.

Next step, build your frontend:
  $ cd frontend/
  $ npm install && npm run build

今すぐcdあなたのmyappアプリを起動してください:

$ cargo loco start

                      ▄     ▀
                                ▀  ▄
                  ▄       ▀     ▄  ▄ ▄▀
                                    ▄ ▀▄▄
                        ▄     ▀    ▀  ▀▄▀█▄
                                          ▀█▄
▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄   ▄▄▄▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄ ▀▀█
██████  █████   ███ █████   ███ █████   ███ ▀█
██████  █████   ███ █████   ▀▀▀ █████   ███ ▄█▄
██████  █████   ███ █████       █████   ███ ████▄
██████  █████   ███ █████   ▄▄▄ █████   ███ █████
██████  █████   ███  ████   ███ █████   ███ ████▀
  ▀▀▀██▄ ▀▀▀▀▀▀▀▀▀▀  ▀▀▀▀▀▀▀▀▀▀  ▀▀▀▀▀▀▀▀▀▀ ██▀
      ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
                https://loco.rs

listening on port 5150

Loco搭載

 
  • SpectralOps - Locoフレームワークを活用したさまざまなサービス
  • Nativish - Locoフレームワークを搭載したアプリバックエンド

貢献者✨

ーーーーー       これについて雑学や業界話を交えながら解説してください。
ChatGPT:

とても良いテーマを選ばれましたね。
🚂 Loco(ロコ) は、近年のプログラミング界で注目されている「Rust 言語による次世代 Web フレームワーク」のひとつであり、まさに「Rust on Rails」というキャッチコピーの通り、Ruby on Rails の哲学を Rust に移植したものです。
ここでは、Locoの特徴や時代的背景、業界の動き、そしてちょっとした雑学を交えて解説します。


🦀 1. RustがWeb開発に進出してきた背景

Rustはもともと「安全で速いシステムプログラミング言語」としてMozillaが開発したもので、C/C++の代替を目指していました。
しかし、2020年代に入り状況が変わりました。

  • WebAssembly (WASM) や、バックエンドの高速化需要が高まり、

  • RustでもWebアプリが書けるんじゃないか?」という流れが加速。

  • 特に AxumActix WebRocket などが登場し、RustでのWebフレームワーク開発が本格化。

こうした流れの中で登場したのが Loco です。
Locoは「Rails的な生産性とRust的なパフォーマンスを融合する」という野心的なプロジェクトです。


🚆 2. 「Rust on Rails」という発想の妙

Ruby on Rails は2004年に登場し、「設定より規約(Convention over Configuration)」という哲学で、当時のWeb開発を一変させました。

LocoはそれをRustに持ち込みます:

  • 📦 cargo loco new 一発でプロジェクトを作成

  • 🧠 ORMとして SeaORM を採用(SQL書かずにエンティティでモデリング)

  • 🧰 バックグラウンドジョブ(RedisやTokioで非同期処理)

  • ✉️ メール送信やスケジューラ機能も標準搭載

  • 🌐 テンプレートレンダリングも対応(HTMLビューもOK)

つまり「Railsの世界観を、Rustの強固な型システムで安全に再構築」しているわけです。


⚙️ 3. 技術的な裏側の雑学

Locoの裏で動いている主要技術を見てみましょう:

機能 Rust界隈での実装基盤
Webサーバ Axum(TowerベースのモダンWebフレームワーク)
ORM SeaORM(非同期対応ORM)
ジョブ処理 Tokio(非同期ランタイム) + Redis
テンプレート AskamaやTeraなど(Rust製テンプレートエンジン)
ストレージ AWS S3 / GCP / Azure 連携

これらを束ねて「Railsのように一貫性のあるAPI」として提供しているのがLocoの強みです。


🏭 4. 業界的な立ち位置

  • Rust製Webフレームワークのなかで最も「フルスタック」志向です。

  • RocketやAxumは「Web APIサーバー寄り」ですが、Locoは「アプリフレームワーク」志向。

  • すでに SpectralOps や Nativish といった企業がLocoを採用しており、商用運用例も出始めています。

これは、Railsが登場した2000年代初頭のムーブメントに近い流れです。
つまり、Rust版Railsブームの火付け役になりうる存在です。


💡 5. 雑学・豆知識

  • Locoのロゴの「🚂」は、Railsの「線路」にちなんでいます(Rail=線路、Loco=機関車)。
    👉 つまり「Rustの線路を走る新しい列車」という意味合い。

  • Locoの作者たちは、Rustの「所有権モデル」を逆手に取り、安全な非同期処理(Tokio)と高パフォーマンスなWebサーバをRailsライクに構築しています。

  • 名前が「Loco(ロコ)」なのも面白い。英語のスラングで「crazy(クレイジー)」の意味もあるため、
    「ちょっと狂ってるほど挑戦的なプロジェクト」という自虐ジョークが込められています。


🚀 6. これからの展望

Rust製Webフレームワークは、今後以下の点で注目されています:

  • 🔒 セキュリティが強い(型システム + 所有権モデル)

  • ⚡ 高速で軽量(GoやNodeよりも性能面で優位)

  • 🧩 WebAssemblyとの親和性が高い(フロントとバックがRustで統一可能)

将来的には、Locoが「Rustで作るSaaS開発の定番」になる可能性があります。
Railsがそうであったように、学習コストを下げ、チーム開発を加速させるRustフレームワークとして注目されているのです。


🎯 まとめ

項目 内容
名前 Loco(Rust on Rails)
目的 Railsライクな高速・安全なWeb開発
特徴 Convention over Configuration, SeaORM, Axum, Tokio
対象者 Rails経験者、Rust初心者、SaaS開発者
雑学 「Loco=機関車/ちょっとクレイジー」な挑戦的プロジェクト

もしご希望があれば、
👉「実際に loco new でアプリを作って簡単なページを出すまで」
の 実践手順チュートリアル(コマンド付き) も詳しく解説できます。

やってみたいですか?

Lokoを使ってブログアプリを作る方法を解説してください。
ChatGPT:

いいですね!🚂
Loco(Rust on Rails)でブログアプリを作るのは、まさにこのフレームワークの真価を発揮できる題材です。
ここでは、初心者でもRustが少しわかれば理解できるように、ステップごとに丁寧に解説します。


🦀 Locoでブログアプリを作る完全ガイド

🔧 前提条件

まずは開発環境を整えましょう。

必要なもの

  • Rust(最新の stable 版)

    rustup update
  • Node.js(フロントエンド用)

    node -v
  • SQLite(簡単なDB)

    sqlite3 --version

🚆 ステップ 1:Locoをインストール

まずLoco本体とORMツールをインストールします。

cargo install loco cargo install sea-orm-cli

🚉 ステップ 2:新しいLocoアプリを作成

ブログアプリを作ってみましょう。

loco new

質問に答えていきます👇

✔ App name? · blogapp ✔ What would you like to build? · Saas App with client side rendering ✔ Select a DB Provider · Sqlite ✔ Select your background worker type · Async (in-process tokio async tasks)

これでディレクトリ構造が自動生成されます。

blogapp/
 ├─ src/
 │   ├─ main.rs
 │   ├─ controllers/
 │   ├─ models/
 │   └─ views/
 ├─ frontend/
 ├─ migrations/
 ├─ Cargo.toml
 └─ .env

🏗️ ステップ 3:データベース設定

.env を開いてデータベースのURLを設定します。

DATABASE_URL=sqlite://blogapp.db

次にマイグレーションを作ります。
sea-orm-cli を利用します)

sea-orm-cli migrate init

📝 ステップ 4:Postモデル(記事)を作る

ブログ記事のテーブルを定義します。

sea-orm-cli generate entity -o src/models

migrations/ フォルダに新しいマイグレーションファイルを追加し、以下を記述します:

migrations/20231001_create_post_table.rs

use sea_orm_migration::prelude::*;

#[derive(DeriveMigrationName)]
pub struct Migration;

#[async_trait::async_trait]
impl MigrationTrait for Migration {
    async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {
        manager.create_table(
            Table::create()
                .table(Post::Table)
                .if_not_exists()
                .col(ColumnDef::new(Post::Id).integer().not_null().auto_increment().primary_key())
                .col(ColumnDef::new(Post::Title).string().not_null())
                .col(ColumnDef::new(Post::Body).text().not_null())
                .col(ColumnDef::new(Post::CreatedAt).timestamp().not_null().default(Expr::current_timestamp()))
                .to_owned()
        ).await
    }

    async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> {
        manager.drop_table(Table::drop().table(Post::Table).to_owned()).await
    }
}

#[derive(Iden)]
enum Post {
    Table,
    Id,
    Title,
    Body,
    CreatedAt,
}

マイグレーションを実行します:

cargo loco migrate

🧩 ステップ 5:モデル(Entity)定義

src/models/post.rsPost エンティティを作成:

use sea_orm::entity::prelude::*;

#[derive(Clone, Debug, PartialEq, DeriveEntityModel)]
#[sea_orm(table_name = "post")]
pub struct Model {
    #[sea_orm(primary_key)]
    pub id: i32,
    pub title: String,
    pub body: String,
    pub created_at: DateTime,
}

#[derive(Copy, Clone, Debug, EnumIter)]
pub enum Relation {}

impl ActiveModelBehavior for ActiveModel {}

🌐 ステップ 6:コントローラを作る

src/controllers/post_controller.rs を作成:

use axum::{extract::Path, Json};
use loco_rs::prelude::*;
use crate::models::post;
use sea_orm::{EntityTrait, Set};

pub async fn index(ctx: AppContext) -> impl IntoResponse {
    let posts = post::Entity::find().all(&ctx.db).await.unwrap();
    Json(posts)
}

pub async fn create(ctx: AppContext, Json(payload): Json) -> impl IntoResponse {
    let new_post = post::ActiveModel {
        title: Set(payload.title),
        body: Set(payload.body),
        ..Default::default()
    };
    let res = post::Entity::insert(new_post).exec(&ctx.db).await.unwrap();
    Json(res)
}

pub async fn show(ctx: AppContext, Path(id): Path) -> impl IntoResponse {
    let post = post::Entity::find_by_id(id).one(&ctx.db).await.unwrap();
    Json(post)
}

🛣️ ステップ 7:ルーティング設定

src/main.rs または src/routes.rs にルートを追加します。

use axum::{Router, routing::get, routing::post};
use crate::controllers::post_controller;

pub fn routes() -> Router {
    Router::new()
        .route("/posts", get(post_controller::index))
        .route("/posts", post(post_controller::create))
        .route("/posts/:id", get(post_controller::show))
}

💻 ステップ 8:サーバを起動

アプリをビルドして実行します。

cargo loco start

出力:

🚂 Loco is listening on port 5150

ブラウザで確認:

http://localhost:5150/posts

🎨 ステップ 9:フロントエンド(任意)

frontend/ ディレクトリ内にReact/VueなどのSPAを作成して、API /posts を叩けばOKです。

例:Reactで記事一覧を取得

fetch("/posts")
  .then(res => res.json())
  .then(posts => console.log(posts));

🧠 まとめ

ステップ 内容
1 LocoとSeaORMをインストール
2 新規アプリを作成
3 DB設定(SQLite)
4 Postテーブルのマイグレーション
5 モデル定義
6 コントローラ作成
7 ルーティング設定
8 起動・確認
9 フロント統合(任意)

🚀 補足:Locoの魅力

Locoは、Rustの高性能さ + Railsの生産性を両立しており、

  • 高速なAPIサーバ

  • 型安全なDB操作

  • 非同期ジョブ

  • バックグラウンドワーカー

などを一貫してRustで書けます。
今後、Rust製SaaSやスタートアップ開発の標準候補になっていく可能性があります。


もしご希望あれば、
🧩「コメント機能を追加する」
🌐「テンプレートでHTML表示する」
📮「メール通知を組み込む」
など、ブログアプリを実用的に発展させる続編も解説できます。

どの方向に進めたいですか?

hiroppy123@fedora:~$ rustup update bash: rustup:
コマンドが見つかりませんでした...
hiroppy123@fedora:~$         ーーーーー      Fedora42では上手くいきませんでした。
ChatGPT:

なるほどですね。
bash: rustup: コマンドが見つかりませんでした ということは、Rust(rustup)がまだインストールされていない状態です。
Fedoraでは、他のディストリビューションより少しだけRustの導入手順が異なる場合があります。
以下のどちらかの方法で確実にRustを導入できます。


🦀 Fedora 42 に Rust(rustup)を正しくインストールする方法


✅ 方法①(推奨)公式インストーラー(curl 経由)

Rust公式の方法です。
これが一番確実で、開発者みんなが使っているやり方です。

手順

sudo dnf install curl -y curl https://sh.rustup.rs -sSf | sh

途中でこのようなメッセージが出ます:

1) Proceed with installation (default) 2) Customize installation 3) Cancel installation

→ そのまま 1 を押して Enter でOKです。

インストールが終わったら、シェルにパスを通します:

source $HOME/.cargo/env

確認

rustc --version cargo --version

✅ どちらもバージョンが表示されればOKです。
例:

rustc 1.83.0 (Fedora 42) cargo 1.83.0

✅ 方法② Fedoraリポジトリからインストール(簡易版)

こちらは「とりあえず試したいだけ」の場合に便利です。

sudo dnf install rust cargo -y

ただし、この方法は「古いRust」が入ることがあります。
将来Locoなどの最新ツールを使う際は、やはり 方法①(rustup経由) をおすすめします。


💡 rustupとは?

rustup は Rust の「バージョン管理ツール」です。

  • rustc(コンパイラ)

  • cargo(ビルド&パッケージ管理)

  • rustfmt(フォーマッター)

  • clippy(Lintツール)

などを自動的にセットアップしてくれます。
これを使うと、Rustのバージョンを簡単に切り替えたり更新できます:

rustup update rustup default stable

🧩 もし上手くいかない場合

以下のようなトラブルが起こることがあります:

症状 解決方法
curl: command not found sudo dnf install curl -y
Permission denied sudo を付けずに sh 実行してみる
rustc: command not found source ~/.cargo/env を実行

✅ 最後のチェック

すべてOKなら:

rustc --version cargo --version rustup --version

これらが通るようになったら、Locoのインストールに進めます:

cargo install loco cargo install sea-orm-cli

よければ次に、

LocoをFedora上で動かすための依存パッケージ(OpenSSL, SQLite など)
を含めた「Loco準備環境構築手順(Fedora42対応版)」
もご案内しましょうか?
Rust導入後にすぐLocoが動くようにセットアップできます。

0 件のコメント: