<?xml version='1.0' encoding='utf-8'?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <id>https://mujina-prod.com/</id>
  <title><![CDATA[狢制作]]></title>
  <subtitle><![CDATA[Mujina Production by Nagitch]]></subtitle>
  <icon>https://mujina-prod.com/favicon.png</icon>
  <link href="https://mujina-prod.com" />
  <link href="https://mujina-prod.com/atom.xml" rel="self" type="application/atom+xml" />
  <updated>2025-09-29T22:17:33.848Z</updated>
  <author>
    <name><![CDATA[Nagitch]]></name>
  </author>
  <category term="技術" scheme="https://mujina-prod.com/?tags=%E6%8A%80%E8%A1%93" />
  <category term="GitLab" scheme="https://mujina-prod.com/?tags=GitLab" />
  <category term="Docker" scheme="https://mujina-prod.com/?tags=Docker" />
  <category term="OrbStack" scheme="https://mujina-prod.com/?tags=OrbStack" />
  <category term="仮想環境" scheme="https://mujina-prod.com/?tags=%E4%BB%AE%E6%83%B3%E7%92%B0%E5%A2%83" />
  <category term="Mac Mini" scheme="https://mujina-prod.com/?tags=Mac%20Mini" />
  <category term="Rust" scheme="https://mujina-prod.com/?tags=Rust" />
  <category term="Rhai" scheme="https://mujina-prod.com/?tags=Rhai" />
  <category term="プログラミング" scheme="https://mujina-prod.com/?tags=%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0" />
  <category term="ベンチマーク" scheme="https://mujina-prod.com/?tags=%E3%83%99%E3%83%B3%E3%83%81%E3%83%9E%E3%83%BC%E3%82%AF" />
  <category term="SvelteKit" scheme="https://mujina-prod.com/?tags=SvelteKit" />
  <category term="Vercel" scheme="https://mujina-prod.com/?tags=Vercel" />
  <category term="Svelte" scheme="https://mujina-prod.com/?tags=Svelte" />
  <category term="Tailwind" scheme="https://mujina-prod.com/?tags=Tailwind" />
  <category term="JavaScript" scheme="https://mujina-prod.com/?tags=JavaScript" />
  <category term="お知らせ" scheme="https://mujina-prod.com/?tags=%E3%81%8A%E7%9F%A5%E3%82%89%E3%81%9B" />
  <category term="雑記" scheme="https://mujina-prod.com/?tags=%E9%9B%91%E8%A8%98" />
  <entry>
    <title type="html"><![CDATA[GitLabをローカルネット上のMac Mini + Dockerでホスティングする]]></title>
    <link href="https://mujina-prod.com/blog/gitlab-host-docker-macmini" />
    <id>https://mujina-prod.com/blog/gitlab-host-docker-macmini</id>
    <published>2024-08-04T00:00:00.000Z</published>
    <updated>2024-08-04T00:00:00.000Z</updated>
    <content type="html">
      <![CDATA[<h2 id="モチベーション" data-svelte-h="svelte-8rkzn7"><a href="#モチベーション">モチベーション</a></h2> <p data-svelte-h="svelte-scnx99">バージョン管理のエコシステムとしては GitHub がデファクトスタンダードではありますが、プロジェクトによっては少々無理が生じることがあります。</p> <p data-svelte-h="svelte-7ddqmz">今回の私の場合では、ゲーム開発のプロジェクトで大量のバイナリファイルを扱う見込みですが、 GitHub では <a href="https://docs.github.com/ja/billing/managing-billing-for-git-large-file-storage/about-billing-for-git-large-file-storage#purchasing-additional-storage-and-bandwidth" rel="nofollow noopener noreferrer external" target="_blank">容量制限</a> があり、（執筆時点では）ストレージが無料枠で 1 GB のストレージ, 追加購入プランでも 50GiB かつ帯域幅（例えば、ダウンロードで使う通信量を含む）も 50GiB/月までとなっており、そこそこの規模のゲームであれば容易に使い果たしてしまう可能性があります。</p> <p data-svelte-h="svelte-1d6e3fe">一応代替策として <a href="https://alanedwardes.com/blog/posts/serverless-git-lfs-for-game-dev/" rel="nofollow noopener noreferrer external" target="_blank">LFS を別のサービス(AWS S3 など)にホスティング</a> したり、 <a href="https://qiita.com/Nagitch/items/cee05ef6526f1cc9e0be" rel="nofollow noopener noreferrer external" target="_blank">LFS だけローカルでホスティングする</a> という荒業も可能ですが、AWS を利用するのであれば正しい知識を持ってプロダクションレベルで管理しないと構成がめちゃくちゃになる可能性がありますし（経験あり）、個人レベルではわずかながらコストがかかるのも気になります。</p> <p data-svelte-h="svelte-1y1i1f">そんなわけで色々考えるのもめんどくさくなり、バックアップ策という意味ではクラウド必須ではないし、 PC が分かれてればいいでしょ…ということで、自宅で少々持て余していた Mac Mini (M2Pro) に GitLab をホスティングすることにしました。</p> <p data-svelte-h="svelte-1co6uwp">ただし GitHub を捨てるということは草が生えないという点が残念ですが、対策のために労力を費やすモチベーションもそんなにないので、まぁいいかなという感じです。</p> <h2 id="構成" data-svelte-h="svelte-1f9id2n"><a href="#構成">構成</a></h2> <p data-svelte-h="svelte-73f3ji">構成を下記に一覧しますが、基本的には Docker で GitLab をホスティングするというだけです。</p> <p data-svelte-h="svelte-1olqz01">ただ注意点としては、ハードウェアに関してはそれなりのスペックが必要です。最近の Mac (Mini) であれば十分そうですが、当初 Docker ホスティング機能のある NAS(QNAP, メモリ 8GB ぐらい)を利用しようとしたところ、スペックが足りず断念しました。<a href="https://docs.gitlab.com/ee/install/requirements.html" rel="nofollow noopener noreferrer external" target="_blank">参考：GitLab の動作要件</a></p> <ul data-svelte-h="svelte-57rczx"><li>ハードウェア: Mac Mini (M2Pro)</li> <li>仮想化バックエンド: OrbStack (Docker Desktop の代替)</li> <li>GitLab イメージ: <a href="https://hub.docker.com/r/gitlab/gitlab-ce" rel="nofollow noopener noreferrer external" target="_blank">gitlab/gitlab-ce:latest</a><ul><li>EE(Enterprise Edition) ではなく CE(Community Edition) を利用</li></ul></li></ul> <h2 id="導入手順" data-svelte-h="svelte-1k2byxw"><a href="#導入手順">導入手順</a></h2> <p data-svelte-h="svelte-xvmztv">導入手順としてはシンプルで、GitLab のコンテナを起動するだけです。GitLab のイメージは単一で完全なインフラストラクチャ(DB など)を構成してくれるので、コンテナを起動するだけで動作します。</p> <h3 id="docker-composeyml-を作成" data-svelte-h="svelte-3a50uh"><a href="#docker-composeyml-を作成">docker-compose.yml を作成</a></h3> <p data-svelte-h="svelte-kp1bdd"><a href="https://gitlab-docs.creationline.com/ee/install/docker.html#docker-composer%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9Fgitlab%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB" rel="nofollow noopener noreferrer external" target="_blank">公式のガイド</a> が参考になります。ここの docker-compose.yml をコピーして、適宜編集しています。</p> <p data-svelte-h="svelte-ru5pkk">Mac 特有の注意点として、例えば 共有 volume はホームディレクトリ以下に配置するなどしないと、書き込み不可能な領域に volume を割り当てようとしてデータが書き込めない(永続化されない)ことがあります。<code>~/GitLab/docker-compose.yml</code> などに配置するといいでしょう。</p> <!-- HTML_TAG_START --><pre class="shiki material-default" yaml="true"><div class="language-id">yaml</div><div class='code-container'><code><div class='line'>services:</div><div class='line'>  gitlab:</div><div class='line'>    container_name: gitlab</div><div class='line'>    image: 'gitlab/gitlab-ce:latest'</div><div class='line'>    restart: always</div><div class='line'>    environment:</div><div class='line'>      GITLAB_OMNIBUS_CONFIG: |</div><div class='line'>        external_url 'http://YOUR_PC_HOST.local:8929'</div><div class='line'>        gitlab_rails['gitlab_shell_ssh_port'] = 2224</div><div class='line'>        nginx['listen_port'] = 80</div><div class='line'>    ports:</div><div class='line'>      - '8929:80'</div><div class='line'>      - '2224:22'</div><div class='line'>    volumes:</div><div class='line'>      - './volumes/config:/etc/gitlab'</div><div class='line'>      - './volumes/logs:/var/log/gitlab'</div><div class='line'>      - './volumes/data:/var/opt/gitlab'</div></code></div></pre><!-- HTML_TAG_END --> <p data-svelte-h="svelte-1heev3w"><a href="https://gist.github.com/Nagitch/a54118b612265a2e422b38272952484d" rel="nofollow noopener noreferrer external" target="_blank">Gist にも公開しています。</a></p> <h2 id="起動root-のログイン" data-svelte-h="svelte-1w8947d"><a href="#起動root-のログイン">起動・root のログイン</a></h2> <p data-svelte-h="svelte-1w7b5z4">なにはともあれ、<code>docker-compose up</code> で立ち上げます。<code>-d</code> オプションをつけて立ち上げる場合もありますが、私はエラーなどが出ていないかログを確認することを推奨する委員会なので軽く確認してほしいです。</p> <p data-svelte-h="svelte-gtsfh0">他の端末からアクセスする場合は<a href="http://YOUR_HOST_NAME_OR_IP:8929/" rel="nofollow noopener noreferrer external" target="_blank">http://YOUR_HOST_NAME_OR_IP:8929/</a> にアクセスして、ローカルネットワークで疎通できていることを確認します。</p> <p data-svelte-h="svelte-1rd8qax">問題なければ root ユーザでログインします。初期パスワードはコンテナ内で自動生成されている（有効期限つき）ため、例えばこちらの方法で確認します： <a href="https://qiita.com/AbeTetsuya20/items/5aaf5efb31865a9e71b1#%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E5%90%8D" rel="nofollow noopener noreferrer external" target="_blank">GitLab 初期パスワード</a></p> <p data-svelte-h="svelte-1gt4dvy">ログインしたら、パスワードを変更してください。</p> <h2 id="データが永続化されていることを確認する" data-svelte-h="svelte-124765a"><a href="#データが永続化されていることを確認する">データが永続化されていることを確認する</a></h2> <p data-svelte-h="svelte-1vidvv">万が一プロジェクトのデータ（issue やレビュー機能を活用してるかもしれませんね）を失うと号泣するしかないので、万全を期してデータが永続化されていることを確認します。</p> <p data-svelte-h="svelte-pqthc6"><code>docker-compose down</code> でコンテナを停止（滅する）し、<code>docker-compose up</code> で再度立ち上げます。root で更新後のパスワードでログインして、データが残っていることを確認します。</p> <p data-svelte-h="svelte-y40iu3">また、 <code>ls -al ./volumes/data</code> などを実行して、何らかのデータが残っていることを確認します。</p> <h2 id="所感など" data-svelte-h="svelte-m6h8lc"><a href="#所感など">所感など</a></h2> <p data-svelte-h="svelte-r80x3l">Mac (Mini) を使うと iOS アプリのビルドもできますし、そのような場合に CI/CD が比較的簡単に設定できそうです。ゲーム開発向けのビルド・デプロイサーバーとしての Mac (Mini) の選択肢は結構いいんじゃないかなぁと思いました。</p> <hr> <h2 id="更新履歴" data-svelte-h="svelte-mck5y1"><a href="#更新履歴">更新履歴</a></h2> <ul data-svelte-h="svelte-123qdc7"><li>2024-08-04: 初稿</li></ul>]]>
    </content>
    <category term="技術" scheme="https://mujina-prod.com/?tags=%E6%8A%80%E8%A1%93" />
    <category term="GitLab" scheme="https://mujina-prod.com/?tags=GitLab" />
    <category term="Docker" scheme="https://mujina-prod.com/?tags=Docker" />
    <category term="OrbStack" scheme="https://mujina-prod.com/?tags=OrbStack" />
    <category term="仮想環境" scheme="https://mujina-prod.com/?tags=%E4%BB%AE%E6%83%B3%E7%92%B0%E5%A2%83" />
    <category term="Mac Mini" scheme="https://mujina-prod.com/?tags=Mac%20Mini" />
  </entry>
  <entry>
    <title type="html"><![CDATA[Rust / Rhai / Rhai(AST)の速度比較ベンチマーク]]></title>
    <link href="https://mujina-prod.com/blog/rust-rhai-benchmark" />
    <id>https://mujina-prod.com/blog/rust-rhai-benchmark</id>
    <published>2024-07-06T00:00:00.000Z</published>
    <updated>2024-07-06T00:00:00.000Z</updated>
    <content type="html">
      <![CDATA[<h2 id="モチベーション" data-svelte-h="svelte-8rkzn7"><a href="#モチベーション">モチベーション</a></h2> <p data-svelte-h="svelte-wjqn70">最近 <a href="https://rhai.rs/" rel="nofollow noopener noreferrer external" target="_blank">Rhai</a> という Rust で動作するスクリプトエンジンを見つけました。</p> <p data-svelte-h="svelte-1w32b4o">ゲーム開発向けにライブラリの作成を検討していて、当初は目的のライブラリそのものを Cython(Python)で作成しようと考えていたものの、モバイル向けにポーティングするには numpy などのパッケージ導入のハードルが高いことがわかり、断念していました。</p> <p data-svelte-h="svelte-hti5ix">最終的に Rust を使うことに決めたのですが、スクリプトエンジンがあるとは知らなかったので嬉しい誤算です。</p> <p data-svelte-h="svelte-4pq0pn">また、Rhai は AST(abstract syntax tree) というコードをパースした結果を Rust で取得することができます。これを再利用することでパースの時間を省略し、高速にスクリプトを実行できるという利点があります。</p> <p data-svelte-h="svelte-13x9jxe">そこで、当然ながらどれほどの速度差があるのか気になりましたので、ベンチマークを取ってみました。</p> <h2 id="結果" data-svelte-h="svelte-fafifk"><a href="#結果">結果</a></h2> <p data-svelte-h="svelte-1hjg79l">テストコードおよび結果はこちらのリポジトリにあります。<br> <a href="https://github.com/Nagitch/benchmark-rust-rhai" rel="nofollow noopener noreferrer external" target="_blank">Benchmark Rust Rhai</a></p> <p data-svelte-h="svelte-4pbjju">フィボナッチ数列を n 回計算するという単純な処理を行い、その時間を計測しました。主要な部分の抜粋は以下。</p> <!-- HTML_TAG_START --><pre class="shiki material-default" rust="true"><div class="language-id">rust</div><div class='code-container'><code><div class='line'>    let engine = Engine::new();</div><div class='line'>    let script = "</div><div class='line'>        fn fibonacci(n) &#123;</div><div class='line'>            if n &lt;= 1 &#123; return n; &#125;</div><div class='line'>            else &#123; return fibonacci(n-1) + fibonacci(n-2); &#125;</div><div class='line'>        &#125;</div><div class='line'>        fibonacci(n)</div><div class='line'>    ";</div><div class='line'>    let mut rust_times = Vec::new();</div><div class='line'>    let mut direct_times = Vec::new();</div><div class='line'>    let mut ast_times = Vec::new();</div><div class='line'>    let mut ns = Vec::new();</div><div class='line'></div><div class='line'>    for n in 1i64..=10i64 &#123;</div><div class='line'>        ns.push(n);</div><div class='line'>        let mut scope = Scope::new();</div><div class='line'>        scope.push("n", n);</div><div class='line'></div><div class='line'>        // Rust (vanilla)</div><div class='line'>        let start = Instant::now();</div><div class='line'>        let _rust_result = fibonacci(n as i64);</div><div class='line'>        let rust_duration = start.elapsed().as_secs_f64();</div><div class='line'>        rust_times.push(rust_duration);</div><div class='line'></div><div class='line'>        // Rhai (direct)</div><div class='line'>        let start = Instant::now();</div><div class='line'>        let _direct_result: i64 = engine.eval_with_scope(&mut scope, script)?;</div><div class='line'>        let direct_duration = start.elapsed().as_secs_f64();</div><div class='line'>        direct_times.push(direct_duration);</div><div class='line'></div><div class='line'>        // Rhai (AST)</div><div class='line'>        let ast = engine.compile_with_scope(&mut scope, script)?;</div><div class='line'>        let start = Instant::now();</div><div class='line'>        let _ast_result: i64 = engine.eval_ast_with_scope(&mut scope, &ast)?;</div><div class='line'>        let ast_duration = start.elapsed().as_secs_f64();</div><div class='line'>        ast_times.push(ast_duration);</div><div class='line'>    &#125;</div></code></div></pre><!-- HTML_TAG_END --> <p data-svelte-h="svelte-xs83js">私が docker-compose で走らせた結果は以下の通りでした。</p> <p>n=10<img alt="result n=10" class="rounded-lg my-2" decoding="async" loading="lazy" src="benchmark-result.png"></p> <p>n=30<img alt="result n=30" class="rounded-lg my-2" decoding="async" loading="lazy" src="benchmark-result-n30.png"></p> <h2 id="考察" data-svelte-h="svelte-1lpwza2"><a href="#考察">考察</a></h2> <p data-svelte-h="svelte-1o32pvg">前提として、当然ながら PC のスペックによって処理時間は変わるため、Rust(=Vanilla)をベースに相対的な速度を比較して評価します。結果としては以下のことが考察できます。</p> <ul data-svelte-h="svelte-1ua5eru"><li>無論、Rust が最速である</li> <li>Rhai(Direct)の初回の実行が遅い<ul><li>これはスクリプトエンジンの初回の evaluate に時間がかかるためと思われる（面倒なので未検証）</li></ul></li> <li>Rhai(AST) は Rhai(direct)より早い。スクリプトが複雑になるほど恩恵があると予想できる</li> <li>イテレーションが進むにつれて、Rust と Rhai(Direct, AST) の差が指数関数的に広がっていく<ul><li>ごく一般的な話ではあるが、スクリプトで行う処理は短いほうが良い。特に反復的な処理。</li></ul></li> <li>イテレーション 30 で Rhai(Direct, AST) が 830ms 程度に対して、Rust が約 1.5ms （出力した HTML だとポイントごとのデータが見れる）だった。<ul><li>1/500 程度の差がある(=Rust が 500 倍速い)ということになる。アプリケーションで Rhai がボトルネックになっていると特定できた場合、500 倍の速度向上が見込めると予想できる。</li></ul></li></ul> <h2 id="所感" data-svelte-h="svelte-bzjrrp"><a href="#所感">所感</a></h2> <p data-svelte-h="svelte-1vehwsv">スクリプトエンジンを搭載する利点は JS, Python よろしくランタイムでプログラミングできることです。</p> <p data-svelte-h="svelte-3ytwo6">Rhai ではこの柔軟性を持ちながら、もしボトルネックになるような処理があれば Rust で書き直すことで高速化が見込めるという利点があります。</p> <p data-svelte-h="svelte-68ku6r">今まででも、例えば Python と Cython, C++の組み合わせにより同等のことは可能ではありますが、スムーズさや移植性の点で Rust と Rhai の組み合わせは魅力的だと感じました。</p> <p data-svelte-h="svelte-zlsqw2">また、AST を取得することでスクリプトのパース時間を省略できる機能もなるほどという感じです。これはスクリプトが複雑になるほど恩恵があると予想されるため、ぜひ活用したいと思いました。</p> <p data-svelte-h="svelte-e76dhe">まだまだ研究中ですが、開発全般のワークフローを効率化できる余地がありそうです。何かと機会があれば実際のアプリ開発に取り入れてみたいと思っています。</p> <h2 id="更新履歴" data-svelte-h="svelte-mck5y1"><a href="#更新履歴">更新履歴</a></h2> <ul data-svelte-h="svelte-1hqnnpc"><li>2024-07-06: 初稿</li></ul>]]>
    </content>
    <category term="Rust" scheme="https://mujina-prod.com/?tags=Rust" />
    <category term="Rhai" scheme="https://mujina-prod.com/?tags=Rhai" />
    <category term="プログラミング" scheme="https://mujina-prod.com/?tags=%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0" />
    <category term="ベンチマーク" scheme="https://mujina-prod.com/?tags=%E3%83%99%E3%83%B3%E3%83%81%E3%83%9E%E3%83%BC%E3%82%AF" />
  </entry>
  <entry>
    <title type="html"><![CDATA[[Vercel][SvelteKit] デプロイに関するトラブルシューティング]]></title>
    <link href="https://mujina-prod.com/blog/site-trableshoots" />
    <id>https://mujina-prod.com/blog/site-trableshoots</id>
    <published>2023-10-01T00:00:00.000Z</published>
    <updated>2023-10-01T00:00:00.000Z</updated>
    <content type="html">
      <![CDATA[<h2 id="favicon-が反映されないとれない" data-svelte-h="svelte-1f3m2vj"><a href="#favicon-が反映されないとれない">favicon が反映されない・とれない</a></h2> <p data-svelte-h="svelte-1ry49fh">favicon が localhost を参照してしまう、という問題だった。(アプリのコンフィグの問題)ブラウザのデバッガで特定できる。</p> <h2 id="eexist-エラー-でこける-file-already-exists" data-svelte-h="svelte-er65km"><a href="#eexist-エラー-でこける-file-already-exists">EEXIST エラー でこける (file already exists)</a></h2> <!-- HTML_TAG_START --><pre class="shiki material-default"><div class='code-container'><code><div class='line'>[urara] error EEXIST: file already exists, mkdir 'src/routes/blog'</div></code></div></pre><!-- HTML_TAG_END --> <p data-svelte-h="svelte-1klmafy">このようなエラーでコケる場合は、<code>fs.mkdir</code> で <code>recursive</code> オプションを指定する。 <code>mkdir -p</code> と同じ動きとなるため。</p> <!-- HTML_TAG_START --><pre class="shiki material-default" js="true"><div class="language-id">js</div><div class='code-container'><code><div class='line'>// fs.mkdir(path)</div><div class='line'>fs.mkdir(path, &#123; recursive: true &#125;)</div></code></div></pre><!-- HTML_TAG_END --> <p data-svelte-h="svelte-1xmezz6">参考: <a href="https://stackoverflow.com/questions/13696148/node-js-create-folder-or-use-existing" rel="nofollow noopener noreferrer external" target="_blank">Node.js create folder or use existing</a></p> <h2 id="github-pages-gh-pages-ブランチ-のデプロイを抑止する" data-svelte-h="svelte-v6g0op"><a href="#github-pages-gh-pages-ブランチ-のデプロイを抑止する">GitHub Pages (gh-pages ブランチ) のデプロイを抑止する</a></h2> <p data-svelte-h="svelte-163gzpg">GitHub Pages (Actions) の設定で main に push すると gh-pages ブランチに勝手にマージされてしまうことにより Vercel もデプロイしてしまう。というのが原因だったのでそれを抑止する。</p> <p data-svelte-h="svelte-ligki8"><a href="https://github.com/Nagitch/mujina-prod-site/pull/14/files" rel="nofollow noopener noreferrer external" target="_blank">対策例: https://github.com/Nagitch/mujina-prod-site/pull/14/files</a></p> <h2 id="sharp-missing-in-production-エラー" data-svelte-h="svelte-6r1uiz"><a href="#sharp-missing-in-production-エラー">Sharp Missing In Production エラー</a></h2> <p data-svelte-h="svelte-179d5e0">モジュールがインストールされていない・古いだけだった。（エラーログのメモを忘れた…が、すぐにピンとくるはず）</p> <hr> <h2 id="更新履歴" data-svelte-h="svelte-mck5y1"><a href="#更新履歴">更新履歴</a></h2> <ul data-svelte-h="svelte-im79b0"><li>2024-07-04: 不足していた説明を追加・校正</li> <li>2023-10-01: 初稿</li></ul>]]>
    </content>
    <category term="技術" scheme="https://mujina-prod.com/?tags=%E6%8A%80%E8%A1%93" />
    <category term="プログラミング" scheme="https://mujina-prod.com/?tags=%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0" />
    <category term="SvelteKit" scheme="https://mujina-prod.com/?tags=SvelteKit" />
    <category term="Vercel" scheme="https://mujina-prod.com/?tags=Vercel" />
  </entry>
  <entry>
    <title type="html"><![CDATA[[Svelte][Vercel] 本サイトの技術面の解説・選定理由]]></title>
    <link href="https://mujina-prod.com/blog/site-technical-background" />
    <id>https://mujina-prod.com/blog/site-technical-background</id>
    <published>2023-09-19T00:00:00.000Z</published>
    <updated>2023-09-20T00:00:00.000Z</updated>
    <content type="html">
      <![CDATA[<p data-svelte-h="svelte-1dvc09f">本サイトの構築にあたり、技術面の解説とそれぞれの選定理由を書いていきたいと思います。<br>特に私と近いキャリアのプログラマーや、フリーランサーの方々は個人のホームページをどう作っていくか？そもそも必要なのか？などなど…<br>よく悩むところだと思うので、参考になれば幸いです。</p> <h2 id="技術スタック" data-svelte-h="svelte-1labexr"><a href="#技術スタック">技術スタック</a></h2> <p data-svelte-h="svelte-k53qk7">最終的には次のような構成を選択しました。</p> <ul data-svelte-h="svelte-1qsdfb1"><li><a href="https://github.com/importantimport/urara" rel="nofollow noopener noreferrer external" target="_blank">Urara テンプレート</a><br>本サイトのデザインテンプレートです。<br>概ね以下の技術で構成されており、このテンプレートをベースにカスタマイズを加えています。<br>（元々ブログ専用だったけど魔改造してポートフォリオサイト＋ブログにした）<ul><li><a href="https://kit.svelte.dev/" rel="nofollow noopener noreferrer external" target="_blank">SvelteKit</a><ul><li>Static Adapter (=Static Site Generator として使用)</li></ul></li> <li><a href="https://tailwindcss.com/" rel="nofollow noopener noreferrer external" target="_blank">Tailwind CSS</a><ul><li><a href="https://daisyui.com/" rel="nofollow noopener noreferrer external" target="_blank">DaisyUI</a> -&gt; Tailwind ベースのデザインフレームワーク</li></ul></li> <li><a href="https://vitejs.dev/" rel="nofollow noopener noreferrer external" target="_blank">Vite</a></li></ul></li> <li><a href="https://vercel.com/" rel="nofollow noopener noreferrer external" target="_blank">Vercel</a> によるホスティング</li></ul> <p data-svelte-h="svelte-17z91dd">この選定の背景について、以下に書いていきます。</p> <h2 id="コンセプト要件" data-svelte-h="svelte-1oxrsnw"><a href="#コンセプト要件">コンセプト・要件</a></h2> <p data-svelte-h="svelte-1xbstal">一番の目的は個人事業にも使えるポートフォリオサイトであり、個人制作の成果物も僅かながら仕事に関係することを考慮する必要がありました。<br>またブログとしても使いたかったのは、見栄えが統一できること（無論外部のブログプラットフォームにはできない）と、ブログ記事からホームへの流入を期待できるためです。<br>※SEO 的にもサイト内にブログを含めた方が良いかなーというのもあり</p> <p data-svelte-h="svelte-cislg7">ただ、Qiita, Zenn などのブログプラットフォームのほうが類似する記事からの流入が期待できるメリットなどがあるので、ここらへんは一長一短かと思います。</p> <p data-svelte-h="svelte-1ljy95w">また本業がプログラマーなので、WordPress や適当な CMS を使うのではなく、フロントエンドの技術を使って作りたい気持ちがありました。</p> <h2 id="sveltekit--sveltejs" data-svelte-h="svelte-1ysq0b2"><a href="#sveltekit--sveltejs">SvelteKit / SvelteJS</a></h2> <p data-svelte-h="svelte-18e7hak">はじめは GatsbyJS(Next SSG) がいいところかなーと思ったのですが、どうせなら新出の SvelteKit を使ってみようと思いました。<br>またちょうど最近 <a href="https://svelte.jp/blog/announcing-sveltekit-1.0" rel="nofollow noopener noreferrer external" target="_blank">SvelteKit 1.0.0 がリリース</a> されたので、これを機に使ってみようという発想です。<br>使用感としては、ステートフルな思想は変わらず純粋に React(Next) / Vue(Nuxt) の問題を解決した代替という印象で、React/Vue の知識はそのまま活かせますし、個人的には使えるところで積極的に使いたいと思ってます。</p> <p data-svelte-h="svelte-9kjwdl"><a href="https://svelte.dev/" rel="nofollow noopener noreferrer external" target="_blank">Svelte について気になる方は、ぜひチェックしてみてください。</a></p> <h2 id="デザイン" data-svelte-h="svelte-1lqnyxw"><a href="#デザイン">デザイン</a></h2> <p data-svelte-h="svelte-lk3p8d">個人制作していたり、ゲーム・エンタメ系の仕事に関わってるのもあり「とりあえず作ってみました感」が出てしまうのだけは最低限避けたいと思いました。<br>またレスポンシブ対応はフロントエンドプログラマーの矜持としてマスト。</p> <p data-svelte-h="svelte-176o8mu">なのでめちゃめちゃ凝りたい気持ちはあったのですが、おそらく数年かけてもプロのセンスにはどうしても敵いません。（個人的には純然たる事実として受け入れています）<br>というわけでテンプレートを探して使うことにしました。<br>この発想は、業務系 Web でよくデザインフレームワーク(古くは BootStrap とか) を使っていたのですぐにピンときた感じです。</p> <h2 id="urara-テンプレート-tailwind-css" data-svelte-h="svelte-10fqf34"><a href="#urara-テンプレート-tailwind-css">Urara テンプレート, Tailwind CSS</a></h2> <p data-svelte-h="svelte-pclcc6">ブログの仕組みが入ってれば単純なページ（ポートフォリオなど）は簡単に実現できるので、とりあえずブログのデザインテンプレートから探すことにしました。あとできればブログは Markdown -&gt; HTML の変換で作りたかった（GatsbyJS でよくあるやつ）のでそこらへんも観点の一つです。</p> <p data-svelte-h="svelte-umu9yt">良さげなものが見つからなければどうしようもなかったのですが、SvelteKit, GatsbyJS あたりのテンプレートを探していたところ、幸い好みに近い <a href="https://github.com/importantimport/urara" rel="nofollow noopener noreferrer external" target="_blank">Urara テンプレート</a> にたどり着きました。</p> <p data-svelte-h="svelte-1h3zmyp">ざっくり以下のカスタマイズをしています。</p> <ul data-svelte-h="svelte-h2jjzx"><li>ルーティングの変更。ブログは <code>/blog</code> 以下に移動。 <code>/</code> や他コンテンツは自由な Web ページへのルーティングに。</li> <li>基本のカラーバリエーションの変更</li> <li>ほか、いろいろ・・（覚えてない）</li></ul> <p data-svelte-h="svelte-172j9rc">ホームや他コンテンツのページは Tailwind / DaisyUI を使っています。初めて使いましたがいわゆるユーティリティクラスを使ってデザインするスタイルはかなり合理的でいいなーと思いました。</p> <p data-svelte-h="svelte-17uu4pb">プログラマーがデザインもする場合や、ちゃんと融通の利くデザイナーと一緒に仕事をする場合は積極的に使っていきたい気持ちです。</p> <h2 id="vite" data-svelte-h="svelte-uf3w4y"><a href="#vite">Vite</a></h2> <p data-svelte-h="svelte-17o4gmb">Urara テンプレートが Vite を使っていたので自動的に使ってるだけですが、ブログの Markdown -&gt; HTML 変換をかませていたりしてもホットリロードが即座に反映されるので、快適に作業できました。<br>ちなみに作業環境としては WSL2 Ubuntu + VSCode (Remote Development) です。 (Docker は使ってない)</p> <h2 id="vercel" data-svelte-h="svelte-mbefaf"><a href="#vercel">Vercel</a></h2> <p data-svelte-h="svelte-1rx455h">最初はどこでもよくて、S3 あたりにホスティングすればいいかなーと思っていたのですが、Urara テンプレートが Vercel をサポートしてた(Vercel が SvelteKit に対応してるというが背景にありそう)ので、試しに使ってみたらめちゃめちゃ良かったです。<br>あと無料枠が無いと思ってたんですが、ありました。（純粋にこれはありがたい・・）<br> <a href="https://vercel.com/pricing" rel="nofollow noopener noreferrer external" target="_blank">Vercel の料金体系</a></p> <p data-svelte-h="svelte-fh8p9p">登録から GitHub と連携、デプロイまで直感的にできました。(ほぼ Urara テンプレートが対応してたおかげですが)<br>また Vercel のサブドメインを払いだしてくれるので、独自ドメインを持ってなくてもとりあえず公開できます。（知らなくて避けてた）</p> <p data-svelte-h="svelte-fdzf6k">あと個人的には、CDN への浸透も早いなと感じました。</p> <p data-svelte-h="svelte-k2uht5">Web アプリのプロトタイピングなんかをする場合は今後も使ってみたい気持ちです。</p> <h2 id="問題点" data-svelte-h="svelte-1lk9qmq"><a href="#問題点">問題点</a></h2> <h3 id="ブログにコメント機能がつけられない" data-svelte-h="svelte-320m5x"><a href="#ブログにコメント機能がつけられない">ブログにコメント機能がつけられない</a></h3> <p data-svelte-h="svelte-173e56q">あくまで静的サイト（Static Site）なので当然ですが。</p> <p data-svelte-h="svelte-1r0trur">少し考えましたがここは潔く切り捨てました。<br>ブログの内容としては主に技術系（ある程度普遍的な内容）なので、会話の場として積極的に使うイメージがないのと、<br>コメントがつくことはほとんどない（と思っている）ので、Twitter(X)などで引用されるのをエゴサしてニッコリしたり、ソーシャルのリンクはホームにあるのでコンタクトが必要ならそっちから連絡してもらえればいいかな～という感じです。<br>※記事ごとのソーシャルリンクはそのうちつけたい</p> <p data-svelte-h="svelte-1mgy80m">以上です。同様のお悩みを抱えてる方の参考になれば幸いです。<br>また度々トラブルシューティングが必要になったので、そちらに関しては別途記事を書く予定です。</p> <hr> <h2 id="更新履歴" data-svelte-h="svelte-mck5y1"><a href="#更新履歴">更新履歴</a></h2> <ul data-svelte-h="svelte-dkedsi"><li>2023-09-19: 初稿</li> <li>2023-09-20: 細かな修正（誤字脱字・文章校正）</li></ul>]]>
    </content>
    <category term="技術" scheme="https://mujina-prod.com/?tags=%E6%8A%80%E8%A1%93" />
    <category term="プログラミング" scheme="https://mujina-prod.com/?tags=%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0" />
    <category term="Svelte" scheme="https://mujina-prod.com/?tags=Svelte" />
    <category term="SvelteKit" scheme="https://mujina-prod.com/?tags=SvelteKit" />
    <category term="Tailwind" scheme="https://mujina-prod.com/?tags=Tailwind" />
    <category term="Vercel" scheme="https://mujina-prod.com/?tags=Vercel" />
    <category term="JavaScript" scheme="https://mujina-prod.com/?tags=JavaScript" />
  </entry>
  <entry>
    <title type="html"><![CDATA[ホームページ・ブログを開設しました]]></title>
    <link href="https://mujina-prod.com/blog/announcement-site-opening" />
    <id>https://mujina-prod.com/blog/announcement-site-opening</id>
    <published>2023-09-14T00:00:00.000Z</published>
    <updated>2023-09-14T00:00:00.000Z</updated>
    <content type="html">
      <![CDATA[<p data-svelte-h="svelte-1yb0l6w">ホームページ・ブログを開設しました。<br>「狢制作」 (Mujina Production) は Nagitch の個人事業・制作活動のブランド名です。</p> <p data-svelte-h="svelte-10wizx0">ブログでは多様で有益な情報をお届けしたいと考えています。</p> <p data-svelte-h="svelte-1oiaxu6">生暖かかく活動を見守っていただけば幸いです。よろしくお願いいたします。</p>]]>
    </content>
    <category term="お知らせ" scheme="https://mujina-prod.com/?tags=%E3%81%8A%E7%9F%A5%E3%82%89%E3%81%9B" />
    <category term="雑記" scheme="https://mujina-prod.com/?tags=%E9%9B%91%E8%A8%98" />
  </entry>
</feed>