https://technicalsuwako.moe
テクニカル諏訪子
2024-02-27T00:00:00Z
テクニカル諏訪子
blog/byobu-53.xhtml
凛
【076】byobu 5.3登場
2024-02-27T00:00:00Z
<h2 id="heading">変更</h2>
<ul>
<li>Makefileの修正</li>
<li>macOS対応</li>
</ul>
<h2 id="heading-1">ソースコード</h2>
<p><a href="https://gitler.moe/suwako/byobu">Gitler</a></p>
<p>以上</p>
blog/sdl2-easy-collision.xhtml
凛
【SDL2】簡単な3D衝突検出の解説
2024-02-17T00:00:00Z
<p>最近、自作のゲームを作成していますが、衝突検出を実装する事に懸念を抱きました。<br />
しかし、作った後はそんなに難しくないと気づきました。<br />
その為、今回はこれについて説明します。<br />
記事での利用している言語はZig言語ですが、C言語やC++でも使えます。</p>
<h2 id="heading">プログラミングタイム!!</h2>
<p>3つのオブジェクトを設置します。</p>
<pre><code lang=""><span style="color:#080;font-style:italic">// オブジェクト
</span><span style="color:#080;font-style:italic"></span><span style="color:#a2f;font-weight:bold">const</span><span style="color:#bbb"> </span>Wall<span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span><span style="color:#a2f;font-weight:bold">struct</span><span style="color:#bbb"> </span>{<span style="color:#bbb"> </span>x<span style="color:#666">:</span><span style="color:#bbb"> </span><span style="color:#0b0;font-weight:bold">f32</span>,<span style="color:#bbb"> </span>y<span style="color:#666">:</span><span style="color:#bbb"> </span><span style="color:#0b0;font-weight:bold">f32</span>,<span style="color:#bbb"> </span>z<span style="color:#666">:</span><span style="color:#bbb"> </span><span style="color:#0b0;font-weight:bold">f32</span>,<span style="color:#bbb"> </span>size<span style="color:#666">:</span><span style="color:#bbb"> </span><span style="color:#0b0;font-weight:bold">f32</span><span style="color:#bbb"> </span>};<span style="color:#bbb">
</span><span style="color:#bbb"></span><span style="color:#a2f;font-weight:bold">const</span><span style="color:#bbb"> </span>Floor<span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span><span style="color:#a2f;font-weight:bold">struct</span><span style="color:#bbb"> </span>{<span style="color:#bbb"> </span>x<span style="color:#666">:</span><span style="color:#bbb"> </span><span style="color:#0b0;font-weight:bold">f32</span>,<span style="color:#bbb"> </span>y<span style="color:#666">:</span><span style="color:#bbb"> </span><span style="color:#0b0;font-weight:bold">f32</span>,<span style="color:#bbb"> </span>z<span style="color:#666">:</span><span style="color:#bbb"> </span><span style="color:#0b0;font-weight:bold">f32</span>,<span style="color:#bbb"> </span>size<span style="color:#666">:</span><span style="color:#bbb"> </span><span style="color:#0b0;font-weight:bold">f32</span><span style="color:#bbb"> </span>};<span style="color:#bbb">
</span><span style="color:#bbb"></span><span style="color:#a2f;font-weight:bold">const</span><span style="color:#bbb"> </span>Player<span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span><span style="color:#a2f;font-weight:bold">struct</span><span style="color:#bbb"> </span>{<span style="color:#bbb">
</span><span style="color:#bbb"> </span>xpos<span style="color:#666">:</span><span style="color:#bbb"> </span><span style="color:#0b0;font-weight:bold">f32</span>,<span style="color:#bbb">
</span><span style="color:#bbb"> </span>ypos<span style="color:#666">:</span><span style="color:#bbb"> </span><span style="color:#0b0;font-weight:bold">f32</span>,<span style="color:#bbb">
</span><span style="color:#bbb"> </span>zpos<span style="color:#666">:</span><span style="color:#bbb"> </span><span style="color:#0b0;font-weight:bold">f32</span>,<span style="color:#bbb">
</span><span style="color:#bbb"> </span>xsize<span style="color:#666">:</span><span style="color:#bbb"> </span><span style="color:#0b0;font-weight:bold">f32</span>,<span style="color:#bbb">
</span><span style="color:#bbb"> </span>ysize<span style="color:#666">:</span><span style="color:#bbb"> </span><span style="color:#0b0;font-weight:bold">f32</span>,<span style="color:#bbb">
</span><span style="color:#bbb"> </span>zsize<span style="color:#666">:</span><span style="color:#bbb"> </span><span style="color:#0b0;font-weight:bold">f32</span>,<span style="color:#bbb">
</span><span style="color:#bbb"> </span>velocity<span style="color:#666">:</span><span style="color:#bbb"> </span><span style="color:#0b0;font-weight:bold">f32</span>,<span style="color:#bbb">
</span><span style="color:#bbb"> </span>gravity<span style="color:#666">:</span><span style="color:#bbb"> </span><span style="color:#0b0;font-weight:bold">f32</span>,<span style="color:#bbb">
</span><span style="color:#bbb"></span>};<span style="color:#bbb">
</span><span style="color:#bbb">
</span><span style="color:#bbb"></span><span style="color:#a2f;font-weight:bold">var</span><span style="color:#bbb"> </span>wall<span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span>Wall<span style="color:#bbb"> </span>{<span style="color:#bbb"> </span>.x<span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span><span style="color:#666">-</span><span style="color:#666">6.0</span>,<span style="color:#bbb"> </span>.y<span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span><span style="color:#666">0.0</span>,<span style="color:#bbb"> </span>.z<span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span><span style="color:#666">-</span><span style="color:#666">26.0</span>,<span style="color:#bbb"> </span>.size<span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span><span style="color:#666">6.0</span><span style="color:#bbb"> </span>};<span style="color:#bbb">
</span><span style="color:#bbb"></span><span style="color:#a2f;font-weight:bold">var</span><span style="color:#bbb"> </span>floor<span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span>Floor<span style="color:#bbb"> </span>{<span style="color:#bbb"> </span>.x<span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span><span style="color:#666">-</span><span style="color:#666">6.0</span>,<span style="color:#bbb"> </span>.y<span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span><span style="color:#666">-</span><span style="color:#666">7.0</span>,<span style="color:#bbb"> </span>.z<span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span><span style="color:#666">-</span><span style="color:#666">26.0</span>,<span style="color:#bbb"> </span>.size<span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span><span style="color:#666">50.0</span><span style="color:#bbb"> </span>};<span style="color:#bbb">
</span><span style="color:#bbb"></span><span style="color:#a2f;font-weight:bold">var</span><span style="color:#bbb"> </span>player<span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span>Player<span style="color:#bbb"> </span>{<span style="color:#bbb">
</span><span style="color:#bbb"> </span>.xpos<span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span><span style="color:#666">0.0</span>,<span style="color:#bbb">
</span><span style="color:#bbb"> </span>.ypos<span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span><span style="color:#666">50.0</span>,<span style="color:#bbb">
</span><span style="color:#bbb"> </span>.zpos<span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span><span style="color:#666">0.0</span>,<span style="color:#bbb">
</span><span style="color:#bbb"> </span>.xsize<span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span><span style="color:#666">0.2</span>,<span style="color:#bbb">
</span><span style="color:#bbb"> </span>.ysize<span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span><span style="color:#666">0.8</span>,<span style="color:#bbb">
</span><span style="color:#bbb"> </span>.zsize<span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span><span style="color:#666">0.2</span>,<span style="color:#bbb">
</span><span style="color:#bbb"> </span>.velocity<span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span><span style="color:#666">0.1</span>,<span style="color:#bbb">
</span><span style="color:#bbb"> </span>.gravity<span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span><span style="color:#666">0.2</span>,<span style="color:#bbb">
</span><span style="color:#bbb"></span>};<span style="color:#bbb">
</span><span style="color:#bbb">
</span><span style="color:#bbb"></span><span style="color:#a2f;font-weight:bold">fn</span><span style="color:#bbb"> </span>draw()<span style="color:#bbb"> </span><span style="color:#0b0;font-weight:bold">void</span><span style="color:#bbb"> </span>{<span style="color:#bbb">
</span><span style="color:#bbb"> </span><span style="color:#080;font-style:italic">// ここは`glBegin`、`glVertex3f`等を設置しますが、長すぎる為、これはスキップします。
</span><span style="color:#080;font-style:italic"></span>}<span style="color:#bbb">
</span></code></pre><p>上記のコードで、主に「gravity」や「velocity」が大切です。<br />
次は衝突検出の関数を作ります。</p>
<pre><code lang=""><span style="color:#a2f;font-weight:bold">fn</span><span style="color:#bbb"> </span>checkPosToObj(xpos<span style="color:#666">:</span><span style="color:#bbb"> </span><span style="color:#0b0;font-weight:bold">f32</span>,<span style="color:#bbb"> </span>ypos<span style="color:#666">:</span><span style="color:#bbb"> </span><span style="color:#0b0;font-weight:bold">f32</span>,<span style="color:#bbb"> </span>zpos<span style="color:#666">:</span><span style="color:#bbb"> </span><span style="color:#0b0;font-weight:bold">f32</span>,<span style="color:#bbb"> </span>size<span style="color:#666">:</span><span style="color:#bbb"> </span><span style="color:#0b0;font-weight:bold">f32</span>,<span style="color:#bbb"> </span>obj<span style="color:#666">:</span><span style="color:#bbb"> </span>anytype)<span style="color:#bbb"> </span><span style="color:#0b0;font-weight:bold">bool</span><span style="color:#bbb"> </span>{<span style="color:#bbb">
</span><span style="color:#bbb"> </span><span style="color:#a2f;font-weight:bold">const</span><span style="color:#bbb"> </span>thresholdX<span style="color:#666">:</span><span style="color:#bbb"> </span><span style="color:#0b0;font-weight:bold">f32</span><span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span>size;<span style="color:#bbb">
</span><span style="color:#bbb"> </span><span style="color:#a2f;font-weight:bold">const</span><span style="color:#bbb"> </span>thresholdY<span style="color:#666">:</span><span style="color:#bbb"> </span><span style="color:#0b0;font-weight:bold">f32</span><span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span>size;<span style="color:#bbb">
</span><span style="color:#bbb"> </span><span style="color:#a2f;font-weight:bold">const</span><span style="color:#bbb"> </span>thresholdZ<span style="color:#666">:</span><span style="color:#bbb"> </span><span style="color:#0b0;font-weight:bold">f32</span><span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span>size;<span style="color:#bbb">
</span><span style="color:#bbb">
</span><span style="color:#bbb"> </span><span style="color:#a2f;font-weight:bold">const</span><span style="color:#bbb"> </span>deltaX<span style="color:#666">:</span><span style="color:#bbb"> </span><span style="color:#0b0;font-weight:bold">f32</span><span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span><span style="color:#a2f">@abs</span>(xpos<span style="color:#bbb"> </span><span style="color:#666">-</span><span style="color:#bbb"> </span>obj.xpos);<span style="color:#bbb">
</span><span style="color:#bbb"> </span><span style="color:#a2f;font-weight:bold">const</span><span style="color:#bbb"> </span>deltaY<span style="color:#666">:</span><span style="color:#bbb"> </span><span style="color:#0b0;font-weight:bold">f32</span><span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span><span style="color:#a2f">@abs</span>(ypos<span style="color:#bbb"> </span><span style="color:#666">-</span><span style="color:#bbb"> </span>obj.ypos);<span style="color:#bbb">
</span><span style="color:#bbb"> </span><span style="color:#a2f;font-weight:bold">const</span><span style="color:#bbb"> </span>deltaZ<span style="color:#666">:</span><span style="color:#bbb"> </span><span style="color:#0b0;font-weight:bold">f32</span><span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span><span style="color:#a2f">@abs</span>(zpos<span style="color:#bbb"> </span><span style="color:#666">-</span><span style="color:#bbb"> </span>obj.zpos);<span style="color:#bbb">
</span><span style="color:#bbb">
</span><span style="color:#bbb"> </span><span style="color:#a2f;font-weight:bold">return</span><span style="color:#bbb"> </span>deltaX<span style="color:#bbb"> </span><span style="color:#666"><</span><span style="color:#bbb"> </span>thresholdX<span style="color:#bbb"> </span><span style="color:#a2f;font-weight:bold">and</span><span style="color:#bbb">
</span><span style="color:#bbb"> </span>deltaY<span style="color:#bbb"> </span><span style="color:#666"><</span><span style="color:#bbb"> </span>thresholdY<span style="color:#bbb"> </span><span style="color:#a2f;font-weight:bold">and</span><span style="color:#bbb">
</span><span style="color:#bbb"> </span>deltaZ<span style="color:#bbb"> </span><span style="color:#666"><</span><span style="color:#bbb"> </span>thresholdZ;<span style="color:#bbb">
</span><span style="color:#bbb"></span>}<span style="color:#bbb">
</span></code></pre><p>床と壁のサイズ値は1つだけで、プレイヤは3つ(X, Y, Z)がある為、上記を使った方が良いですね。<br />
両方のオブジェクトが3つのサイズ値があれば、下記の関数を使っては良いと思います。</p>
<pre><code lang=""><span style="color:#a2f;font-weight:bold">fn</span><span style="color:#bbb"> </span>checkObjToObj(a<span style="color:#666">:</span><span style="color:#bbb"> </span>anytype,<span style="color:#bbb"> </span>b<span style="color:#666">:</span><span style="color:#bbb"> </span>anytype)<span style="color:#bbb"> </span><span style="color:#0b0;font-weight:bold">bool</span><span style="color:#bbb"> </span>{<span style="color:#bbb">
</span><span style="color:#bbb"> </span><span style="color:#a2f;font-weight:bold">const</span><span style="color:#bbb"> </span>thresholdX<span style="color:#666">:</span><span style="color:#bbb"> </span><span style="color:#0b0;font-weight:bold">f32</span><span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span>a.xsize;<span style="color:#bbb">
</span><span style="color:#bbb"> </span><span style="color:#a2f;font-weight:bold">const</span><span style="color:#bbb"> </span>thresholdY<span style="color:#666">:</span><span style="color:#bbb"> </span><span style="color:#0b0;font-weight:bold">f32</span><span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span>a.ysize;<span style="color:#bbb">
</span><span style="color:#bbb"> </span><span style="color:#a2f;font-weight:bold">const</span><span style="color:#bbb"> </span>thresholdZ<span style="color:#666">:</span><span style="color:#bbb"> </span><span style="color:#0b0;font-weight:bold">f32</span><span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span>a.zsize;<span style="color:#bbb">
</span><span style="color:#bbb">
</span><span style="color:#bbb"> </span><span style="color:#a2f;font-weight:bold">const</span><span style="color:#bbb"> </span>deltaX<span style="color:#666">:</span><span style="color:#bbb"> </span><span style="color:#0b0;font-weight:bold">f32</span><span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span><span style="color:#a2f">@abs</span>(a.xpos<span style="color:#bbb"> </span><span style="color:#666">-</span><span style="color:#bbb"> </span>b.xpos);<span style="color:#bbb">
</span><span style="color:#bbb"> </span><span style="color:#a2f;font-weight:bold">const</span><span style="color:#bbb"> </span>deltaY<span style="color:#666">:</span><span style="color:#bbb"> </span><span style="color:#0b0;font-weight:bold">f32</span><span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span><span style="color:#a2f">@abs</span>(a.ypos<span style="color:#bbb"> </span><span style="color:#666">-</span><span style="color:#bbb"> </span>b.ypos);<span style="color:#bbb">
</span><span style="color:#bbb"> </span><span style="color:#a2f;font-weight:bold">const</span><span style="color:#bbb"> </span>deltaZ<span style="color:#666">:</span><span style="color:#bbb"> </span><span style="color:#0b0;font-weight:bold">f32</span><span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span><span style="color:#a2f">@abs</span>(a.zpos<span style="color:#bbb"> </span><span style="color:#666">-</span><span style="color:#bbb"> </span>b.zpos);<span style="color:#bbb">
</span><span style="color:#bbb">
</span><span style="color:#bbb"> </span><span style="color:#a2f;font-weight:bold">return</span><span style="color:#bbb"> </span>deltaX<span style="color:#bbb"> </span><span style="color:#666"><</span><span style="color:#bbb"> </span>thresholdX<span style="color:#bbb"> </span><span style="color:#a2f;font-weight:bold">and</span><span style="color:#bbb">
</span><span style="color:#bbb"> </span>deltaY<span style="color:#bbb"> </span><span style="color:#666"><</span><span style="color:#bbb"> </span>thresholdY<span style="color:#bbb"> </span><span style="color:#a2f;font-weight:bold">and</span><span style="color:#bbb">
</span><span style="color:#bbb"> </span>deltaZ<span style="color:#bbb"> </span><span style="color:#666"><</span><span style="color:#bbb"> </span>thresholdZ;<span style="color:#bbb">
</span><span style="color:#bbb"></span>}<span style="color:#bbb">
</span></code></pre><p>thresholdはいつでもプレイヤ以外のオブジェクトのサイズとなります。</p>
<pre><code lang=""><span style="color:#a2f;font-weight:bold">pub</span><span style="color:#bbb"> </span><span style="color:#a2f;font-weight:bold">fn</span><span style="color:#bbb"> </span>main()<span style="color:#bbb"> </span><span style="color:#666">!</span><span style="color:#0b0;font-weight:bold">void</span><span style="color:#bbb"> </span>{<span style="color:#bbb">
</span><span style="color:#bbb"> </span><span style="color:#080;font-style:italic">// ...
</span><span style="color:#080;font-style:italic"></span><span style="color:#bbb"> </span><span style="color:#080;font-style:italic">// 衝突検出
</span><span style="color:#080;font-style:italic"></span><span style="color:#bbb"> </span><span style="color:#a2f;font-weight:bold">if</span><span style="color:#bbb"> </span>(checkPosToObj(floor.x,<span style="color:#bbb"> </span>floor.y,<span style="color:#bbb"> </span>floor.z,<span style="color:#bbb"> </span>floor.size,<span style="color:#bbb"> </span>player))<span style="color:#bbb"> </span>{<span style="color:#bbb">
</span><span style="color:#bbb"> </span>std.debug.print(<span style="color:#b44">"床を触って良かった! ypos = {d}</span><span style="color:#b62;font-weight:bold">\n</span><span style="color:#b44">"</span>,<span style="color:#bbb"> </span>.{player.ypos});<span style="color:#bbb">
</span><span style="color:#bbb"> </span>player.ypos<span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span>floor.y<span style="color:#666">+</span>(player.ysize);<span style="color:#bbb">
</span><span style="color:#bbb"> </span>}<span style="color:#bbb"> </span><span style="color:#a2f;font-weight:bold">else</span><span style="color:#bbb"> </span>{<span style="color:#bbb">
</span><span style="color:#bbb"> </span>std.debug.print(<span style="color:#b44">"ああああああ!! ypos = {d}</span><span style="color:#b62;font-weight:bold">\n</span><span style="color:#b44">"</span>,<span style="color:#bbb"> </span>.{player.ypos});<span style="color:#bbb">
</span><span style="color:#bbb"> </span>player.ypos<span style="color:#bbb"> </span><span style="color:#666">-=</span><span style="color:#bbb"> </span>player.gravity;<span style="color:#bbb">
</span><span style="color:#bbb"> </span>}<span style="color:#bbb">
</span><span style="color:#bbb">
</span><span style="color:#bbb"> </span><span style="color:#a2f;font-weight:bold">if</span><span style="color:#bbb"> </span>(checkPosToObj(plane.x,<span style="color:#bbb"> </span>plane.y,<span style="color:#bbb"> </span>plane.z,<span style="color:#bbb"> </span>plane.size,<span style="color:#bbb"> </span>player))<span style="color:#bbb"> </span>{<span style="color:#bbb">
</span><span style="color:#bbb"> </span>std.debug.print(<span style="color:#b44">"壁だわ...</span><span style="color:#b62;font-weight:bold">\n</span><span style="color:#b44">"</span>,<span style="color:#bbb"> </span>.{});<span style="color:#bbb">
</span><span style="color:#bbb"> </span>player.zpos<span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span>plane.z<span style="color:#666">+</span>(player.zsize);<span style="color:#bbb">
</span><span style="color:#bbb"> </span>}<span style="color:#bbb">
</span><span style="color:#bbb"> </span><span style="color:#080;font-style:italic">// ...
</span><span style="color:#080;font-style:italic"></span>}<span style="color:#bbb">
</span></code></pre><h2 id="heading-1">結果</h2>
<p><video src="https://ass.technicalsuwako.moe/zig-cd.ogv" controls="controls" style="max-height: 400px;"></video></p>
<p>ねぇ!簡単でしょ〜!</p>
<p>以上</p>
blog/sp-120.xhtml
凛
【076】sp 1.2.0登場
2024-02-01T00:00:00Z
<h2 id="sp">spって何?</h2>
<p>spはシンプルなパスワードマネージャです。</p>
<h2 id="heading">変更</h2>
<ul>
<li>やっとTOTP機能性を修正した</li>
<li>makeを実行したら、バイナリがもっと小さくなる</li>
<li>パスワードの長さの延長</li>
<li>パスワード追加機能性で、パスワードが既に存在するかどうか確認</li>
<li>パスワード削除機能性で、パスワードが存在ないかどうか確認</li>
<li>パスワード変更機能性の追加</li>
<li>zsh対応の修正</li>
</ul>
<h2 id="heading-1">ソースコード</h2>
<p><a href="https://gitler.moe/suwako/sp">Gitler</a></p>
<p>以上</p>
blog/neovim-code-template.xhtml
凜
【Neovim】テンプレートと作り方
2024-01-31T00:00:00Z
<p><a href="/blog/zig-gengo-1.xhtml">Zigの使い方第1部を投稿した後、この言語を辞めました。</a><br />
理由は自由にフォーマット出来なかった事です。<br />
しかし、解決方法を見つけましたが、それが結構面倒くさいと思います:</p>
<pre><code lang=""><span style="color:#080;font-style:italic">// zig fmt: off
</span><span style="color:#080;font-style:italic">// vim: set ts=2 sts=2 sw=2 et:
</span></code></pre><p>各「.zig」ファイルで上記のコメントを自分で貼る事が必要為、「neovimは自動で追加されたら良いなぁ」と思ったら、やっぱりそれが可能です!</p>
<h2 id="confignviminitlua">~/.config/nvim/init.lua</h2>
<pre><code lang="">vim.api.nvim_exec(<span style="color:#b44">[[
</span><span style="color:#b44"> autocmd BufNewFile *.zig 0r ~/.config/nvim/template.zig
</span><span style="color:#b44">]]</span>, <span style="color:#a2f;font-weight:bold">false</span>)
</code></pre><h2 id="confignvimtemplatezig">~/.config/nvim/template.zig</h2>
<pre><code lang=""><span style="color:#080;font-style:italic">// zig fmt: off
</span><span style="color:#080;font-style:italic">// vim: set ts=2 sts=2 sw=2 et:
</span><span style="color:#080;font-style:italic"></span><span style="color:#a2f;font-weight:bold">const</span><span style="color:#bbb"> </span>std<span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span><span style="color:#a2f">@import</span>(<span style="color:#b44">"std"</span>);<span style="color:#bbb">
</span><span style="color:#bbb">
</span></code></pre><p>それで、毎回「<code lang="">nvim ほげほげ.zig</code>」で使って新しい「.zig」ファイルを作ったら、自動で上記の行列を追加されます。<br />
これを好みでしたので、他の言語のテンプレートを作りました。</p>
<h2 id="confignviminitlua-1">~/.config/nvim/init.lua</h2>
<pre><code lang=""><span style="color:#080;font-style:italic">-- テンプレート</span>
vim.api.nvim_exec(<span style="color:#b44">[[
</span><span style="color:#b44"> autocmd BufNewFile *.c 0r ~/.config/nvim/template.c
</span><span style="color:#b44"> autocmd BufNewFile *.cc 0r ~/.config/nvim/template.cc
</span><span style="color:#b44"> autocmd BufNewFile *.h 0r ~/.config/nvim/template.h
</span><span style="color:#b44"> autocmd BufNewFile *.hh 0r ~/.config/nvim/template.hh
</span><span style="color:#b44"> autocmd BufNewFile *.go 0r ~/.config/nvim/template.go
</span><span style="color:#b44"> autocmd BufNewFile *.md 0r ~/.config/nvim/template.md
</span><span style="color:#b44"> autocmd BufNewFile *.zig 0r ~/.config/nvim/template.zig
</span><span style="color:#b44"> autocmd BufNewFile *.php 0r ~/.config/nvim/template.php
</span><span style="color:#b44">]]</span>, <span style="color:#a2f;font-weight:bold">false</span>)
</code></pre><h3 id="templatec">template.c</h3>
<pre><code lang=""><span style="color:#080">#include</span> <span style="color:#080"><stdio.h></span><span style="color:#080">
</span><span style="color:#080"></span>
</code></pre><h3 id="templatecc">template.cc</h3>
<pre><code lang=""><span style="color:#080">#include</span> <span style="color:#080"><iostream></span><span style="color:#080">
</span><span style="color:#080"></span>
</code></pre><h3 id="templateh">template.h</h3>
<pre><code lang=""><span style="color:#080">#ifndef _H
</span><span style="color:#080">#define _H
</span><span style="color:#080"></span>
<span style="color:#080">#endif
</span></code></pre><h3 id="templatehh">template.hh</h3>
<pre><code lang=""><span style="color:#080">#ifndef _HH
</span><span style="color:#080">#define _HH
</span><span style="color:#080"></span>
<span style="color:#a2f;font-weight:bold">class</span> <span style="color:#00f">i</span> {
<span style="color:#a2f;font-weight:bold">public</span><span style="color:#666">:</span>
<span style="color:#a2f;font-weight:bold">private</span><span style="color:#666">:</span>
};
<span style="color:#080">#endif
</span></code></pre><h3 id="templatego">template.go</h3>
<pre><code lang=""><span style="color:#a2f;font-weight:bold">package</span> main
<span style="color:#a2f;font-weight:bold">import</span> (
)
</code></pre><h3 id="templatephp">template.php</h3>
<pre><code lang=""><span style="color:#666"><?</span>php
<span style="color:#080">?></span><span style="">
</span></code></pre><p>以上</p>
blog/freebsd-nas-auto-backup.xhtml
凜
【FreeBSD】簡単にNASの自動的にバックアップする方法
2024-01-30T00:00:00Z
<p><a href="/blog/digital-autonomy-076video-hosting.xhtml">先月は「076動画ホスティングの解決策」という投稿を書きました。</a><br />
先週の週末、このNASに4 TiBのSSDを追加しましたので、それによりGitlerと076動画のストレージ容量が増大出来ました。<br />
でも、バックアップならどうすれば良いですか?<br />
今回はこれを解決すると思いますが、ちゃんと理解するには、まずは「076動画ホスティングの解決策」をご覧下さい。</p>
<h2 id="heading">必要なソフト</h2>
<p>今回必要なソフトは1つだけで、rsyncです。</p>
<pre><code lang=""><span style="color:#080;font-style:italic"># doas pkg install rsync</span>
</code></pre><h2 id="root">rootになれ!!</h2>
<p>そこからrootアカウントで行います。</p>
<pre><code lang=""><span style="color:#080;font-style:italic"># doas su -l</span>
$
</code></pre><h2 id="zfs">ZFSで使ってディスクを確認して</h2>
<pre><code lang="">$ zpool list
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
backup 888G 259G 629G - - 0% 29% 1.00x ONLINE -
xroot 3.62T 259G 3.37T - - 0% 6% 1.00x ONLINE -
zroot 920G 277G 643G - - 0% 30% 1.00x ONLINE -
$ ls -thal /zroot /backup /xroot
/xroot:
total <span style="color:#666">52</span>
drwxr-xr-x <span style="color:#666">19</span> peertube peertube 19B 1月 <span style="color:#666">29</span> 23:34 peertube
drwxr-xr-x <span style="color:#666">7</span> root wheel 7B 1月 <span style="color:#666">28</span> 23:30 .
drwxr-xr-x <span style="color:#666">22</span> root wheel 28B 1月 <span style="color:#666">28</span> 20:32 ..
drwxr-xr-x <span style="color:#666">17</span> suwako suwako 17B 1月 <span style="color:#666">23</span> 16:14 repo
drwxr-xr-x <span style="color:#666">6</span> git git 8B 1月 <span style="color:#666">18</span> 16:14 git
drwxr-x--- <span style="color:#666">8</span> git git 8B 1月 <span style="color:#666">18</span> 15:59 gitler
/backup:
total <span style="color:#666">43</span>
drwxr-xr-x <span style="color:#666">19</span> peertube peertube 19B 1月 <span style="color:#666">29</span> 23:34 peertube
drwxr-xr-x <span style="color:#666">22</span> root wheel 28B 1月 <span style="color:#666">28</span> 20:32 ..
drwxr-xr-x <span style="color:#666">17</span> suwako suwako 17B 1月 <span style="color:#666">23</span> 16:14 repo
drwxr-xr-x <span style="color:#666">6</span> root wheel 6B 1月 <span style="color:#666">23</span> 14:26 .
drwxr-xr-x <span style="color:#666">6</span> git git 8B 1月 <span style="color:#666">18</span> 16:14 git
drwxr-x--- <span style="color:#666">8</span> git git 8B 1月 <span style="color:#666">18</span> 15:59 gitler
/zroot:
total <span style="color:#666">43</span>
drwxr-xr-x <span style="color:#666">19</span> peertube peertube 19B 1月 <span style="color:#666">29</span> 23:34 peertube
drwxr-xr-x <span style="color:#666">22</span> root wheel 28B 1月 <span style="color:#666">28</span> 20:32 ..
drwxr-xr-x <span style="color:#666">17</span> suwako suwako 17B 1月 <span style="color:#666">23</span> 16:14 repo
drwxr-xr-x <span style="color:#666">6</span> root wheel 6B 1月 <span style="color:#666">23</span> 14:26 .
drwxr-xr-x <span style="color:#666">6</span> git git 8B 1月 <span style="color:#666">18</span> 16:14 git
drwxr-x--- <span style="color:#666">8</span> git git 8B 1月 <span style="color:#666">18</span> 15:59 gitler
$ du -lsh /zroot/* /backup/* /xroot/*
6.2G /zroot/git
142G /zroot/gitler
104G /zroot/peertube
6.9G /zroot/repo
6.2G /backup/git
142G /backup/gitler
104G /backup/peertube
6.9G /backup/repo
6.2G /xroot/git
142G /xroot/gitler
512B /xroot/mainpc
104G /xroot/peertube
6.9G /xroot/repo
</code></pre><h2 id="heading-1">シェルスクリプトを作る</h2>
<pre><code lang="">$ nvim sync-backups.sh <span style="color:#666">&&</span> chmod +x sync-backups.sh
</code></pre><p>この「 && chmod +x sync-backups.sh」の部分は、「sync-backups.sh」を保存して終了したら、直ぐに実行可能にして下さいという意味です。</p>
<pre><code lang=""><span style="color:#080">#!/bin/sh
</span><span style="color:#080"></span>
<span style="color:#080;font-style:italic"># 1 TiB</span>
rsync -vaHzop --delete /zroot/* /backup
<span style="color:#080;font-style:italic"># 4 TiB</span>
rsync -vaHzop --delete /zroot/* /xroot
</code></pre><p>「rsync -vaHzop –delete /zroot/* /backup」の意味は:</p>
<ul>
<li>rsync = ソフト</li>
<li>-vaHzop = 何をコピーするか表示する、アーカイブモード (1:1のコピーを作る事)、ハードリンクを保管、、オーナーを保管、許可を保管</li>
<li>–delete = もう存在しないファイルやディレクトリがあれば、消す</li>
<li>/zroot/* /backup = /zrootの内容の全部を/backupにコピーする</li>
</ul>
<h2 id="crontab">crontabを変更して</h2>
<p>最後にcrontabを変更しましょう。</p>
<pre><code lang="">$ crontab -e
</code></pre><pre><code lang="">0 0,6,12,18 * * * /root/sync-backups.sh
</code></pre><p>それで、毎日4回 (0:00、6:00、12:00、そうして18:00で) バックアップのスクリプトを実行されます。</p>
<p>以上</p>