440 行
52 KiB
XML
440 行
52 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>2023-06-06T00:00:00Z</updated>
|
||
|
||
<author><name>テクニカル諏訪子</name></author>
|
||
<link href="gemini://technicalsuwako.moe" rel="alternate"></link>
|
||
|
||
|
||
|
||
<entry>
|
||
<id>blog/openbsd-gemini-server.gmi</id>
|
||
<author><name>凛</name></author>
|
||
<title type="html">【デジタル自主】OpenBSDでGeminiサーバーを設置方法</title>
|
||
<published>2023-06-06T00:00:00Z</published>
|
||
|
||
<category term="jp"></category>
|
||
|
||
<category term="blog"></category>
|
||
|
||
<category term="ウエブサイト"></category>
|
||
|
||
<category term="ウエブ開発"></category>
|
||
|
||
<category term="bsd"></category>
|
||
|
||
<category term="openbsd"></category>
|
||
|
||
<category term="gemini"></category>
|
||
|
||
<category term="デジタル自主"></category>
|
||
|
||
<link href="gemini://technicalsuwako.moe/blog/openbsd-gemini-server.gmi" rel="alternate"></link>
|
||
<content type="html">
|
||
|
||
|
||
|
||
<p>HTTPは比較的重いため、最近ではGeminiが徐々に人気を集めています。<br />
|
||
Linuxサーバーでの設置は比較的容易ですが、OpenBSDの場合はやや複雑になります。<br />
|
||
そこで今回は、OpenBSDでGeminiサーバーを設置する方法について説明します。</p>
|
||
<h2 id="gemini">Geminiとは?</h2>
|
||
<p><a href="gemini://gemini.circumlunar.space/">Geminiは極めてシンプルなウェブプロトコルです。</a><br />
|
||
GeminiはGopherとウェブの間隙を埋める新しいインターネットプロトコルとして、<br />
|
||
一方の問題を避けながら他方の制約を解決する事を目指して共同設計されました。<br />
|
||
Geminiカプセルへのアクセスには、特別なブラウザが必要となります。<br />
|
||
オススメのブラウザは以下の通りです(推奨順):<br />
|
||
<a href="https://gh.akisblack.dev/makew0rld/amfora">・Amfora(Go)</a><br />
|
||
<a href="https://bombadillo.colorfield.space/">・Bombadillo(Go)</a><br />
|
||
<a href="https://git.skyjake.fi/gemini/lagrange">・Lagrange(CとSDL)</a><br />
|
||
<a href="https://thelambdalab.xyz/elpher/">・Elpher(Emacs)</a><br />
|
||
<a href="https://gh.akisblack.dev/MasterQ32/kristall">・Kristall(C++とQt)</a><br />
|
||
<a href="https://git.sr.ht/~julienxx/castor">・Castor(RustとGTK)</a></p>
|
||
<h2 id="htmlcss">HTMLやCSSは使用可能?</h2>
|
||
<p>いいえ、使用する事は出来ません。<br />
|
||
Geminiでは、Gemitextのみがサポートされています。<br />
|
||
Gemitextはマークダウンのような形式で、機能性は限定的です。<br />
|
||
<a href="gemini://technicalsuwako.moe/">あたし自身もGeminiカプセルを運用していますので、ぜひご覧下さい。</a><br />
|
||
<a href="https://gitler.moe/suwako/technicalsuwako.moe/raw/branch/master/gemini/blog/c-lib-in-zig-use.gmi">良いGemtextファイルの例はこちらです。</a></p>
|
||
<h2 id="heading">画像は?</h2>
|
||
<p>画像の利用は可能ですが、ブラウザ上で表示する事は出来ません。<br />
|
||
しかし、画像へのリンクを提供すれば、外部の画像表示ソフトで開く事が出来ます。</p>
|
||
<h2 id="gmnxd">gmnxdとは?</h2>
|
||
<p><a href="https://lab.abiscuola.org/gmnxd/doc/trunk/www/index.wiki">gmnxdはOpenBSD用のGeminiサーバーソフトウェアです。</a><br />
|
||
ここではその設置方法を解説します。<br />
|
||
HTTPウェブサイトと同一のサーバーでホスティングする事も可能です。</p>
|
||
<h2 id="heading-1">基本的な設置</h2>
|
||
<p>例としてのドメインは「unkotinko.jp」を用いて説明します。</p>
|
||
<pre><code lang="">doas su -l
|
||
wget https://lab.abiscuola.org/gmnxd/tarball/v1.2.0/gmnxd-v1.2.0.tar.gz
|
||
tar zxfv gmnxd-v1.2.0.tar.gz
|
||
<span style="color:#a2f">cd</span> gmnxd-v1.2.0/src
|
||
make
|
||
make install
|
||
mkdir -p /var/gemini/unkotinko.jp
|
||
useradd -g <span style="color:#b44">&#39;=uid&#39;</span> -L daemon -s /sbin/nologin -c <span style="color:#b44">&#39;Gmnxd user&#39;</span> -d /var/gemini _gmnxd
|
||
chown -R _gmnxd:_gmnxd /var/gemini
|
||
chown -R suwako:suwako /var/gemini/unkotinko.jp
|
||
</code></pre><h2 id="inetd">inetd</h2>
|
||
<pre><code lang="">nvim /etc/inetd.conf
|
||
</code></pre><pre><code lang="">127.0.0.1:11965 stream tcp nowait _gmnxd /usr/local/libexec/gmnxd gmnxd
|
||
</code></pre><pre><code lang="">rcctl <span style="color:#a2f">enable</span> inetd
|
||
rcctl start inetd
|
||
</code></pre><h2 id="pf">pf</h2>
|
||
<pre><code lang="">nvim /etc/pf.conf
|
||
</code></pre><pre><code lang="">...
|
||
# Gemini
|
||
pass in on egress proto tcp from any to any port { 1965 }
|
||
...
|
||
anchor &#34;relayd/*&#34;
|
||
</code></pre><pre><code lang="">pfctl -f /etc/pf.conf
|
||
</code></pre><h2 id="relayd">relayd</h2>
|
||
<pre><code lang="">nvim /etc/relayd.conf
|
||
</code></pre><pre><code lang="">...
|
||
protocol gemini {
|
||
tcp { sack, backlog 128 }
|
||
tls keypair &#34;unkotinko.jp&#34;
|
||
}
|
||
...
|
||
relay gemini {
|
||
listen on 0.0.0.0 port 1965 tls
|
||
protocol gemini
|
||
|
||
forward to &lt;home&gt; check tcp port 11965
|
||
}
|
||
</code></pre><pre><code lang="">rcctl restart relayd
|
||
</code></pre><h2 id="heading-2">カプセルの内容</h2>
|
||
<p>新たなカプセルを追加するには、「/var/gemini」内にドメイン名のフォルダを作成して下さい。<br />
|
||
例えば、「dekkailolioppai.com」向けのカプセルを作成する場合、<br />
|
||
<code lang="">mkdir /var/gemini/dekkailolioppai.com &amp;&amp; touch /var/gemini/dekkailolioppai.com/index.gmi</code>を実行して下さい。</p>
|
||
<p>そのindex.gmiファイルの中に、サンプルページを作成しましょう。</p>
|
||
<pre><code lang=""># でっかいロリおっぱい
|
||
Hな日本人である。
|
||
こんちゃっす!!
|
||
|
||
&gt; こんにちは!!
|
||
&gt; あれあれあれ!?元気でないぞ!?
|
||
&gt; もう一回、みんな!カンボジア!!
|
||
|
||
=&gt; https://youtube.owacon.moe/watch?v=NXnI1Jj0h_8 元ネタ
|
||
</code></pre><p>Geminiブラウザで「gemini://dekkailolioppai.com」にアクセスすると、上記の内容が表示されます。</p>
|
||
<p>以上</p>
|
||
|
||
|
||
</content>
|
||
</entry>
|
||
|
||
<entry>
|
||
<id>blog/libreredirect-262.gmi</id>
|
||
<author><name>凛</name></author>
|
||
<title type="html">【076】Libre Redirect 2.6.2登場</title>
|
||
<published>2023-05-30T00:00:00Z</published>
|
||
|
||
<category term="jp"></category>
|
||
|
||
<category term="blog"></category>
|
||
|
||
<category term="ブラウザ拡張"></category>
|
||
|
||
<category term="076"></category>
|
||
|
||
<category term="libreredirect"></category>
|
||
|
||
<link href="gemini://technicalsuwako.moe/blog/libreredirect-262.gmi" rel="alternate"></link>
|
||
<content type="html">
|
||
|
||
|
||
|
||
<h2 id="libre-redirect">Libre Redirectって何?</h2>
|
||
<p>Libre RedirectはLibRedirectのフォークです。<br />
|
||
<a href="https://github.com/libredirect/browser_extension/issues/693">Vixipを追加依頼を送ったら、「NSFW」オプションの追加とデフォルトは無効にするって条件があるようでした。</a><br />
|
||
Pixivで、9割のイラストはNSFWですので、検閲として扱います。<br />
|
||
検閲を大嫌いから、Libre Redirectを作りました。</p>
|
||
<h2 id="heading">ソースコード</h2>
|
||
<p><a href="https://gitler.moe/suwako/libreredirect">Gitler</a></p>
|
||
<p>以上</p>
|
||
|
||
|
||
</content>
|
||
</entry>
|
||
|
||
<entry>
|
||
<id>blog/diff-zig-rust.gmi</id>
|
||
<author><name>凛</name></author>
|
||
<title type="html">【プログラミング】RustとZigの違い</title>
|
||
<published>2023-05-24T21:00:00Z</published>
|
||
|
||
<category term="jp"></category>
|
||
|
||
<category term="blog"></category>
|
||
|
||
<category term="Zig"></category>
|
||
|
||
<category term="Rust"></category>
|
||
|
||
<category term="システム開発"></category>
|
||
|
||
<link href="gemini://technicalsuwako.moe/blog/diff-zig-rust.gmi" rel="alternate"></link>
|
||
<content type="html">
|
||
|
||
|
||
|
||
<h2 id="zig">Zigとは?</h2>
|
||
<p><a href="https://ziglang.org/ja/">Zig</a>は、隠れた制御フローや隠れたメモリ割り当て、プリプロセッサやマクロがないシステムプログラミング用言語です。<br />
|
||
アセンブリ言語よりも読みやすく、C言語よりも細かい制御が可能なため、アセンブリ言語よりは高水準でありながらC言語よりは低水準な言語と言えます。<br />
|
||
エラーを修正するまでエディタを終了することを防ぐので、C言語より安全だと言えます。<br />
|
||
新世代のC言語になり得るポテンシャルが非常に高いと思います。<br />
|
||
新しい言語ながら、特に日本人と中国人の開発者に人気があります。<br />
|
||
また、日本発の派生言語である<a href="https://web.archive.org/web/20220201164721/https://zen-lang.org/ja-JP/community/">Zen言語</a>もありますが、<a href="https://www.gnu.org/proprietary/proprietary.ja.html">プロプライエタリ・ソフトウェア</a>であるため、特に推奨はできません。</p>
|
||
<h2 id="rust">Rustとは?</h2>
|
||
<p><a href="https://www.rust-lang.org/ja/">Rust</a>は、メモリ安全性とスレッド安全性を保証するシステムプログラミング用の言語です。<br />
|
||
Rustではメモリ安全性とスレッド安全性が重要なポイントとなっています。<br />
|
||
Linux Kernel 6.1以降ではカーネルにRustコンパイラが含まれています。<br />
|
||
低水準言語でありながら、Rustは非常に高水準な言語であるPythonで作られているようです。<br />
|
||
比較すると、Zigが新世代のC言語に、Rustが新世代のC++言語になろうとしていると言えます。<br />
|
||
Rustは、特に<a href="https://archive.is/IF1yS">LGBTというテロリスト</a>が多くの欧米で大人気です。</p>
|
||
<h2 id="rust-1">Rustのメリット</h2>
|
||
<ul>
|
||
<li>安定して動作するソフトウェアを作りやすい</li>
|
||
<li>豊富なコミュニティと充実したサポート(<a href="https://youtube.owacon.moe/watch?v=DsBaC3_S-As">いっぱいおっぱい、僕元気♪</a>)</li>
|
||
<li>海外で働くフリーランサーにとって、仕事が多い</li>
|
||
</ul>
|
||
<h2 id="rust-2">Rustのデメリット</h2>
|
||
<ul>
|
||
<li>BSD(特にOpenBSDとNetBSD)に対応していない</li>
|
||
<li>全ての機能性が従属ソフトとして扱われる</li>
|
||
<li>コンパイルが非常に遅い</li>
|
||
<li>バイナリサイズが大きい(Go言語のバイナリも大きいが、それは高水準言語である為理解出来る)</li>
|
||
<li>奇妙なライブラリでリンクされている(Zigのデメリットの後で説明する)</li>
|
||
<li>大きな変化が速すぎる</li>
|
||
<li>大きな変更が頻繁に行われる</li>
|
||
<li><a href="https://www.rust-lang.org/ja/policies/code-of-conduct">行動規範が存在する</a></li>
|
||
<li><a href="https://www.rust-lang.org/ja/policies">法律に関する問題が多い</a></li>
|
||
</ul>
|
||
<h2 id="zig-1">Zigのメリット</h2>
|
||
<ul>
|
||
<li>書きやすい</li>
|
||
<li>テスト機能が付いている</li>
|
||
<li><a href="/blog/c-lib-in-zig-use/">CとC++のライブラリを利用出来る</a></li>
|
||
<li>ZigコンパイラはC言語やC++言語のコードもコンパイル出来る</li>
|
||
<li>エラーを保存しながら報告する</li>
|
||
</ul>
|
||
<h2 id="zig-2">Zigのデメリット</h2>
|
||
<ul>
|
||
<li>実験段階のソフト</li>
|
||
<li>利用者が少ない為、サポートも少ない</li>
|
||
<li>リンターが強制される</li>
|
||
<li><a href="https://raw.githubusercontent.com/ziglang/zig/master/.github/CODE_OF_CONDUCT.md">行動規範が存在する</a></li>
|
||
</ul>
|
||
<h2 id="rust-vs-zig">Rustのバイナリ VS Zigのバイナリ</h2>
|
||
<p>一緒にやりましょう!!</p>
|
||
<pre><code lang="">mkdir -p ~/tmp/<span style="color:#666">{</span>rust,zig<span style="color:#666">}</span>
|
||
<span style="color:#a2f">cd</span> ~/tmp/rust
|
||
cargo init
|
||
cargo build
|
||
<span style="color:#a2f">cd</span> ../zig
|
||
zig init-exe
|
||
zig build
|
||
</code></pre><h3 id="zig-3">まずはZigのバイナリを確認します</h3>
|
||
<pre><code lang=""><span style="color:#080;font-style:italic"># ./zig-out/bin/zig</span>
|
||
All your codebase are belong to us.
|
||
Run <span style="color:#b44">`</span>zig build <span style="color:#a2f">test</span><span style="color:#b44">`</span> to run the tests.
|
||
|
||
<span style="color:#080;font-style:italic"># ls -thal ./zig-out/bin/zig</span>
|
||
-rwxr-xr-x <span style="color:#666">1</span> suwako suwako 962K 5月 <span style="color:#666">24</span> 20:36 ./zig-out/bin/zig
|
||
|
||
<span style="color:#080;font-style:italic"># file ./zig-out/bin/zig</span>
|
||
./zig-out/bin/zig: ELF 64-bit LSB executable, x86-64, version <span style="color:#666">1</span> <span style="color:#666">(</span>SYSV<span style="color:#666">)</span>, statically linked, with debug_info, not stripped
|
||
|
||
<span style="color:#080;font-style:italic"># ldd ./zig-out/bin/zig</span>
|
||
動的実行ファイルではありません
|
||
</code></pre><p>静的バイナリ(バイナリだけを別のコンピュータにコピーすれば、実行できる)でありながら、サイズはわずか962キビバイトです。<br />
|
||
しかし、まだデバッグ情報が含まれています。<br />
|
||
それを削除すると、サイズはどうなるでしょう?</p>
|
||
<pre><code lang=""><span style="color:#080;font-style:italic"># strip ./zig-out/bin/zig &amp;&amp; ls -thal ./zig-out/bin/zig</span>
|
||
-rwxr-xr-x <span style="color:#666">1</span> suwako suwako 374K 5月 <span style="color:#666">24</span> 20:42 ./zig-out/bin/zig
|
||
</code></pre><p>驚くほど小さいですね!</p>
|
||
<h3 id="rust-3">次はRustのバイナリ</h3>
|
||
<pre><code lang=""><span style="color:#080;font-style:italic"># ls -thal ./target/debug/rust</span>
|
||
-rwxr-xr-x <span style="color:#666">2</span> suwako suwako 9.5M 5月 <span style="color:#666">24</span> 20:16 ./target/debug/rust
|
||
|
||
<span style="color:#080;font-style:italic"># file ./target/debug/rust</span>
|
||
./target/debug/rust: ELF 64-bit LSB pie executable, x86-64, version <span style="color:#666">1</span> <span style="color:#666">(</span>SYSV<span style="color:#666">)</span>, dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID<span style="color:#666">[</span>sha1<span style="color:#666">]=</span>4fd652bc3852eda0ef3d5281c51ef947e4ecb740, <span style="color:#a2f;font-weight:bold">for</span> GNU/Linux 4.4.0, with debug_info, not stripped
|
||
|
||
<span style="color:#080;font-style:italic"># ldd ./target/debug/rust</span>
|
||
linux-vdso.so.1 <span style="color:#666">(</span>0x00007ffefa4f9000<span style="color:#666">)</span>
|
||
libgcc_s.so.1 <span style="color:#666">=</span>&gt; /usr/lib/libgcc_s.so.1 <span style="color:#666">(</span>0x00007fade07fd000<span style="color:#666">)</span>
|
||
libc.so.6 <span style="color:#666">=</span>&gt; /usr/lib/libc.so.6 <span style="color:#666">(</span>0x00007fade0616000<span style="color:#666">)</span>
|
||
/lib64/ld-linux-x86-64.so.2 <span style="color:#666">=</span>&gt; /usr/lib64/ld-linux-x86-64.so.2 <span style="color:#666">(</span>0x00007fade08a4000<span style="color:#666">)</span>
|
||
</code></pre><p>なぜlibcとlibgccを含めるのでしょうか?<br />
|
||
そして、「linux-vdso」とは何でしょうか?<br />
|
||
先に「奇妙な依存ソフトウェア」と述べた時、これを指していました。<br />
|
||
また、なぜ「Hello, World!」だけを出力するソフトウェアが9.5メビバイトも必要なのでしょう?<br />
|
||
Zigのバイナリは静的であることを覚えていますか?<br />
|
||
Rustは動的であるため、さらに奇妙に感じます。</p>
|
||
<p>デバッグ情報を削除すると…</p>
|
||
<pre><code lang=""><span style="color:#080;font-style:italic"># strip ./target/debug/rust &amp;&amp; ls -thal ./target/debug/rust</span>
|
||
-rwxr-xr-x <span style="color:#666">2</span> suwako suwako 319K 5月 <span style="color:#666">24</span> 20:50 ./target/debug/rust
|
||
</code></pre><p>結果はそこまで悪くありませんね。<br />
|
||
しかし、バイナリは動的なので、他のコンピュータにコピーした場合、ライブラリが異なるフォルダに入っていたり、存在しない場合、実行できません(例えば、ArtixでコンパイルしたものがDevuanで実行できない可能性がある)。</p>
|
||
<p>以上</p>
|
||
|
||
|
||
</content>
|
||
</entry>
|
||
|
||
<entry>
|
||
<id>blog/spliti-110.gmi</id>
|
||
<author><name>凛</name></author>
|
||
<title type="html">【オワコンテック】spliti 1.1.0登場</title>
|
||
<published>2023-05-24T00:00:00Z</published>
|
||
|
||
<category term="jp"></category>
|
||
|
||
<category term="blog"></category>
|
||
|
||
<category term="ウエブ開発"></category>
|
||
|
||
<category term="オワコンテック"></category>
|
||
|
||
<category term="spliti"></category>
|
||
|
||
<link href="gemini://technicalsuwako.moe/blog/spliti-110.gmi" rel="alternate"></link>
|
||
<content type="html">
|
||
|
||
|
||
|
||
<h2 id="spliti">splitiって何?</h2>
|
||
<p>splitiはMixiのフェイクニュース部分向けプライバシーUIです。</p>
|
||
<h2 id="heading">変更</h2>
|
||
<ul>
|
||
<li>画像はimgproxy化</li>
|
||
<li>カテゴリーを追加</li>
|
||
<li>ホームページを追加(普通Mixiにアクセスするのは不要になった)</li>
|
||
</ul>
|
||
<h2 id="heading-1">ソースコード</h2>
|
||
<p><a href="https://gitler.moe/suwako/spliti">Gitler</a></p>
|
||
<h2 id="heading-2">公式インスタンス</h2>
|
||
<p>一般ネット: <a href="https://mixi.owacon.moe/">https://mixi.owacon.moe/</a></p>
|
||
<p>以上</p>
|
||
|
||
|
||
</content>
|
||
</entry>
|
||
|
||
<entry>
|
||
<id>blog/c-lib-in-zig-use.gmi</id>
|
||
<author><name>凛</name></author>
|
||
<title type="html">【プログラミング】Zig言語を使ってC向けのライブラリを利用する方法</title>
|
||
<published>2023-05-18T00:00:00Z</published>
|
||
|
||
<category term="jp"></category>
|
||
|
||
<category term="blog"></category>
|
||
|
||
<category term="ゲーム開発"></category>
|
||
|
||
<category term="Zig"></category>
|
||
|
||
<category term="C言語"></category>
|
||
|
||
<category term="SDL"></category>
|
||
|
||
<link href="gemini://technicalsuwako.moe/blog/c-lib-in-zig-use.gmi" rel="alternate"></link>
|
||
<content type="html">
|
||
|
||
|
||
|
||
<p>ゲーム開発といえば、C++やUnity、Unreal等がが頭に浮かびますね。<br />
|
||
しかし、新しい言語であるZigを使う事をお勧めします。<br />
|
||
新しい言語だからと言って、必要なライブラリ(SDL、VulkanやOpenGL等)は存在しないと思うかもしんが。心配は無用です。<br />
|
||
Zig言語の大きなメリットは、C言語及びC++のライブラリをそのまま利用出来る事です!</p>
|
||
<p><a href="https://repology.org/project/zig/versions">まずはZigコンパイラをインストールしましょう。</a></p>
|
||
<pre><code lang="">mkdir zigdev <span style="color:#666">&amp;&amp;</span> <span style="color:#a2f">cd</span> zigdev
|
||
nvim main.zig
|
||
</code></pre><p>以下に示すソースコードを使用します。<br />
|
||
まずは内容を確認し、何が起こるかを予想してみて下さい。</p>
|
||
<pre><code lang=""><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><span style="color:#a2f;font-weight:bold">const</span><span style="color:#bbb"> </span>c<span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span><span style="color:#a2f">@cImport</span>({<span style="color:#bbb">
|
||
</span><span style="color:#bbb"> </span><span style="color:#a2f">@cInclude</span>(<span style="color:#b44">&#34;SDL2/SDL.h&#34;</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">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:#a2f;font-weight:bold">if</span><span style="color:#bbb"> </span>(c.SDL_Init(c.SDL_INIT_VIDEO)<span style="color:#bbb"> </span><span style="color:#666">!=</span><span style="color:#bbb"> </span><span style="color:#666">0</span>)<span style="color:#bbb"> </span>{<span style="color:#bbb">
|
||
</span><span style="color:#bbb"> </span>c.SDL_Log(<span style="color:#b44">&#34;開始失敗: %s&#34;</span>,<span style="color:#bbb"> </span>c.SDL_GetError());<span style="color:#bbb">
|
||
</span><span style="color:#bbb"> </span><span style="color:#a2f;font-weight:bold">return</span><span style="color:#bbb"> </span><span style="color:#a2f;font-weight:bold">error</span>.SDLInitializationFailed;<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">// defer = 終了する時、実行すると意味だ。
|
||
</span><span style="color:#080;font-style:italic"></span><span style="color:#bbb"> </span><span style="color:#a2f;font-weight:bold">defer</span><span style="color:#bbb"> </span>c.SDL_Quit();<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>window<span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span>c.SDL_CreateWindow(<span style="color:#b44">&#34;hellow&#34;</span>,<span style="color:#bbb"> </span>c.SDL_WINDOWPOS_CENTERED,<span style="color:#bbb"> </span>c.SDL_WINDOWPOS_CENTERED,<span style="color:#bbb"> </span><span style="color:#666">640</span>,<span style="color:#bbb"> </span><span style="color:#666">400</span>,<span style="color:#bbb"> </span>c.SDL_WINDOW_OPENGL)<span style="color:#bbb"> </span><span style="color:#a2f;font-weight:bold">orelse</span><span style="color:#bbb"> </span>{<span style="color:#bbb">
|
||
</span><span style="color:#bbb"> </span>c.SDL_Log(<span style="color:#b44">&#34;ウィンドウ創作失敗: %s&#34;</span>,<span style="color:#bbb"> </span>c.SDL_GetError());<span style="color:#bbb">
|
||
</span><span style="color:#bbb"> </span><span style="color:#a2f;font-weight:bold">return</span><span style="color:#bbb"> </span><span style="color:#a2f;font-weight:bold">error</span>.SDLInitializationFailed;<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">defer</span><span style="color:#bbb"> </span>c.SDL_DestroyWindow(window);<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>renderer<span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span>c.SDL_CreateRenderer(window,<span style="color:#bbb"> </span><span style="color:#666">0</span>,<span style="color:#bbb"> </span>c.SDL_RENDERER_PRESENTVSYNC)<span style="color:#bbb"> </span><span style="color:#a2f;font-weight:bold">orelse</span><span style="color:#bbb"> </span>{<span style="color:#bbb">
|
||
</span><span style="color:#bbb"> </span>c.SDL_Log(<span style="color:#b44">&#34;レンダー創作失敗: %s&#34;</span>,<span style="color:#bbb"> </span>c.SDL_GetError());<span style="color:#bbb">
|
||
</span><span style="color:#bbb"> </span><span style="color:#a2f;font-weight:bold">return</span><span style="color:#bbb"> </span><span style="color:#a2f;font-weight:bold">error</span>.SDLInitializationFailed;<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">defer</span><span style="color:#bbb"> </span>c.SDL_DestroyRenderer(renderer);<span style="color:#bbb">
|
||
</span><span style="color:#bbb">
|
||
</span><span style="color:#bbb"> </span>mainloop<span style="color:#666">:</span><span style="color:#bbb"> </span><span style="color:#a2f;font-weight:bold">while</span><span style="color:#bbb"> </span>(<span style="color:#a2f;font-weight:bold">true</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>sdl_event<span style="color:#666">:</span><span style="color:#bbb"> </span>c.SDL_Event<span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span><span style="color:#a2f;font-weight:bold">undefined</span>;<span style="color:#bbb">
|
||
</span><span style="color:#bbb"> </span><span style="color:#a2f;font-weight:bold">while</span><span style="color:#bbb"> </span>(c.SDL_PollEvent(<span style="color:#666">&amp;</span>sdl_event)<span style="color:#bbb"> </span><span style="color:#666">!=</span><span style="color:#bbb"> </span><span style="color:#666">0</span>)<span style="color:#bbb"> </span>{<span style="color:#bbb">
|
||
</span><span style="color:#bbb"> </span><span style="color:#a2f;font-weight:bold">switch</span><span style="color:#bbb"> </span>(sdl_event.<span style="color:#0b0;font-weight:bold">type</span>)<span style="color:#bbb"> </span>{<span style="color:#bbb">
|
||
</span><span style="color:#bbb"> </span>c.SDL_QUIT<span style="color:#bbb"> </span><span style="color:#666">=&gt;</span><span style="color:#bbb"> </span><span style="color:#a2f;font-weight:bold">break</span><span style="color:#bbb"> </span><span style="color:#666">:</span>mainloop,<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:#666">=&gt;</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:#bbb">
|
||
</span><span style="color:#bbb">
|
||
</span><span style="color:#bbb"> </span>_<span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span>c.SDL_SetRenderDrawColor(renderer,<span style="color:#bbb"> </span><span style="color:#666">0xff</span>,<span style="color:#bbb"> </span><span style="color:#666">0xff</span>,<span style="color:#bbb"> </span><span style="color:#666">0xff</span>,<span style="color:#bbb"> </span><span style="color:#666">0xff</span>);<span style="color:#bbb">
|
||
</span><span style="color:#bbb"> </span>_<span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span>c.SDL_RenderClear(renderer);<span style="color:#bbb">
|
||
</span><span style="color:#bbb"> </span><span style="color:#a2f;font-weight:bold">var</span><span style="color:#bbb"> </span>rect<span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span>c.SDL_Rect{<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">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</span>,<span style="color:#bbb"> </span>.w<span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span><span style="color:#666">60</span>,<span style="color:#bbb"> </span>.h<span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span><span style="color:#666">60</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>a<span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span><span style="color:#666">0.001</span><span style="color:#bbb"> </span><span style="color:#666">*</span><span style="color:#bbb"> </span><span style="color:#a2f">@intToFloat</span>(<span style="color:#0b0;font-weight:bold">f32</span>,<span style="color:#bbb"> </span>c.SDL_GetTicks());<span style="color:#bbb">
|
||
</span><span style="color:#bbb"> </span><span style="color:#a2f;font-weight:bold">const</span><span style="color:#bbb"> </span>t<span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span><span style="color:#666">2</span><span style="color:#bbb"> </span><span style="color:#666">*</span><span style="color:#bbb"> </span>std.math.pi<span style="color:#bbb"> </span><span style="color:#666">/</span><span style="color:#bbb"> </span><span style="color:#666">3.0</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>r<span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span><span style="color:#666">100</span><span style="color:#bbb"> </span><span style="color:#666">*</span><span style="color:#bbb"> </span><span style="color:#a2f">@cos</span>(<span style="color:#666">0.1</span><span style="color:#bbb"> </span><span style="color:#666">*</span><span style="color:#bbb"> </span>a);<span style="color:#bbb">
|
||
</span><span style="color:#bbb"> </span>rect.x<span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span><span style="color:#666">290</span><span style="color:#bbb"> </span><span style="color:#666">+</span><span style="color:#bbb"> </span><span style="color:#a2f">@floatToInt</span>(<span style="color:#0b0;font-weight:bold">i32</span>,<span style="color:#bbb"> </span>r<span style="color:#bbb"> </span><span style="color:#666">*</span><span style="color:#bbb"> </span><span style="color:#a2f">@cos</span>(a));<span style="color:#bbb">
|
||
</span><span style="color:#bbb"> </span>rect.y<span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span><span style="color:#666">170</span><span style="color:#bbb"> </span><span style="color:#666">+</span><span style="color:#bbb"> </span><span style="color:#a2f">@floatToInt</span>(<span style="color:#0b0;font-weight:bold">i32</span>,<span style="color:#bbb"> </span>r<span style="color:#bbb"> </span><span style="color:#666">*</span><span style="color:#bbb"> </span><span style="color:#a2f">@sin</span>(a));<span style="color:#bbb">
|
||
</span><span style="color:#bbb"> </span>_<span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span>c.SDL_SetRenderDrawColor(renderer,<span style="color:#bbb"> </span><span style="color:#666">0xff</span>,<span style="color:#bbb"> </span><span style="color:#666">0</span>,<span style="color:#bbb"> </span><span style="color:#666">0</span>,<span style="color:#bbb"> </span><span style="color:#666">0xff</span>);<span style="color:#bbb">
|
||
</span><span style="color:#bbb"> </span>_<span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span>c.SDL_RenderFillRect(renderer,<span style="color:#bbb"> </span><span style="color:#666">&amp;</span>rect);<span style="color:#bbb">
|
||
</span><span style="color:#bbb"> </span>rect.x<span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span><span style="color:#666">290</span><span style="color:#bbb"> </span><span style="color:#666">+</span><span style="color:#bbb"> </span><span style="color:#a2f">@floatToInt</span>(<span style="color:#0b0;font-weight:bold">i32</span>,<span style="color:#bbb"> </span>r<span style="color:#bbb"> </span><span style="color:#666">*</span><span style="color:#bbb"> </span><span style="color:#a2f">@cos</span>(a<span style="color:#bbb"> </span><span style="color:#666">+</span><span style="color:#bbb"> </span>t));<span style="color:#bbb">
|
||
</span><span style="color:#bbb"> </span>rect.y<span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span><span style="color:#666">170</span><span style="color:#bbb"> </span><span style="color:#666">+</span><span style="color:#bbb"> </span><span style="color:#a2f">@floatToInt</span>(<span style="color:#0b0;font-weight:bold">i32</span>,<span style="color:#bbb"> </span>r<span style="color:#bbb"> </span><span style="color:#666">*</span><span style="color:#bbb"> </span><span style="color:#a2f">@sin</span>(a<span style="color:#bbb"> </span><span style="color:#666">+</span><span style="color:#bbb"> </span>t));<span style="color:#bbb">
|
||
</span><span style="color:#bbb"> </span>_<span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span>c.SDL_SetRenderDrawColor(renderer,<span style="color:#bbb"> </span><span style="color:#666">0</span>,<span style="color:#bbb"> </span><span style="color:#666">0xff</span>,<span style="color:#bbb"> </span><span style="color:#666">0</span>,<span style="color:#bbb"> </span><span style="color:#666">0xff</span>);<span style="color:#bbb">
|
||
</span><span style="color:#bbb"> </span>_<span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span>c.SDL_RenderFillRect(renderer,<span style="color:#bbb"> </span><span style="color:#666">&amp;</span>rect);<span style="color:#bbb">
|
||
</span><span style="color:#bbb"> </span>rect.x<span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span><span style="color:#666">290</span><span style="color:#bbb"> </span><span style="color:#666">+</span><span style="color:#bbb"> </span><span style="color:#a2f">@floatToInt</span>(<span style="color:#0b0;font-weight:bold">i32</span>,<span style="color:#bbb"> </span>r<span style="color:#bbb"> </span><span style="color:#666">*</span><span style="color:#bbb"> </span><span style="color:#a2f">@cos</span>(a<span style="color:#bbb"> </span><span style="color:#666">+</span><span style="color:#bbb"> </span><span style="color:#666">2</span><span style="color:#bbb"> </span><span style="color:#666">*</span><span style="color:#bbb"> </span>t));<span style="color:#bbb">
|
||
</span><span style="color:#bbb"> </span>rect.y<span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span><span style="color:#666">170</span><span style="color:#bbb"> </span><span style="color:#666">+</span><span style="color:#bbb"> </span><span style="color:#a2f">@floatToInt</span>(<span style="color:#0b0;font-weight:bold">i32</span>,<span style="color:#bbb"> </span>r<span style="color:#bbb"> </span><span style="color:#666">*</span><span style="color:#bbb"> </span><span style="color:#a2f">@sin</span>(a<span style="color:#bbb"> </span><span style="color:#666">+</span><span style="color:#bbb"> </span><span style="color:#666">2</span><span style="color:#bbb"> </span><span style="color:#666">*</span><span style="color:#bbb"> </span>t));<span style="color:#bbb">
|
||
</span><span style="color:#bbb"> </span>_<span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span>c.SDL_SetRenderDrawColor(renderer,<span style="color:#bbb"> </span><span style="color:#666">0</span>,<span style="color:#bbb"> </span><span style="color:#666">0</span>,<span style="color:#bbb"> </span><span style="color:#666">0xff</span>,<span style="color:#bbb"> </span><span style="color:#666">0xff</span>);<span style="color:#bbb">
|
||
</span><span style="color:#bbb"> </span>_<span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span>c.SDL_RenderFillRect(renderer,<span style="color:#bbb"> </span><span style="color:#666">&amp;</span>rect);<span style="color:#bbb">
|
||
</span><span style="color:#bbb"> </span>c.SDL_RenderPresent(renderer);<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></code></pre><p><img src="https://ass.technicalsuwako.moe/Screenshot_20230518_215802.png" alt="" /></p>
|
||
<p>特に以下のコードをご覧下さい。</p>
|
||
<pre><code lang=""><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><span style="color:#a2f;font-weight:bold">const</span><span style="color:#bbb"> </span>c<span style="color:#bbb"> </span><span style="color:#666">=</span><span style="color:#bbb"> </span><span style="color:#a2f">@cImport</span>({<span style="color:#bbb">
|
||
</span><span style="color:#bbb"> </span><span style="color:#a2f">@cInclude</span>(<span style="color:#b44">&#34;SDL2/SDL.h&#34;</span>);<span style="color:#bbb">
|
||
</span><span style="color:#bbb"></span>});<span style="color:#bbb">
|
||
</span></code></pre><p>@importはZig言語のライブラリーのインクルードする為の物で、@cImportはC言語のライブラリのインクルードする為の物です。<br />
|
||
<code lang="">#DEFINE</code>と同じ役割を果たすのが、<code lang="">@cDefine</code>です。<br />
|
||
例えば:</p>
|
||
<pre><code lang=""><span style="color:#a2f">@cDefine</span>(<span style="color:#b44">&#34;_GNU_SOURCE&#34;</span>,<span style="color:#bbb"> </span>{})<span style="color:#bbb">
|
||
</span></code></pre><p>@cImportの後しろでは、「c.何々」でC言語の関数等を利用する事が出来ます。<br />
|
||
例えば:</p>
|
||
<pre><code lang=""><span style="color:#bbb"> </span><span style="color:#a2f;font-weight:bold">if</span><span style="color:#bbb"> </span>(c.SDL_Init(c.SDL_INIT_VIDEO)<span style="color:#bbb"> </span><span style="color:#666">!=</span><span style="color:#bbb"> </span><span style="color:#666">0</span>)<span style="color:#bbb"> </span>{<span style="color:#bbb">
|
||
</span><span style="color:#bbb"> </span>c.SDL_Log(<span style="color:#b44">&#34;開始失敗: %s&#34;</span>,<span style="color:#bbb"> </span>c.SDL_GetError());<span style="color:#bbb">
|
||
</span><span style="color:#bbb"> </span><span style="color:#a2f;font-weight:bold">return</span><span style="color:#bbb"> </span><span style="color:#a2f;font-weight:bold">error</span>.SDLInitializationFailed;<span style="color:#bbb">
|
||
</span><span style="color:#bbb"> </span>}<span style="color:#bbb">
|
||
</span></code></pre><p>コンパイルするには:</p>
|
||
<pre><code lang="">zig build-exe main.zig -O ReleaseSmall --name rei --library SDL2 --library SDL2main --library c -isystem <span style="color:#b44">&#34;/usr/include&#34;</span> -L <span style="color:#b44">&#34;/usr/lib&#34;</span>
|
||
</code></pre><p>以上</p>
|
||
|
||
|
||
</content>
|
||
</entry>
|
||
|
||
|
||
</feed>
|