<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Conimo on NicoLabs</title>
		<link>http://blog.hellonico.info/ja/tags/conimo/</link>
		<description>Recent content in Conimo on NicoLabs</description>
		<generator>Hugo</generator>
		<language>ja</language>
		
		
		
		
			<lastBuildDate>Mon, 29 Jun 2026 12:00:00 +0900</lastBuildDate>
		
			<atom:link href="http://blog.hellonico.info/ja/tags/conimo/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>Conimoフレームワークで最小限のCMSを構築する</title>
				<link>http://blog.hellonico.info/ja/posts/coni/getting-started-conimo/</link>
				<pubDate>Mon, 29 Jun 2026 12:00:00 +0900</pubDate>
				<guid>http://blog.hellonico.info/ja/posts/coni/getting-started-conimo/</guid>
				<description>&lt;p&gt;ConimoはConiの公式フルスタックWebフレームワークです。驚異的に高速なWASMのフロントエンド機能と、堅牢なバックエンドサーバー環境を統合し、まとまりのある合理化された開発者体験をもたらします。&lt;/p&gt;&#xA;&lt;p&gt;最近、コアとなるConimo CLIスクリプトを&lt;code&gt;conimo&lt;/code&gt;ライブラリの&lt;code&gt;bin&lt;/code&gt;ディレクトリに直接組み込むことで、開発者体験を大幅に改善しました。つまり、外部のセットアップスクリプトは不要で、すべてがネイティブのConiコードによって駆動されます。&lt;/p&gt;&#xA;&lt;p&gt;このガイドでは、新しいアプリケーションの足場作り（スキャフォールディング）、ローカル開発サーバーの実行、そして強力な&lt;code&gt;patom&lt;/code&gt;データベースを利用した最小限のコンテンツ管理システム（CMS）の迅速な構築について説明します。&lt;/p&gt;&#xA;&lt;h3 id=&#34;1-createによる足場作り&#34;&gt;1. &lt;code&gt;create&lt;/code&gt;による足場作り&lt;/h3&gt;&#xA;&lt;p&gt;始めるには、組み込みの&lt;code&gt;conimo create&lt;/code&gt;コマンドを使用します。Conimoは、最小限のSSR（サーバーサイドレンダリング）セットアップから、完全なリアルタイムWebSocketアーキテクチャ、さらにはネイティブなAIチャットアプリまで、様々な組み込みテンプレートを提供しています。&lt;/p&gt;&#xA;&lt;p&gt;CMSの場合、永続性が必要です。&lt;code&gt;csv-store&lt;/code&gt;テンプレートはこれに最適で、&lt;code&gt;patom&lt;/code&gt;を介して堅牢なCSVファイル・データベースを活用します。&lt;/p&gt;&#xA;&lt;p&gt;次のコマンドを実行してプロジェクトの足場を作ります：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;coni conimo create my-cms --template csv-store&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;スキャフォールディング・スクリプトは即座にフルスタックのディレクトリ構造を生成します：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;backend/&lt;/code&gt;: バックエンドのHTTP/WebSocketサーバー。&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;frontend/&lt;/code&gt;: WASMコンパイルされるフロントエンドコード。&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;coni.edn&lt;/code&gt;: プロジェクト設定。ネイティブのWASMビルドがシームレスに機能するように、現在のコンパイラパスが自動的に注入されます。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;2-開発サーバーの実行&#34;&gt;2. 開発サーバーの実行&lt;/h3&gt;&#xA;&lt;p&gt;プロジェクトが作成されたら、&lt;code&gt;conimo dev&lt;/code&gt;コマンドを実行するだけで開発環境を起動できます。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd my-cms&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;coni conimo dev&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;内部では、Conimoの開発サーバーは以下のことを行います：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;code&gt;frontend/&lt;/code&gt;コードのためのWASMコンパイルプロセスをバックグラウンドで起動します。&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;main.wasm&lt;/code&gt;と必要なJSブリッジが完全にコンパイルされるまで待機します。&lt;/li&gt;&#xA;&lt;li&gt;自動的に&lt;code&gt;backend/main.coni&lt;/code&gt;サーバーを起動します。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;これで、バックエンドサーバーとWASMフロントエンドがシームレスに接続されたライブのフルスタック環境が整いました。&lt;/p&gt;&#xA;&lt;h3 id=&#34;3-cmsを書く&#34;&gt;3. CMSを書く&lt;/h3&gt;&#xA;&lt;p&gt;&lt;img&#xA;        class=&#34;lazyload&#34;&#xA;        src=&#34;http://blog.hellonico.info/svg/loading.min.svg&#34;&#xA;        data-src=&#34;../conimo-todo.png&#34;&#xA;        data-srcset=&#34;../conimo-todo.png, ../conimo-todo.png 1.5x, ../conimo-todo.png 2x&#34;&#xA;        data-sizes=&#34;auto&#34;&#xA;        alt=&#34;../conimo-todo.png&#34;&#xA;        title=&#34;Conimo CMS Application&#34; /&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;csv-store&lt;/code&gt;テンプレートを使用すると、CMSの構築は信じられないほど高速になります。バックエンドはすでに、Coniの永続的なアトミック状態管理システムである&lt;code&gt;patom&lt;/code&gt;を使用するように配線されています。&lt;/p&gt;&#xA;&lt;p&gt;「投稿（Posts）」を管理するための最小限のCMSバックエンドを定義する方法は以下の通りです：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-clojure&#34; data-lang=&#34;clojure&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; backend/main.coni&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;require&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;libs/http/src/server.coni&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;:as&lt;/span&gt; http)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;require&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;libs/patom/src/core.coni&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;:as&lt;/span&gt; patom)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; 永続的なCSVバックドアトムを初期化&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;def &lt;/span&gt;*db* (&lt;span style=&#34;color:#a6e22e&#34;&gt;patom/create-store&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;cms_data.csv&amp;#34;&lt;/span&gt; []))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;defn &lt;/span&gt;handle-get-posts [req]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a6e22e&#34;&gt;http/json-response&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;@&lt;/span&gt;*db*))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;defn &lt;/span&gt;handle-create-post [req]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#66d9ef&#34;&gt;let &lt;/span&gt;[body (&lt;span style=&#34;color:#a6e22e&#34;&gt;http/parse-json&lt;/span&gt; (&lt;span style=&#34;color:#e6db74&#34;&gt;:body&lt;/span&gt; req))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        new-post {&lt;span style=&#34;color:#e6db74&#34;&gt;:id&lt;/span&gt; (rand-int &lt;span style=&#34;color:#ae81ff&#34;&gt;10000&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                  &lt;span style=&#34;color:#e6db74&#34;&gt;:title&lt;/span&gt; (&lt;span style=&#34;color:#e6db74&#34;&gt;:title&lt;/span&gt; body)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                  &lt;span style=&#34;color:#e6db74&#34;&gt;:content&lt;/span&gt; (&lt;span style=&#34;color:#e6db74&#34;&gt;:content&lt;/span&gt; body)}]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;;; アトミックに状態をスワップし、CSVに永続化する&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#a6e22e&#34;&gt;patom/swap!&lt;/span&gt; *db* conj new-post)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#a6e22e&#34;&gt;http/json-response&lt;/span&gt; new-post)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;defn &lt;/span&gt;start-server []&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#66d9ef&#34;&gt;let &lt;/span&gt;[mux (&lt;span style=&#34;color:#a6e22e&#34;&gt;http/serve-mux&lt;/span&gt;)]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#a6e22e&#34;&gt;http/handle&lt;/span&gt; mux &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;GET /api/posts&amp;#34;&lt;/span&gt; handle-get-posts)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#a6e22e&#34;&gt;http/handle&lt;/span&gt; mux &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;POST /api/posts&amp;#34;&lt;/span&gt; handle-create-post)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (println &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;CMS API running on port 8080&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#a6e22e&#34;&gt;http/listen-and-serve&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;:8080&amp;#34;&lt;/span&gt; mux)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;start-server&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;わずか数行のコードで、永続的なCSVストアに裏打ちされた完全に機能するJSON APIが完成します。&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
