<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
        <title>All Posts - NicoLabs</title>
        <link>http://blog.hellonico.info/ja/posts/</link>
        <description>All Posts | NicoLabs</description>
        <generator>Hugo -- gohugo.io</generator><language>ja</language><lastBuildDate>Thu, 02 Jul 2026 12:00:00 &#43;0900</lastBuildDate><atom:link href="http://blog.hellonico.info/ja/posts/" rel="self" type="application/rss+xml" /><item>
    <title>Coniにおけるプロシージャル・オーディオとWebGL WebAssemblyのエクスペリエンス</title>
    <link>http://blog.hellonico.info/ja/posts/coni/procedural-audiovisual-wasm/</link>
    <pubDate>Thu, 02 Jul 2026 12:00:00 &#43;0900</pubDate>
    <author>Author</author>
    <guid>http://blog.hellonico.info/ja/posts/coni/procedural-audiovisual-wasm/</guid>
    <description><![CDATA[<p>過去24時間だけで、私たちは<strong>Coni WebAssembly</strong>エコシステムの限界を押し広げ、プロシージャル・オーディオビジュアルのウェブ体験スイート全体を作成しました。Coniのマクロシステムと生のWebGL、そしてWebAudio APIを組み合わせることで、複雑なグラフィックスと音楽システムを外部アセットへの依存を一切持たずに、ブラウザ上でネイティブに構築、コンパイル、展開することに成功しました。</p>
<p>今回構築した5つの新しいアプリケーションを見てみましょう。これらはすべて<a href="https://coni-lang.org/wasm-apps/" target="_blank" rel="noopener noreffer ">Coni WASM Gallery</a>で、ブラウザ上でネイティブに体験できます。</p>
<h3 id="1-minimal-techno-visualizer">1. Minimal Techno Visualizer</h3>
<p><strong>テーマ:</strong> ダークでドライビングなアルゴリズミック・クラブエナジー。
<em>リンク:</em> <a href="https://coni-lang.org/wasm-apps/apps/minimal-techno/" target="_blank" rel="noopener noreffer ">Minimal Techno App</a></p>
<p>Coniがリアルタイムのプロシージャル音楽生成をオーケストレーションし、それを重い3Dジオメトリのレンダリングと完璧に同期できることを証明したかったのです。</p>
<ul>
<li><strong>オーディオエンジン:</strong> カスタムの140 BPMタイムラインエンジンが、16分音符の裏拍でアナログスタイルのノコギリ波ベースラインをトリガーし、808スタイルの合成キックと組み合わせ、ドロップ部分ではクリスピーなノイズベースのスネア/クラップを導入します。</li>
<li><strong>WebGLの繊細さ:</strong> 16小節の「ブレイクダウン」中に重力を逆転させる5,000個の雨のパーティクルと、キックの打撃ごとにアグレッシブに広がる高密度の脈動する3Dジオメトリコアをマッピングしました。シーケンサーの状態に基づいて冷たいシアンから燃えるようなオレンジ色へと変化します。</li>
</ul>
<h3 id="2-divine-infinity-999hz">2. Divine Infinity 999Hz</h3>
<p><strong>テーマ:</strong> エーテル的で数学的なヒーリング。
<em>リンク:</em> <a href="https://coni-lang.org/wasm-apps/apps/infinity-999hz/" target="_blank" rel="noopener noreffer ">Divine Infinity 999Hz</a></p>
<p>神聖な周波数ヒーリングのコンセプトを中心に据えたこのアプリケーションは、純粋な数学とアンビエントオーディオの融合です。</p>
<ul>
<li><strong>オーディオエンジン:</strong> 深いリラクゼーションを誘発するために、微細な8Hzのシータ波バイノーラルビートで補完された999Hzの「エンジェル周波数」のサイン波を生成します。</li>
<li><strong>WebGLの繊細さ:</strong> GLSLの頂点シェーダー内の純粋な三角関数を使用して、500,000個のパーティクルを「ベルヌーイのレムニスケート」（無限大の記号）上にマッピングしました。繊細なアンビエントグローと深度に基づいた不透明度のフェードにより、3D空間で完璧にレンダリングされます。</li>
</ul>
<h3 id="3-clear-brain-fog-40hz">3. Clear Brain Fog 40Hz</h3>
<p><strong>テーマ:</strong> 幾何学的な明晰さと集中。
<em>リンク:</em> <a href="https://coni-lang.org/wasm-apps/apps/brain-fog-40hz/" target="_blank" rel="noopener noreffer ">Clear Brain Fog 40Hz</a></p>
<p>精神的な混乱を払拭することを目的としたこのアプリは、魅惑的な幾何学とグラウンディング周波数を組み合わせています。</p>
<ul>
<li><strong>オーディオエンジン:</strong> 2つのオシレーター（左耳に432Hz、右耳に472Hz）をデチューンして作成された純粋な40Hzのバイノーラルビート。</li>
<li><strong>WebGLの繊細さ:</strong> 頂点シェーダーに5枚の花びらが回転する3Dスピログラフをプログラムしました。複雑に重なり合う曲線が、カメラを全く動かすことなく前進し続ける錯覚を生み出し、目をフロー状態に引き込みます。</li>
</ul>
<h3 id="4-webgl-guided-breathing-app">4. WebGL Guided Breathing App</h3>
<p><strong>テーマ:</strong> 制御されたリズミカルな瞑想。
<em>リンク:</em> <a href="https://coni-lang.org/wasm-apps/apps/breathing-app/" target="_blank" rel="noopener noreffer ">Breathing App</a></p>]]></description>
</item>
<item>
    <title>WebGLによるガイド付き呼吸法: 6-2-6のインタラクティブ体験</title>
    <link>http://blog.hellonico.info/ja/posts/coni/breathing-app-webgl/</link>
    <pubDate>Mon, 29 Jun 2026 23:35:00 &#43;0900</pubDate>
    <author>Author</author>
    <guid>http://blog.hellonico.info/ja/posts/coni/breathing-app-webgl/</guid>
    <description><![CDATA[<p>ペースの速い今日のデジタル世界において、メンタルヘルスと集中力は非常に重要です。脳波同調（ブレインウェーブ・エントレインメント）アプリケーションの成功に続き、私たちはウェルビーイングのもう一つの側面である「<strong>意識的な呼吸</strong>」に取り組むことにしました。</p>
<p>私たちの最新のConi WASMアプリケーション、<strong>WebGL Breathing App</strong>を発表できることを嬉しく思います。これは、落ち着きをもたらす6-2-6の呼吸エクササイズ（6秒吸って、2秒止め、6秒吐く）をガイドするためにゼロから構築された、視覚的および聴覚的な体験です。</p>
<h3 id="生きたuiを作成する">生きたUIを作成する</h3>
<p>単に拡大する円を表示する従来の呼吸タイマーとは異なり、私たちは「生きている」と感じられるものを作りたいと考えました。そこで、<em>Calm</em>（シアン）、<em>Warm</em>（オレンジ）、<em>Focus</em>（パープル）から<strong>ムード</strong>を設定できるインタラクティブなメニューを設計しました。</p>
<p></p>
<p>エクササイズを開始すると、バックグラウンドの環境ノイズとプロシージャルに生成されたチャイムが再生され始めます。これらのサウンドはWeb Audio APIのみによって駆動され、ネイティブのConi関数によってシームレスにスケジューリングされます。ロジックを標準的なJSランタイムの遅延（ヒカップ）から分離することで、オーディオは完全に一貫性を保ち、ジッター（乱れ）のない状態を維持します。</p>
<h3 id="gpuのパワー">GPUのパワー</h3>
<p>内部では、アプリケーションはネイティブに計算され、WebAssemblyにキャッシュされた<strong>30,000個の幾何学的なパーティクル</strong>のクラスターを生成します。これらのポイントは、選択したムードカラーと連続的な <code>u_breath_factor</code> とともにWebGLシェーダーに渡されます。</p>
<p>息を吸うと、球体は拡大し、頂点シェーダーで直接適用される三角関数のサインとコサインの操作によって頂点が緩やかに波打ちながら、半径が動的に拡大します。色の強さも増し、エネルギーの膨張を模倣します。</p>
<p>息を吐くと、球体はタイトなコアへと収縮します。</p>
<p></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-clojure" data-lang="clojure"><span style="display:flex;"><span><span style="color:#75715e">;; フェーズを完全にWASM内で計算します</span>
</span></span><span style="display:flex;"><span>(<span style="color:#66d9ef">defn </span>update-phase [t phase-text]
</span></span><span style="display:flex;"><span>  (<span style="color:#66d9ef">let </span>[cycle-time (<span style="color:#a6e22e">fmod</span> t <span style="color:#ae81ff">14000.0</span>)
</span></span><span style="display:flex;"><span>        inhale-time <span style="color:#ae81ff">6000.0</span>
</span></span><span style="display:flex;"><span>        hold-time <span style="color:#ae81ff">2000.0</span>
</span></span><span style="display:flex;"><span>        exhale-time <span style="color:#ae81ff">6000.0</span>]
</span></span><span style="display:flex;"><span>    (<span style="color:#66d9ef">if </span>(&lt; cycle-time inhale-time)
</span></span><span style="display:flex;"><span>      <span style="color:#75715e">;; ... 拡張をスムーズに緩和するための数学ロジック</span>
</span></span></code></pre></div><p>視覚的な変換をGPUにオフロードし、厳格な状態の同期をネイティブにWASM内で維持することで、ロボット的ではなく有機的に感じられる、シルクのように滑らかな60fpsの体験を実現しました。</p>
<h3 id="今すぐ試す">今すぐ試す</h3>
<p>新しいアプリケーションを私たちのWASMアプリ環境にデプロイしました。こちらから直接アクセスできます：</p>]]></description>
</item>
<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 &#43;0900</pubDate>
    <author>Author</author>
    <guid>http://blog.hellonico.info/ja/posts/coni/getting-started-conimo/</guid>
    <description><![CDATA[<p>ConimoはConiの公式フルスタックWebフレームワークです。驚異的に高速なWASMのフロントエンド機能と、堅牢なバックエンドサーバー環境を統合し、まとまりのある合理化された開発者体験をもたらします。</p>
<p>最近、コアとなるConimo CLIスクリプトを<code>conimo</code>ライブラリの<code>bin</code>ディレクトリに直接組み込むことで、開発者体験を大幅に改善しました。つまり、外部のセットアップスクリプトは不要で、すべてがネイティブのConiコードによって駆動されます。</p>
<p>このガイドでは、新しいアプリケーションの足場作り（スキャフォールディング）、ローカル開発サーバーの実行、そして強力な<code>patom</code>データベースを利用した最小限のコンテンツ管理システム（CMS）の迅速な構築について説明します。</p>
<h3 id="1-createによる足場作り">1. <code>create</code>による足場作り</h3>
<p>始めるには、組み込みの<code>conimo create</code>コマンドを使用します。Conimoは、最小限のSSR（サーバーサイドレンダリング）セットアップから、完全なリアルタイムWebSocketアーキテクチャ、さらにはネイティブなAIチャットアプリまで、様々な組み込みテンプレートを提供しています。</p>
<p>CMSの場合、永続性が必要です。<code>csv-store</code>テンプレートはこれに最適で、<code>patom</code>を介して堅牢なCSVファイル・データベースを活用します。</p>
<p>次のコマンドを実行してプロジェクトの足場を作ります：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>coni conimo create my-cms --template csv-store
</span></span></code></pre></div><p>スキャフォールディング・スクリプトは即座にフルスタックのディレクトリ構造を生成します：</p>
<ul>
<li><code>backend/</code>: バックエンドのHTTP/WebSocketサーバー。</li>
<li><code>frontend/</code>: WASMコンパイルされるフロントエンドコード。</li>
<li><code>coni.edn</code>: プロジェクト設定。ネイティブのWASMビルドがシームレスに機能するように、現在のコンパイラパスが自動的に注入されます。</li>
</ul>
<h3 id="2-開発サーバーの実行">2. 開発サーバーの実行</h3>
<p>プロジェクトが作成されたら、<code>conimo dev</code>コマンドを実行するだけで開発環境を起動できます。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>cd my-cms
</span></span><span style="display:flex;"><span>coni conimo dev
</span></span></code></pre></div><p>内部では、Conimoの開発サーバーは以下のことを行います：</p>
<ol>
<li><code>frontend/</code>コードのためのWASMコンパイルプロセスをバックグラウンドで起動します。</li>
<li><code>main.wasm</code>と必要なJSブリッジが完全にコンパイルされるまで待機します。</li>
<li>自動的に<code>backend/main.coni</code>サーバーを起動します。</li>
</ol>
<p>これで、バックエンドサーバーとWASMフロントエンドがシームレスに接続されたライブのフルスタック環境が整いました。</p>
<h3 id="3-cmsを書く">3. CMSを書く</h3>
<p></p>
<p><code>csv-store</code>テンプレートを使用すると、CMSの構築は信じられないほど高速になります。バックエンドはすでに、Coniの永続的なアトミック状態管理システムである<code>patom</code>を使用するように配線されています。</p>
<p>「投稿（Posts）」を管理するための最小限のCMSバックエンドを定義する方法は以下の通りです：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-clojure" data-lang="clojure"><span style="display:flex;"><span><span style="color:#75715e">;; backend/main.coni</span>
</span></span><span style="display:flex;"><span>(<span style="color:#a6e22e">require</span> <span style="color:#e6db74">&#34;libs/http/src/server.coni&#34;</span> <span style="color:#e6db74">:as</span> http)
</span></span><span style="display:flex;"><span>(<span style="color:#a6e22e">require</span> <span style="color:#e6db74">&#34;libs/patom/src/core.coni&#34;</span> <span style="color:#e6db74">:as</span> patom)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">;; 永続的なCSVバックドアトムを初期化</span>
</span></span><span style="display:flex;"><span>(<span style="color:#66d9ef">def </span>*db* (<span style="color:#a6e22e">patom/create-store</span> <span style="color:#e6db74">&#34;cms_data.csv&#34;</span> []))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>(<span style="color:#66d9ef">defn </span>handle-get-posts [req]
</span></span><span style="display:flex;"><span>  (<span style="color:#a6e22e">http/json-response</span> <span style="color:#f92672">@</span>*db*))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>(<span style="color:#66d9ef">defn </span>handle-create-post [req]
</span></span><span style="display:flex;"><span>  (<span style="color:#66d9ef">let </span>[body (<span style="color:#a6e22e">http/parse-json</span> (<span style="color:#e6db74">:body</span> req))
</span></span><span style="display:flex;"><span>        new-post {<span style="color:#e6db74">:id</span> (rand-int <span style="color:#ae81ff">10000</span>)
</span></span><span style="display:flex;"><span>                  <span style="color:#e6db74">:title</span> (<span style="color:#e6db74">:title</span> body)
</span></span><span style="display:flex;"><span>                  <span style="color:#e6db74">:content</span> (<span style="color:#e6db74">:content</span> body)}]
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">;; アトミックに状態をスワップし、CSVに永続化する</span>
</span></span><span style="display:flex;"><span>    (<span style="color:#a6e22e">patom/swap!</span> *db* conj new-post)
</span></span><span style="display:flex;"><span>    (<span style="color:#a6e22e">http/json-response</span> new-post)))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>(<span style="color:#66d9ef">defn </span>start-server []
</span></span><span style="display:flex;"><span>  (<span style="color:#66d9ef">let </span>[mux (<span style="color:#a6e22e">http/serve-mux</span>)]
</span></span><span style="display:flex;"><span>    (<span style="color:#a6e22e">http/handle</span> mux <span style="color:#e6db74">&#34;GET /api/posts&#34;</span> handle-get-posts)
</span></span><span style="display:flex;"><span>    (<span style="color:#a6e22e">http/handle</span> mux <span style="color:#e6db74">&#34;POST /api/posts&#34;</span> handle-create-post)
</span></span><span style="display:flex;"><span>    
</span></span><span style="display:flex;"><span>    (println <span style="color:#e6db74">&#34;CMS API running on port 8080&#34;</span>)
</span></span><span style="display:flex;"><span>    (<span style="color:#a6e22e">http/listen-and-serve</span> <span style="color:#e6db74">&#34;:8080&#34;</span> mux)))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>(<span style="color:#a6e22e">start-server</span>)
</span></span></code></pre></div><p>わずか数行のコードで、永続的なCSVストアに裏打ちされた完全に機能するJSON APIが完成します。</p>]]></description>
</item>
<item>
    <title>ConiのネイティブFloat32配列のためのハードコア・カオステスト</title>
    <link>http://blog.hellonico.info/ja/posts/coni/float32-chaos-testing/</link>
    <pubDate>Sun, 28 Jun 2026 11:30:00 &#43;0900</pubDate>
    <author>Author</author>
    <guid>http://blog.hellonico.info/ja/posts/coni/float32-chaos-testing/</guid>
    <description><![CDATA[<p>ブラウザで高性能なアプリケーションを構築する場合、JavaScriptの汎用的な<code>Number</code>型では不十分なことがよくあります。連続した生のメモリ配列が必要になるのです。Coni WASMでは、最も数学的に集約的なアプリケーションのために、ネイティブなWebAssemblyの<code>float32</code>配列に大きく依存しています。</p>
<h3 id="float32は実際にconiのどこで使われているのか">Float32は実際にConiのどこで使われているのか？</h3>
<p>ネイティブの<code>float32</code>配列（<code>make-float32-array</code>、<code>f32-set!</code>、<code>f32-get</code>）は、Coniのパフォーマンス・レイヤーの絶対的なバックボーンです。これらは以下のような機能を駆動しています：</p>
<ol>
<li><strong>WebGLジオメトリ:</strong> <a href="https://coni-lang.org/wasm-apps/apps/deep-focus-webgl/" target="_blank" rel="noopener noreffer "><code>deep-focus-webgl</code></a>アプリでは、<code>float32</code>配列を使用して80,000頂点のブレイン・マトリックス（240,000個の浮点数！）をネイティブに数学的に形成し、その後<code>js/float32-buffer</code>を介して一撃でGPUに転送します。</li>
<li><strong>ゲームエンジンのパーティクルシステム:</strong> <code>flappy-bird</code>や<code>neon-boids</code>のようなゲームでは、並行する<code>float32</code>配列が数千のX/Y座標、速度、寿命を、ガベージコレクションの停止を発生させることなく追跡します。</li>
<li><strong>生（Raw）のDSPオーディオ:</strong> 私たちの<code>sound-nodes</code>シンセサイザーは、複雑なインパルス応答とノイズ波形をWebAudioチャンネルにマッピングする前に、<code>float32</code>配列を使用してネイティブに計算します。</li>
</ol>
<h3 id="バグ型強制とf64reinterpret_i64">バグ：型強制と<code>f64.reinterpret_i64</code></h3>
<p>これらの配列は非常に重要であるため、そこでのバグは壊滅的です。最近、正確な整数（例えば<code>150</code>）を<code>f32-set!</code>に渡すと、なぜか<code>0.0</code>が返ってくるという問題を発見しました。</p>
<p>何が起きていたのでしょうか？以前のバージョンのWASMコンパイラでは、整数を浮動小数点数のセッターに渡すと、コンパイラがビットを解釈するために誤って<code>f64.reinterpret_i64</code>を使用し、基礎となる値を完全に文字化けさせていたのです。</p>
<h3 id="解決策float32カオステスト">解決策：Float32カオステスト</h3>
<p>私たちはコンパイラにパッチを当て、メモリへの挿入前に整数を正しく浮動小数点数に強制（コアーション）するようにしましたが、二度と退行（リグレッション）しないという保証が欲しかったのです。そこで<strong>カオステスト</strong>の登場です。</p>
<p>新しい<code>float32_coercion_test.coni</code>スイートに、ハードコアなカオステストを構築しました。少数のハッピーパス（正常系）の数値をテストするだけでなく、巨大な配列を割り当て、決定論的な擬似ランダムループでそれを激しく叩きます。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-clojure" data-lang="clojure"><span style="display:flex;"><span>(<span style="color:#a6e22e">deftest</span> test-f32-chaos
</span></span><span style="display:flex;"><span>  <span style="color:#e6db74">&#34;float32配列の境界と型強制のためのハードコアなカオステスト&#34;</span>
</span></span><span style="display:flex;"><span>  (<span style="color:#66d9ef">let </span>[size <span style="color:#ae81ff">1000</span>
</span></span><span style="display:flex;"><span>        arr (<span style="color:#a6e22e">make-float32-array</span> size)]
</span></span><span style="display:flex;"><span>    (<span style="color:#66d9ef">loop </span>[i <span style="color:#ae81ff">0</span>]
</span></span><span style="display:flex;"><span>      (<span style="color:#66d9ef">if </span>(&lt; i size)
</span></span><span style="display:flex;"><span>        (<span style="color:#66d9ef">let </span>[
</span></span><span style="display:flex;"><span>          <span style="color:#75715e">;; 極端なエッジケースを混ぜて生成：</span>
</span></span><span style="display:flex;"><span>          val (<span style="color:#66d9ef">if </span>(= (<span style="color:#a6e22e">mod</span> i <span style="color:#ae81ff">4</span>) <span style="color:#ae81ff">0</span>) (- <span style="color:#ae81ff">0</span> i)                   <span style="color:#75715e">;; 負の整数</span>
</span></span><span style="display:flex;"><span>                (<span style="color:#66d9ef">if </span>(= (<span style="color:#a6e22e">mod</span> i <span style="color:#ae81ff">4</span>) <span style="color:#ae81ff">1</span>) (* i <span style="color:#ae81ff">10000</span>)             <span style="color:#75715e">;; 大きな正の整数</span>
</span></span><span style="display:flex;"><span>                  (<span style="color:#66d9ef">if </span>(= (<span style="color:#a6e22e">mod</span> i <span style="color:#ae81ff">4</span>) <span style="color:#ae81ff">2</span>) (+ i <span style="color:#ae81ff">0.5</span>)             <span style="color:#75715e">;; 正確なfloat32の分数</span>
</span></span><span style="display:flex;"><span>                    <span style="color:#ae81ff">0</span>)))                                    <span style="color:#75715e">;; ゼロ（整数）</span>
</span></span><span style="display:flex;"><span>        ]
</span></span><span style="display:flex;"><span>          (<span style="color:#a6e22e">f32-set!</span> arr i val)
</span></span><span style="display:flex;"><span>          (<span style="color:#a6e22e">recur</span> (+ i <span style="color:#ae81ff">1</span>)))
</span></span><span style="display:flex;"><span>        nil))
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">;; ... 検証ループ ...</span>
</span></span></code></pre></div><p>極端な正の整数、負の境界値、純粋なゼロ、そして小数部を持つ浮動小数点数の残酷なミックスを意図的に1,000回<code>f32-set!</code>関数に投げつけることで、WASMのトラップを回避し、型強制が防弾（完璧）であることを保証します。</p>]]></description>
</item>
<item>
    <title>Coni WASMによる40Hzの認知的集中アプリの構築</title>
    <link>http://blog.hellonico.info/ja/posts/coni/brain-waves-wasm/</link>
    <pubDate>Sun, 28 Jun 2026 07:30:00 &#43;0900</pubDate>
    <author>Author</author>
    <guid>http://blog.hellonico.info/ja/posts/coni/brain-waves-wasm/</guid>
    <description><![CDATA[<p>ブラウザ上のWebAssemblyは常に信じられないほどのパフォーマンスを約束してきましたが、WebAudioやWebGLといったWeb APIとスムーズに連携させることは、時にパズルを解くような感覚になることがあります。本日は、Coniエコシステムがこれをいかにエレガントに解決するかを、認知的集中のために設計された2つの新しいWebアプリを通じて紹介できることを嬉しく思います。</p>
<p>これら2つのアプリケーションは、バイノーラルビートを使用して、深い集中力、記憶の想起、認知機能の向上に関連する特定の脳波周波数である<strong>40Hzのガンマ波</strong>を生成します。しかし、本当の魔法はその裏側にあります。これらはすべて完全に<strong>Coni WASM</strong>で書かれているのです。</p>
<h3 id="40hzガンマ波の科学">40Hzガンマ波の科学</h3>
<p>技術的な話に入る前に、なぜ40Hzなのでしょうか？ガンマ波は脳波の中で最も速い周波数です。研究によると、脳が40Hzの範囲で活動している時、それは知覚の高まり、問題解決、そしてピーク時の集中力と相関しています。</p>
<p>左耳に60Hz、右耳に100Hzのサイン波を流すことで、脳は正確に40Hzの周波数差（ビート）を知覚します。このプロセスは脳波の同調（ブレインウェーブ・エントレインメント）として知られ、あなたの認知状態を優しくガンマ波へと導きます。</p>
<p>この体験を提供する上でのConiアーキテクチャの柔軟性を実証するために、2つの異なるバージョンのアプリを構築しました。</p>
<h3 id="1-canvasエディション-deep-focus-40hz">1. Canvasエディション: <a href="https://coni-lang.org/wasm-apps/apps/deep-focus-40hz/" target="_blank" rel="noopener noreffer "><code>deep-focus-40hz</code></a></h3>
<p></p>
<p>最初のアプリケーションは、従来の2D CanvasとDOM APIに依存しています。私たちは独自の<code>reframe_wasm</code>ライブラリを活用し、WebAssemblyから直接HiccupスタイルのDOM生成を行うことでUIの状態とレンダリングを処理しました。</p>
<p>オーディオエンジンは、オシレーターをネイティブに近い速度で完全に管理しています。さらに、その場でエンベロープを変調する自動ジェネレーティブ・チャイムシステムを構築し、JSのオーバーヘッドを完全に回避しました。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-clojure" data-lang="clojure"><span style="display:flex;"><span><span style="color:#75715e">;; JSバインディング不要の表現力豊かなWebAudioエンベロープ！</span>
</span></span><span style="display:flex;"><span>(doto (<span style="color:#a6e22e">.-gain</span> gain)
</span></span><span style="display:flex;"><span>  (<span style="color:#a6e22e">.linearRampToValueAtTime</span> <span style="color:#ae81ff">0.15</span> (+ now <span style="color:#ae81ff">2.0</span>))
</span></span><span style="display:flex;"><span>  (<span style="color:#a6e22e">.exponentialRampToValueAtTime</span> <span style="color:#ae81ff">0.001</span> (+ now <span style="color:#ae81ff">8.0</span>)))
</span></span></code></pre></div><p>これは、純粋なConiでリアクティブで高性能なオーディオエンジンを構築する完璧な例です。</p>
<h3 id="2-webglパワーハウス-deep-focus-webgl">2. WebGLパワーハウス: <a href="https://coni-lang.org/wasm-apps/apps/deep-focus-webgl/" target="_blank" rel="noopener noreffer "><code>deep-focus-webgl</code></a></h3>
<p></p>
<p>Canvasバージョンも素晴らしいですが、Coniのネイティブ処理能力をどこまで押し上げることができるか試してみたくなりました。そこで登場したのが<code>deep-focus-webgl</code>（社内呼称：Amplifocus）です。</p>
<p>2D Canvasに依存するのではなく、このバージョンは純粋なWebGLを使用して<strong>80,000パーティクルのブレイン・マトリックス</strong>をレンダリングします。
何がそんなにエキサイティングなのでしょうか？</p>
<ul>
<li><strong>100%純粋なConi:</strong> GPUで加速される頂点変換と大規模なパーティクル配列のロジックは、Coni WASM内でネイティブに処理されます。</li>
<li><strong>数学計算のJSオーバーヘッド・ゼロ:</strong> Coniの数学ライブラリ（<code>libs/math</code>）を使用することで、高価なJS-WASMブリッジを渡ることなく、数万の頂点に対する複雑な三角関数の変換を計算します。</li>
</ul>
<p>ネイティブのFloatバッファで3Dジオメトリを形成し、それをGPUに送るのがいかに簡単かをご覧ください。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-clojure" data-lang="clojure"><span style="display:flex;"><span><span style="color:#75715e">;; WASMメモリ内で80kの頂点を計算し、一気にGPUへ送信！</span>
</span></span><span style="display:flex;"><span>(<span style="color:#a6e22e">f32-set!</span> *base-points* idx final-x)
</span></span><span style="display:flex;"><span>(<span style="color:#a6e22e">f32-set!</span> *base-points* (+ idx <span style="color:#ae81ff">1</span>) final-sy)
</span></span><span style="display:flex;"><span>(<span style="color:#a6e22e">f32-set!</span> *base-points* (+ idx <span style="color:#ae81ff">2</span>) (* z <span style="color:#ae81ff">1.1</span>))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">;; 静的ジオメトリを一度だけアップロード</span>
</span></span><span style="display:flex;"><span>(<span style="color:#a6e22e">gl/upload-static-data</span> <span style="color:#f92672">@</span>*gl-state* (<span style="color:#a6e22e">js/float32-buffer</span> *base-points*))
</span></span></code></pre></div><p>Float配列を一度割り当て、ネイティブにジオメトリを計算し、バッファリングされた一撃でGPUに転送します。</p>]]></description>
</item>
<item>
    <title>純粋なConi LispでWebGLシェーダーを書く！</title>
    <link>http://blog.hellonico.info/ja/posts/coni/coni-webgl-shaders/</link>
    <pubDate>Sun, 28 Jun 2026 07:30:00 &#43;0900</pubDate>
    <author>Author</author>
    <guid>http://blog.hellonico.info/ja/posts/coni/coni-webgl-shaders/</guid>
    <description><![CDATA[<p>前回の記事では、80,000パーティクルのWebGLマトリックスをオーケストレーションすることで、Coni WASMの生み出すパワーを紹介しました。しかし、WebGLのパイプラインには常に一つの厄介な問題が残っていました。それは<strong>シェーダーそのもの</strong>です。</p>
<p>WebGLコードを書いたことがある人なら、その面倒さを知っているはずです。頂点シェーダーとフラグメントシェーダーを、コードベース全体に連結された巨大で厄介な文字列リテラルとして書くことになります。構文のハイライトもフォーマットも失われ、さらにLispハッカーにとって最も悲劇的なことに、構造的編集（Paredit/Slurp/Barf）も失われてしまいます。</p>
<p>本日、新しい<code>libs/webgl/src/glsl.coni</code>ライブラリにより、私たちがその最後のフロンティアを征服したことを発表できることを嬉しく思います。</p>
<p><strong>GLSLシェーダーをConiのネイティブLisp構文で完全に記述できるようになりました。</strong></p>
<h3 id="defshaderの登場"><code>defshader</code>の登場</h3>
<p>Coniの強力なAST（抽象構文木）とマクロシステムを活用することで、私たちは<code>defshader</code>を構築しました。これは標準的なLispのフォーム、型、数学的演算を受け取り、それらがGPUに到達する前に自動的に厳密なGLSLへとトランスパイルします。</p>
<p>私たちのAmplifocusパーティクルエンジンのために、このフラグメントシェーダーがいかに美しく書かれているかを見てください：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-clojure" data-lang="clojure"><span style="display:flex;"><span>(<span style="color:#a6e22e">require</span> <span style="color:#e6db74">&#34;libs/webgl/src/glsl.coni&#34;</span> <span style="color:#e6db74">:all</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>(<span style="color:#a6e22e">defshader</span> fs-src
</span></span><span style="display:flex;"><span>  (<span style="color:#a6e22e">precision</span> mediump float)
</span></span><span style="display:flex;"><span>  (<span style="color:#a6e22e">varying</span> vec4 v_color)
</span></span><span style="display:flex;"><span>  
</span></span><span style="display:flex;"><span>  (<span style="color:#66d9ef">defn </span>void main []
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">;; ネイティブの数学と座標マッピング！</span>
</span></span><span style="display:flex;"><span>    (set vec2 coord (- gl_PointCoord (<span style="color:#a6e22e">vec2</span> <span style="color:#ae81ff">0.5</span> <span style="color:#ae81ff">0.5</span>)))
</span></span><span style="display:flex;"><span>    (set float dist (<span style="color:#a6e22e">length</span> coord))
</span></span><span style="display:flex;"><span>    
</span></span><span style="display:flex;"><span>    (<span style="color:#66d9ef">if </span>(&gt; dist <span style="color:#ae81ff">0.5</span>)
</span></span><span style="display:flex;"><span>      (<span style="color:#a6e22e">discard</span>))
</span></span><span style="display:flex;"><span>    
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">;; LispのS式を使った発光（グロー）の計算</span>
</span></span><span style="display:flex;"><span>    (set float glow (- <span style="color:#ae81ff">1.0</span> (* dist <span style="color:#ae81ff">2.0</span>)))
</span></span><span style="display:flex;"><span>    (set vec4 final_color (* v_color glow))
</span></span><span style="display:flex;"><span>    (set gl_FragColor final_color)))
</span></span></code></pre></div><h3 id="なぜこれがゲームチェンジャーなのか">なぜこれがゲームチェンジャーなのか？</h3>
<ol>
<li><strong>文字列リテラルからの解放:</strong> シェーダーはファーストクラスのコードになります。アプリケーションの他の部分と完全にフォーマットが統一されます。</li>
<li><strong>ASTレベルの検証:</strong> Coniコンパイラは、ブラウザでWebGLプログラムをコンパイルしようとする前に、シェーダーの構造をパースして検証できます。</li>
<li><strong>構造的編集:</strong> 標準的なLispの構造的編集ツールを使用して、複雑なGPU計算をスラープ、バーフ、そして操作することができます。CスタイルのGLSL文字列でそれをやろうとしてみてください！</li>
<li><strong>シームレスな統合:</strong> 使用可能なWebGLシェーダーへのコンパイルは、<code>core-gl/gl-shader</code>関数を呼び出すだけというシンプルさです：<code>(core-gl/gl-shader gl (.-FRAGMENT_SHADER gl) fs-src)</code>。</li>
</ol>
<h3 id="ブラウザのためのフルスタックlisp">ブラウザのためのフルスタックLisp</h3>
<p>このアップデートにより、パイプラインは完成しました。<code>reframe</code>によるDOM操作から、WebAudioの合成、WASMのFloatバッファ、そして今や実際のGPU頂点変換に至るまで、100% Coniで実現できます。</p>]]></description>
</item>
<item>
    <title>Coniでのネイティブ並列ダウンロードの構築</title>
    <link>http://blog.hellonico.info/ja/posts/coni/parallel-downloads/</link>
    <pubDate>Sat, 27 Jun 2026 00:00:00 &#43;0000</pubDate>
    <author>Author</author>
    <guid>http://blog.hellonico.info/ja/posts/coni/parallel-downloads/</guid>
    <description><![CDATA[<p>独自の言語やツールを構築する際の素晴らしい点の一つは、操作がどのように実行されるかを再考できることです。最新のコミットでは、ビルドプロセスの大きなボトルネックであるMaven依存関係のダウンロードに取り組むことにしました。</p>
<h2 id="プラットフォーム依存スクリプトの問題点">プラットフォーム依存スクリプトの問題点</h2>
<p>これまで、Coniの<code>download-url-to-file</code>関数は、プラットフォーム固有のツールを呼び出す（シェルアウトする）ことに依存していました：</p>
<ul>
<li>Linux/macOSでは、<code>curl</code>プロセスを生成しました。</li>
<li>Windowsでは、<code>System.Net.WebClient</code>を使用する巨大な<code>powershell</code>コマンドを呼び出しました。</li>
</ul>
<p>これは機能していましたが、いくつかの欠点がありました。第一に、外部プロセスを呼び出すことは遅く、リソースを消費します。第二に、外部ツールへの依存は、<code>curl</code>のバージョンやWindowsのセキュリティプロトコルの微妙な違いが予期せぬ失敗を引き起こす可能性があることを意味しました。最も重要なのは、これらのシェルコマンドを使用してアーティファクトを順次（シリアルに）ダウンロードするため、大規模なMavenプロジェクトの解決に非常に時間がかかっていたことです。</p>
<h2 id="ネイティブな解決策">ネイティブな解決策</h2>
<p>コミット<code>9ac76d12</code>で、Goの評価器（エバリュエーター）内に直接実装されたネイティブの組み込み関数<code>sys-http-download</code>を導入しました。この新しい組み込み関数は、Goの標準の<code>net/http</code>クライアントを使用します。</p>
<p>評価器にネイティブに組み込まれているため、プロセス作成のオーバーヘッドを完全に回避できます。さらに、Maven Centralからのレート制限（認識可能なUser-Agentなしで速すぎるアクセスをした場合に頻繁に発生する「429 Too Many Requests」エラー）を処理するために、Goの実装に直接堅牢なリトライロジックを追加しました。</p>
<h2 id="ゴルーチンによるスーパーチャージ">ゴルーチンによるスーパーチャージ</h2>
<p>ネイティブの組み込み関数が準備できた後、Coniの並行処理プリミティブを適用したときに真の魔法が起こりました。Coniは<code>go</code>、<code>chan</code>、<code>&lt;!</code>（チャネルからの読み取り）、<code>&gt;!</code>（チャネルへの書き込み）を使用して、Goスタイルの並行処理をネイティブにサポートしています。</p>
<p>アーティファクトを一つずつダウンロードする代わりに、標準ライブラリの中に直接ワーカープールをセットアップしました：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-clojure" data-lang="clojure"><span style="display:flex;"><span>(<span style="color:#66d9ef">let </span>[total-count (count missing)
</span></span><span style="display:flex;"><span>      result-ch (<span style="color:#a6e22e">chan</span> total-count)
</span></span><span style="display:flex;"><span>      task-ch (<span style="color:#a6e22e">chan</span> total-count)]
</span></span><span style="display:flex;"><span>  <span style="color:#75715e">;; すべてのタスクをタスクチャネルにプッシュ</span>
</span></span><span style="display:flex;"><span>  (<span style="color:#66d9ef">loop </span>[rem missing]
</span></span><span style="display:flex;"><span>    (<span style="color:#66d9ef">if </span>(not (<span style="color:#a6e22e">empty?</span> rem))
</span></span><span style="display:flex;"><span>      (<span style="color:#66d9ef">do </span>
</span></span><span style="display:flex;"><span>        (<span style="color:#a6e22e">&gt;!</span> task-ch (first rem))
</span></span><span style="display:flex;"><span>        (<span style="color:#a6e22e">recur</span> (rest rem)))))
</span></span><span style="display:flex;"><span>  (<span style="color:#a6e22e">close!</span> task-ch)
</span></span><span style="display:flex;"><span>  
</span></span><span style="display:flex;"><span>  <span style="color:#75715e">;; タスクを並行処理するために8つのワーカーゴルーチンを生成</span>
</span></span><span style="display:flex;"><span>  (<span style="color:#66d9ef">loop </span>[i <span style="color:#ae81ff">0</span>]
</span></span><span style="display:flex;"><span>    (<span style="color:#66d9ef">if </span>(&lt; i <span style="color:#ae81ff">8</span>)
</span></span><span style="display:flex;"><span>      (<span style="color:#a6e22e">do</span>
</span></span><span style="display:flex;"><span>        (<span style="color:#a6e22e">go</span> 
</span></span><span style="display:flex;"><span>          (<span style="color:#66d9ef">loop </span>[]
</span></span><span style="display:flex;"><span>            (<span style="color:#66d9ef">let </span>[item (<span style="color:#a6e22e">&lt;!</span> task-ch)]
</span></span><span style="display:flex;"><span>              (<span style="color:#66d9ef">if </span>(not (nil? item))
</span></span><span style="display:flex;"><span>                (<span style="color:#a6e22e">do</span>
</span></span><span style="display:flex;"><span>                  (<span style="color:#a6e22e">&gt;!</span> result-ch (<span style="color:#a6e22e">download-file-single</span> item repos))
</span></span><span style="display:flex;"><span>                  (<span style="color:#a6e22e">recur</span>))))))
</span></span><span style="display:flex;"><span>        (<span style="color:#a6e22e">recur</span> (+ i <span style="color:#ae81ff">1</span>)))))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#75715e">;; 結果を待ち、進捗を表示</span>
</span></span><span style="display:flex;"><span>  ...)
</span></span></code></pre></div><p>ネットワークを圧倒したり、攻撃的なレート制限を引き起こしたりするのを防ぐため、ワーカープールの最大値を8ゴルーチンに制限しています。</p>]]></description>
</item>
<item>
    <title>組み込みサブコマンドによるConi CLIのスーパーチャージ</title>
    <link>http://blog.hellonico.info/ja/posts/coni/embedded-subcommands/</link>
    <pubDate>Sat, 27 Jun 2026 00:00:00 &#43;0000</pubDate>
    <author>Author</author>
    <guid>http://blog.hellonico.info/ja/posts/coni/embedded-subcommands/</guid>
    <description><![CDATA[<p>Coni言語の最大の強みの一つは、そのポータビリティ（移植性）です。私たちは、コア・インタープリタと標準ライブラリが単一の静的バイナリとして配布されるように設計しました。肥大化したインストールプロセスは必要ありません。実行可能ファイルをダウンロードするだけで、すぐに使い始めることができます。</p>
<p>しかし、エコシステムが成長するにつれて（Androidビルドパイプラインの追加など）、ワークフローに少し煩わしさを感じるようになりました。AndroidのAPKビルダーを呼び出すには、次のように絶対パスでスクリプトを実行する必要がありました：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>coni libs/android/bin/build-apk.coni ./my-app
</span></span></code></pre></div><p>機能はしますが、ネイティブのツールのように感じられませんでした。開発者が次のようにシンプルに実行できるような、洗練された開発者体験を提供したいと考えました：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>coni android build-apk ./my-app
</span></span></code></pre></div><p>本日、Goの<code>embed</code>ファイルシステムを活用した**動的サブコマンドルーティング（Dynamic Subcommand Routing）**を実装することで、このギャップを埋めたことを発表できることを嬉しく思います！</p>
<h2 id="仕組み">仕組み</h2>
<p>Goコンパイラに3つの重要なアーキテクチャ上の変更を加えました：</p>
<h3 id="1-バイナリへの組み込みembedding">1. バイナリへの組み込み（Embedding）</h3>
<p>Goコンパイラ内の<code>//go:embed</code>ディレクティブを拡張し、すべてのモジュールにわたるすべての<code>bin/</code>ディレクトリを自動的にパッケージ化するようにしました：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#75715e">//go:embed libs/*/src libs/*/bin</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">var</span> <span style="color:#a6e22e">embeddedLibs</span> <span style="color:#a6e22e">embed</span>.<span style="color:#a6e22e">FS</span>
</span></span></code></pre></div><p>このシンプルな変更により、（<code>build-apk.coni</code>のような）ヘルパースクリプトが実行可能ファイルに永続的に焼き付けられることが保証されます。</p>
<h3 id="2-サブコマンドのインターセプター">2. サブコマンドのインターセプター</h3>
<p>CLI引数の解析ロジックに賢いインターセプターを導入しました。これにより、<code>coni android build-apk</code>のような認識できないコマンドを実行した場合、パーサーがそれをインターセプトし、動的にパスクエリ（<code>libs/android/bin/build-apk.coni</code>）を構築します。</p>
<p>組み込まれたファイルシステムを確認し、スクリプトが存在する場合、実行を組み込まれたペイロードに直接動的にルーティングします！</p>
<h3 id="3-引数のマスキングmasking">3. 引数のマスキング（Masking）</h3>
<p>最後のパズルのピースは、スクリプト自身に対する「錯覚」を維持することでした。<code>build-apk.coni</code>スクリプトは、フラグ（<code>-p camera</code>など）を読み取るために<code>cli/parse-opts</code>を使用します。引数を盲目的に評価器（エバリュエーター）に渡すと、先頭の<code>android</code>や<code>build-apk</code>といったトークンによってスクリプトが混乱してしまいます。</p>
<p>これを解決するために、Goのルーターは舞台裏でグローバルな<code>os.Args</code>スライスを書き換えます：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#a6e22e">os</span>.<span style="color:#a6e22e">Args</span> = append([]<span style="color:#66d9ef">string</span>{<span style="color:#a6e22e">os</span>.<span style="color:#a6e22e">Args</span>[<span style="color:#ae81ff">0</span>], <span style="color:#a6e22e">embeddedPath</span>}, <span style="color:#a6e22e">os</span>.<span style="color:#a6e22e">Args</span>[<span style="color:#ae81ff">3</span>:]<span style="color:#f92672">...</span>)
</span></span></code></pre></div><p>スクリプト側から見れば、直接呼び出されたと思い込むわけです！</p>
<h2 id="結果">結果</h2>
<p>その結果、超高速でシームレスなCLI体験が実現しました。すべてのツールとヘルパースクリプトはConiバイナリ内に有機的に組み込まれて出荷され、自然でネイティブ感のあるサブコマンドを通じて瞬時にアクセスできます。</p>
<p>追加のダウンロードも、パスの設定も不要です。ただ、純粋で邪魔のない生産性があるのみです！</p>]]></description>
</item>
</channel>
</rss>
