424 行
51 KiB
XML
424 行
51 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
||
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0">
|
||
<id>gemini://technicalsuwako.moe</id>
|
||
<title>テクニカル諏訪子</title>
|
||
|
||
<updated>2024-02-27T00:00:00Z</updated>
|
||
|
||
<author><name>テクニカル諏訪子</name></author>
|
||
<link href="gemini://technicalsuwako.moe" rel="alternate"></link>
|
||
|
||
|
||
|
||
<entry>
|
||
<id>blog/byobu-53.gmi</id>
|
||
<author><name>凛</name></author>
|
||
<title type="html">【076】byobu 5.3登場</title>
|
||
<published>2024-02-27T00:00:00Z</published>
|
||
|
||
<category term="jp"></category>
|
||
|
||
<category term="blog"></category>
|
||
|
||
<category term="ウエブ開発"></category>
|
||
|
||
<category term="076"></category>
|
||
|
||
<category term="byobu"></category>
|
||
|
||
<link href="gemini://technicalsuwako.moe/blog/byobu-53.gmi" rel="alternate"></link>
|
||
<content type="html">
|
||
|
||
|
||
|
||
<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>
|
||
|
||
|
||
</content>
|
||
</entry>
|
||
|
||
<entry>
|
||
<id>blog/sdl2-easy-collision.gmi</id>
|
||
<author><name>凛</name></author>
|
||
<title type="html">【SDL2】簡単な3D衝突検出の解説</title>
|
||
<published>2024-02-17T00:00:00Z</published>
|
||
|
||
<category term="blog"></category>
|
||
|
||
<category term="jp"></category>
|
||
|
||
<category term="プログラミング"></category>
|
||
|
||
<category term="zig"></category>
|
||
|
||
<category term="sdl"></category>
|
||
|
||
<category term="opengl"></category>
|
||
|
||
<category term="ゲーム開発"></category>
|
||
|
||
<link href="gemini://technicalsuwako.moe/blog/sdl2-easy-collision.gmi" rel="alternate"></link>
|
||
<content type="html">
|
||
|
||
|
||
|
||
<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">&lt;</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">&lt;</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">&lt;</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">&lt;</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">&lt;</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">&lt;</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">&#34;床を触って良かった! ypos = {d}</span><span style="color:#b62;font-weight:bold">\n</span><span style="color:#b44">&#34;</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">&#34;ああああああ!! ypos = {d}</span><span style="color:#b62;font-weight:bold">\n</span><span style="color:#b44">&#34;</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">&#34;壁だわ...</span><span style="color:#b62;font-weight:bold">\n</span><span style="color:#b44">&#34;</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>
|
||
|
||
|
||
</content>
|
||
</entry>
|
||
|
||
<entry>
|
||
<id>blog/sp-120.gmi</id>
|
||
<author><name>凛</name></author>
|
||
<title type="html">【076】sp 1.2.0登場</title>
|
||
<published>2024-02-01T00:00:00Z</published>
|
||
|
||
<category term="jp"></category>
|
||
|
||
<category term="blog"></category>
|
||
|
||
<category term="ウエブ開発"></category>
|
||
|
||
<category term="076"></category>
|
||
|
||
<category term="sp"></category>
|
||
|
||
<link href="gemini://technicalsuwako.moe/blog/sp-120.gmi" rel="alternate"></link>
|
||
<content type="html">
|
||
|
||
|
||
|
||
<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>
|
||
|
||
|
||
</content>
|
||
</entry>
|
||
|
||
<entry>
|
||
<id>blog/neovim-code-template.gmi</id>
|
||
<author><name>凜</name></author>
|
||
<title type="html">【Neovim】テンプレートと作り方</title>
|
||
<published>2024-01-31T00:00:00Z</published>
|
||
|
||
<category term="jp"></category>
|
||
|
||
<category term="blog"></category>
|
||
|
||
<category term="neovim"></category>
|
||
|
||
<category term="開発"></category>
|
||
|
||
<category term="プログラミング"></category>
|
||
|
||
<category term="linux"></category>
|
||
|
||
<category term="bsd"></category>
|
||
|
||
<category term="freebsd"></category>
|
||
|
||
<category term="openbsd"></category>
|
||
|
||
<category term="zig"></category>
|
||
|
||
<category term="c言語"></category>
|
||
|
||
<category term="php"></category>
|
||
|
||
<category term="go言語"></category>
|
||
|
||
<link href="gemini://technicalsuwako.moe/blog/neovim-code-template.gmi" rel="alternate"></link>
|
||
<content type="html">
|
||
|
||
|
||
|
||
<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">&#34;std&#34;</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">&lt;stdio.h&gt;</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">&lt;iostream&gt;</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">&lt;?</span>php
|
||
|
||
<span style="color:#080">?&gt;</span><span style="">
|
||
</span></code></pre><p>以上</p>
|
||
|
||
|
||
</content>
|
||
</entry>
|
||
|
||
<entry>
|
||
<id>blog/freebsd-nas-auto-backup.gmi</id>
|
||
<author><name>凜</name></author>
|
||
<title type="html">【FreeBSD】簡単にNASの自動的にバックアップする方法</title>
|
||
<published>2024-01-30T00:00:00Z</published>
|
||
|
||
<category term="jp"></category>
|
||
|
||
<category term="blog"></category>
|
||
|
||
<category term="freebsd"></category>
|
||
|
||
<category term="nas"></category>
|
||
|
||
<category term="デジタル自主"></category>
|
||
|
||
<link href="gemini://technicalsuwako.moe/blog/freebsd-nas-auto-backup.gmi" rel="alternate"></link>
|
||
<content type="html">
|
||
|
||
|
||
|
||
<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">&amp;&amp;</span> chmod +x sync-backups.sh
|
||
</code></pre><p>この「 &amp;&amp; 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 &ndash;delete /zroot/* /backup」の意味は:</p>
|
||
<ul>
|
||
<li>rsync = ソフト</li>
|
||
<li>-vaHzop = 何をコピーするか表示する、アーカイブモード (1:1のコピーを作る事)、ハードリンクを保管、、オーナーを保管、許可を保管</li>
|
||
<li>&ndash;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>
|
||
|
||
|
||
</content>
|
||
</entry>
|
||
|
||
|
||
</feed>
|