technicalsuwako.moe/gemini/blog.atom

486 行
48 KiB
XML
Raw Blame 履歴

このファイルには曖昧(ambiguous)なUnicode文字が含まれています

このファイルには、他の文字と見間違える可能性があるUnicode文字が含まれています。 それが意図的なものと考えられる場合は、この警告を無視して構いません。 それらの文字を表示するにはエスケープボタンを使用します。

<?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-08-04T00:00:00Z</updated>
<author><name>テクニカル諏訪子</name></author>
<link href="gemini://technicalsuwako.moe" rel="alternate"></link>
<entry>
<id>blog/fix-broken-contact-form.gmi</id>
<author><name></name></author>
<title type="html">【ウェブ開発】正しい連絡フォームの作り方(クライアント側をぜったいに信用するな!!)</title>
<published>2023-08-04T00:00:00Z</published>
<category term="blog"></category>
<category term="jp"></category>
<category term="プログラミング"></category>
<category term="php"></category>
<category term="ウエブ開発"></category>
<category term="html"></category>
<category term="javascript"></category>
<link href="gemini://technicalsuwako.moe/blog/fix-broken-contact-form.gmi" rel="alternate"></link>
<content type="html">
&lt;h2 id=&#34;heading&#34;&gt;問題&lt;/h2&gt;
&lt;p&gt;現在の「モダン」ウェブ開発で、連絡フォームはJavascriptで制御されていますが、これは大きなリスクがあります。&lt;br /&gt;
その理由について、直ぐに説明します。&lt;/p&gt;
&lt;p&gt;以下のスクショをご覧いただいたら、何が問題は何だと思いますか?&lt;br /&gt;
&lt;a href=&#34;https://ass.technicalsuwako.moe/fuanform1.png&#34;&gt;&lt;img src=&#34;https://ass.technicalsuwako.moe/fuanform1.png&#34; alt=&#34;&#34; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;正解は:送信ボタンは&lt;code lang=&#34;&#34;&gt;&amp;lt;form&amp;gt;&lt;/code&gt;タグの外にある事です。&lt;br /&gt;
これでは、Javascriptを無効にした場合、送信ボタンをクリックする事が出来ません。&lt;/p&gt;
&lt;p&gt;このフォームを送信する為には、この送信ボタンをフォーム内に移動し、&lt;code lang=&#34;&#34;&gt;type=&amp;quot;button&amp;quot;&lt;/code&gt;&lt;code lang=&#34;&#34;&gt;type=&amp;quot;submit&amp;quot;&lt;/code&gt;に変更する事で、Javascriptなしでもフォームを送信する事が可能になります。&lt;br /&gt;
そんな感じ:&lt;br /&gt;
&lt;a href=&#34;https://ass.technicalsuwako.moe/fuanform2.png&#34;&gt;&lt;img src=&#34;https://ass.technicalsuwako.moe/fuanform2.png&#34; alt=&#34;&#34; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;そうして、入力画面で「required=&amp;quot;&amp;quot;」というパラメータがあり、これによりJavascriptが無効であってもフィールドが入力されているかどうかを確認できます。&lt;br /&gt;
例:&lt;br /&gt;
&lt;a href=&#34;https://ass.technicalsuwako.moe/fuanform3.png&#34;&gt;&lt;img src=&#34;https://ass.technicalsuwako.moe/fuanform3.png&#34; alt=&#34;&#34; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;しかし、このパラメータを削除すると、どのような事態が起こると思いますか?&lt;br /&gt;
正解はこちら:&lt;br /&gt;
&lt;a href=&#34;https://ass.technicalsuwako.moe/fuanform4.png&#34;&gt;&lt;img src=&#34;https://ass.technicalsuwako.moe/fuanform4.png&#34; alt=&#34;&#34; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;また、確認画面ではフォームが&lt;code lang=&#34;&#34;&gt;&amp;lt;input type=&amp;quot;hidden&amp;quot; /&amp;gt;&lt;/code&gt;タグを沢山含んでいます。&lt;br /&gt;
その中の「value=&amp;quot;&amp;quot;」部分を変更する事が可能です。&lt;br /&gt;
これにより、MySQLインジェクションも可能となります。&lt;/p&gt;
&lt;h2 id=&#34;heading-1&#34;&gt;解決策&lt;/h2&gt;
&lt;p&gt;上述の問題を解決する為には、サーバー側でのチェックが必要です。&lt;br /&gt;
勿論、クライアント側とサーバー側の両方でチェックを行う事も可能です。&lt;/p&gt;
&lt;p&gt;例として、PHPの場合を紹介します(PHPを使用するフォームが多い為)&lt;/p&gt;
&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;&lt;span style=&#34;color:#666&#34;&gt;&amp;lt;?&lt;/span&gt;php
session_name(&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;formvals&amp;#34;&lt;/span&gt;);
session_start([
&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;cookie_httponly&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;true&lt;/span&gt;,
]);
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;empty&lt;/span&gt;(&lt;span style=&#34;color:#b8860b&#34;&gt;$_SESSION&lt;/span&gt;[&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;csrf_token&amp;#34;&lt;/span&gt;])) &lt;span style=&#34;color:#b8860b&#34;&gt;$_SESSION&lt;/span&gt;[&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;csrf_token&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; bin2hex(random_bytes(&lt;span style=&#34;color:#666&#34;&gt;32&lt;/span&gt;));
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#666&#34;&gt;!&lt;/span&gt;isset(&lt;span style=&#34;color:#b8860b&#34;&gt;$_SESSION&lt;/span&gt;[&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;step&amp;#34;&lt;/span&gt;])) &lt;span style=&#34;color:#b8860b&#34;&gt;$_SESSION&lt;/span&gt;[&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;step&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;;
&lt;span style=&#34;color:#b8860b&#34;&gt;$errmes&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; [];
&lt;span style=&#34;color:#b8860b&#34;&gt;$reqvals&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; [
&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;$_SESSION&lt;/span&gt;[&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#666&#34;&gt;??&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;,
&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;kana&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;$_SESSION&lt;/span&gt;[&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;kana&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#666&#34;&gt;??&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;,
];
&lt;span style=&#34;color:#b8860b&#34;&gt;$optvals&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; [
&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;url&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;$_SESSION&lt;/span&gt;[&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;url&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#666&#34;&gt;??&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;,
];
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;$_SERVER&lt;/span&gt;[&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;REQUEST_METHOD&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#666&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;) {
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#666&#34;&gt;!&lt;/span&gt;hash_equals(&lt;span style=&#34;color:#b8860b&#34;&gt;$_SESSION&lt;/span&gt;[&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;csrf_token&amp;#34;&lt;/span&gt;], &lt;span style=&#34;color:#b8860b&#34;&gt;$_POST&lt;/span&gt;[&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;csrf_token&amp;#34;&lt;/span&gt;])) {
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;die&lt;/span&gt;(&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;不正なCSRFトークン&amp;#34;&lt;/span&gt;);
}
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;$_SESSION&lt;/span&gt;[&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;step&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#666&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;) {
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;foreach&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;$reqvals&lt;/span&gt; &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;$k&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;$v&lt;/span&gt;) {
&lt;span style=&#34;color:#b8860b&#34;&gt;$_SESSION&lt;/span&gt;[&lt;span style=&#34;color:#b8860b&#34;&gt;$k&lt;/span&gt;] &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; filter_input(INPUT_POST, &lt;span style=&#34;color:#b8860b&#34;&gt;$k&lt;/span&gt;, FILTER_SANITIZE_STRING);
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;$_SESSION&lt;/span&gt;[&lt;span style=&#34;color:#b8860b&#34;&gt;$k&lt;/span&gt;]) &lt;span style=&#34;color:#b8860b&#34;&gt;$reqvals&lt;/span&gt;[&lt;span style=&#34;color:#b8860b&#34;&gt;$k&lt;/span&gt;] &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;$_SESSION&lt;/span&gt;[&lt;span style=&#34;color:#b8860b&#34;&gt;$k&lt;/span&gt;];
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;$errmes&lt;/span&gt;[] &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;$k&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;をご入力下さい。&amp;#34;&lt;/span&gt;;
}
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;foreach&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;$optvals&lt;/span&gt; &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;$k&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;$v&lt;/span&gt;) {
&lt;span style=&#34;color:#b8860b&#34;&gt;$_SESSION&lt;/span&gt;[&lt;span style=&#34;color:#b8860b&#34;&gt;$k&lt;/span&gt;] &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; filter_input(INPUT_POST, &lt;span style=&#34;color:#b8860b&#34;&gt;$k&lt;/span&gt;, FILTER_SANITIZE_STRING);
&lt;span style=&#34;color:#b8860b&#34;&gt;$optvals&lt;/span&gt;[&lt;span style=&#34;color:#b8860b&#34;&gt;$k&lt;/span&gt;] &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;$_SESSION&lt;/span&gt;[&lt;span style=&#34;color:#b8860b&#34;&gt;$k&lt;/span&gt;];
}
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;empty&lt;/span&gt;(&lt;span style=&#34;color:#b8860b&#34;&gt;$errmes&lt;/span&gt;)) &lt;span style=&#34;color:#b8860b&#34;&gt;$_SESSION&lt;/span&gt;[&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;step&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;2&lt;/span&gt;;
}
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#b8860b&#34;&gt;$_SESSION&lt;/span&gt;[&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;step&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#666&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;2&lt;/span&gt;) {
&lt;span style=&#34;color:#b8860b&#34;&gt;$_SESSION&lt;/span&gt;[&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;step&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;;
session_destroy();
header(&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;Location: /success.html&amp;#34;&lt;/span&gt;);
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;die&lt;/span&gt;();
}
}
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;else&lt;/span&gt; {
&lt;span style=&#34;color:#b8860b&#34;&gt;$_SESSION&lt;/span&gt;[&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;csrf_token&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; bin2hex(random_bytes(&lt;span style=&#34;color:#666&#34;&gt;32&lt;/span&gt;));
&lt;span style=&#34;color:#b8860b&#34;&gt;$_SESSION&lt;/span&gt;[&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;step&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;;
}
&lt;span style=&#34;color:#080&#34;&gt;?&amp;gt;&lt;/span&gt;&lt;span style=&#34;&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt;&amp;lt;!DOCTYPE html&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt;&amp;lt;html&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;head&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;meta charset=&amp;#34;utf-8&amp;#34; /&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;title&amp;gt;連絡フォーム&amp;lt;/title&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;/head&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;body&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt;&amp;lt;?php
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; if ($_SESSION[&amp;#34;step&amp;#34;] == 1) {
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; if (count($errmes) != 0) {
&lt;/span&gt;&lt;span style=&#34;&#34;&gt;?&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;ul style=&amp;#34;font-width: bolder; color: #f00; list-style: none;&amp;#34;&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt;&amp;lt;?php
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; foreach ($errmes as $e) {
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; echo &amp;#34;&amp;lt;li&amp;gt;&amp;#34;.$e.&amp;#34;&amp;lt;/li&amp;gt;&amp;#34;;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; }
&lt;/span&gt;&lt;span style=&#34;&#34;&gt;?&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;/ul&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt;&amp;lt;?php
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; }
&lt;/span&gt;&lt;span style=&#34;&#34;&gt;?&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;form method=&amp;#34;POST&amp;#34; action=&amp;#34;/contact.php&amp;#34;&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;input type=&amp;#34;hidden&amp;#34; name=&amp;#34;csrf_token&amp;#34; value=&amp;#34;&amp;lt;?= $_SESSION[&amp;#39;csrf_token&amp;#39;] ?&amp;gt;&amp;#34;&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;table&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;tbody&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;tr&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;td&amp;gt;お名前 (必須):&amp;lt;/td&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;td&amp;gt;&amp;lt;input placeholder=&amp;#34;山田 太郎&amp;#34; required=&amp;#34;&amp;#34; name=&amp;#34;name&amp;#34; type=&amp;#34;text&amp;#34; value=&amp;#34;&amp;lt;?= $reqvals[&amp;#34;name&amp;#34;] ?&amp;gt;&amp;#34; /&amp;gt;&amp;lt;/td&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;/tr&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;tr&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;td&amp;gt;お名前 (かな) (必須):&amp;lt;/td&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;td&amp;gt;&amp;lt;input placeholder=&amp;#34;やまだ たろう&amp;#34; required=&amp;#34;&amp;#34; name=&amp;#34;kana&amp;#34; type=&amp;#34;text&amp;#34; value=&amp;#34;&amp;lt;?= $reqvals[&amp;#34;kana&amp;#34;] ?&amp;gt;&amp;#34; /&amp;gt;&amp;lt;/td&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;/tr&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;tr&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;td&amp;gt;御社又は関連サイトのURL:&amp;lt;/td&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;td&amp;gt;&amp;lt;input placeholder=&amp;#34;https://076.moe/&amp;#34; name=&amp;#34;url&amp;#34; type=&amp;#34;text&amp;#34; value=&amp;#34;&amp;lt;?= $optvals[&amp;#34;url&amp;#34;] ?&amp;gt;&amp;#34; /&amp;gt;&amp;lt;/td&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;/tr&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;/tbody&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;/table&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;button&amp;gt;確認画面へ&amp;lt;/button&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;/form&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt;&amp;lt;?php
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; } else if ($_SESSION[&amp;#34;step&amp;#34;] == 2) {
&lt;/span&gt;&lt;span style=&#34;&#34;&gt;?&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;form method=&amp;#34;POST&amp;#34; action=&amp;#34;/contact.php&amp;#34;&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;input type=&amp;#34;hidden&amp;#34; name=&amp;#34;csrf_token&amp;#34; value=&amp;#34;&amp;lt;?= $_SESSION[&amp;#39;csrf_token&amp;#39;] ?&amp;gt;&amp;#34;&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; お名前 (必須): &amp;lt;?= $reqvals[&amp;#34;name&amp;#34;] ?&amp;gt;&amp;lt;br /&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; お名前 (かな) (必須): &amp;lt;?= $reqvals[&amp;#34;kana&amp;#34;] ?&amp;gt;&amp;lt;br /&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; 御社又は関連サイトのURL: &amp;lt;?= $optvals[&amp;#34;url&amp;#34;] ?&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;button&amp;gt;送信する&amp;lt;/button&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;/form&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt;&amp;lt;?php
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; } else {
&lt;/span&gt;&lt;span style=&#34;&#34;&gt;?&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;p&amp;gt;不明なエラー。&amp;lt;/p&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt;&amp;lt;?php
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; }
&lt;/span&gt;&lt;span style=&#34;&#34;&gt;?&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt; &amp;lt;/body&amp;gt;
&lt;/span&gt;&lt;span style=&#34;&#34;&gt;&amp;lt;/html&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;結果:&lt;br /&gt;
&lt;a href=&#34;https://ass.technicalsuwako.moe/anzenform1.png&#34;&gt;&lt;img src=&#34;https://ass.technicalsuwako.moe/anzenform1.png&#34; alt=&#34;&#34; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://ass.technicalsuwako.moe/anzenform2.png&#34;&gt;&lt;img src=&#34;https://ass.technicalsuwako.moe/anzenform2.png&#34; alt=&#34;&#34; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://ass.technicalsuwako.moe/anzenform3.png&#34;&gt;&lt;img src=&#34;https://ass.technicalsuwako.moe/anzenform3.png&#34; alt=&#34;&#34; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://ass.technicalsuwako.moe/anzenform4.png&#34;&gt;&lt;img src=&#34;https://ass.technicalsuwako.moe/anzenform4.png&#34; alt=&#34;&#34; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://ass.technicalsuwako.moe/anzenform5.png&#34;&gt;&lt;img src=&#34;https://ass.technicalsuwako.moe/anzenform5.png&#34; alt=&#34;&#34; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://ass.technicalsuwako.moe/anzenform6.png&#34;&gt;&lt;img src=&#34;https://ass.technicalsuwako.moe/anzenform6.png&#34; alt=&#34;&#34; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ねぇねぇー!&lt;br /&gt;
簡単でしょー!&lt;/p&gt;
&lt;p&gt;以上&lt;/p&gt;
</content>
</entry>
<entry>
<id>blog/zig-gengo-1.gmi</id>
<author><name></name></author>
<title type="html">【Zig言語】第部~基本的な紹介・セットアップ・「こんにちは、世界」</title>
<published>2023-08-01T00:00:00Z</published>
<category term="blog"></category>
<category term="jp"></category>
<category term="プログラミング"></category>
<category term="zig"></category>
<category term="システム開発"></category>
<link href="gemini://technicalsuwako.moe/blog/zig-gengo-1.gmi" rel="alternate"></link>
<content type="html">
&lt;h2 id=&#34;zig&#34;&gt;Zig言語シリーズ&lt;/h2&gt;
&lt;p&gt;このブログでは様々なプログラミング言語の使い方を紹介します。&lt;br /&gt;
主にZig、PHP、Go言語、C言語について解説し、更にはFLTK、Raylib、OpenGL等も取り上げます。&lt;/p&gt;
&lt;h2 id=&#34;zig-1&#34;&gt;Zig言語とは?&lt;/h2&gt;
&lt;p&gt;Zigは非常に新しい言語です。&lt;br /&gt;
Goが新しい形のPHP、Carbonが新しいC++、Kotlinが新しいJava、TypeScriptが新しいJavascript、Swiftが新しいObjective-Cのように、Zigは新しい形のC言語と考える事が出来ます。&lt;br /&gt;
初めて見ると、Zig言語は難しそうに見えますが、約1週間使ってみれば、そう難しくは感じなくなります。&lt;br /&gt;
現在、最新バージョンは0.10.1ですが、今週中には0.11.0のリリースが予定されています。&lt;br /&gt;
このシリーズではそのバージョンを使用します。&lt;/p&gt;
&lt;h2 id=&#34;czig&#34;&gt;C言語とZig言語の違いは?&lt;/h2&gt;
&lt;p&gt;C言語は16ビットの世代で作られましたが、Zigは64ビットの世代で作られたため、Zigの方がモダンな言語といえます。&lt;br /&gt;
Zig言語は、Rustのような安全性とGo言語のようなシンプルさを持っています。&lt;br /&gt;
コードの違いを以下で示します:&lt;/p&gt;
&lt;h3 id=&#34;c&#34;&gt;C&lt;/h3&gt;
&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;&lt;span style=&#34;color:#080&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#080&#34;&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#080&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#080&#34;&gt;&lt;/span&gt;
&lt;span style=&#34;color:#0b0;font-weight:bold&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#00a000&#34;&gt;tuika&lt;/span&gt; (&lt;span style=&#34;color:#0b0;font-weight:bold&#34;&gt;int&lt;/span&gt; a, &lt;span style=&#34;color:#0b0;font-weight:bold&#34;&gt;int&lt;/span&gt; b) {
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;return&lt;/span&gt; a &lt;span style=&#34;color:#666&#34;&gt;+&lt;/span&gt; b;
}
&lt;span style=&#34;color:#0b0;font-weight:bold&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#00a000&#34;&gt;main&lt;/span&gt; () {
&lt;span style=&#34;color:#0b0;font-weight:bold&#34;&gt;int&lt;/span&gt; a &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;;
&lt;span style=&#34;color:#0b0;font-weight:bold&#34;&gt;int&lt;/span&gt; b &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;2&lt;/span&gt;;
printf(&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;%d&lt;/span&gt;&lt;span style=&#34;color:#b62;font-weight:bold&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&lt;/span&gt;, tuika(a, b));
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;;
}
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;zig-2&#34;&gt;Zig&lt;/h3&gt;
&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;const&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;std&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#a2f&#34;&gt;@import&lt;/span&gt;(&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;std&amp;#34;&lt;/span&gt;);&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;fn&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;tuika(a&lt;span style=&#34;color:#666&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0b0;font-weight:bold&#34;&gt;u8&lt;/span&gt;,&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;b&lt;span style=&#34;color:#666&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0b0;font-weight:bold&#34;&gt;u8&lt;/span&gt;)&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0b0;font-weight:bold&#34;&gt;u8&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;{&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;return&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;a&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;b;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;}&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;pub&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;fn&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;main()&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;!&lt;/span&gt;&lt;span style=&#34;color:#0b0;font-weight:bold&#34;&gt;void&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;{&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;const&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;a&lt;span style=&#34;color:#666&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0b0;font-weight:bold&#34;&gt;u8&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;const&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;b&lt;span style=&#34;color:#666&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0b0;font-weight:bold&#34;&gt;u8&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;2&lt;/span&gt;;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;std.debug.print(&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;{d}&lt;/span&gt;&lt;span style=&#34;color:#b62;font-weight:bold&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;.{tuika(a,&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;b)});&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;}&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;よく見ると、スタイルは殆ど同じです。&lt;br /&gt;
ただし、main関数の戻り値はintではなくvoidになります。&lt;br /&gt;
そして、Zigではintが一つの型ではなく、様々なサイズ(u8~u128、i8~i128)があります。&lt;br /&gt;
また、C言語で「型名 変数名 = 値」や「戻り値の型名 関数名 (パラメータ)」と表現するところを、Zig言語では「変更可否 変数名: 型名 = 値」や「公開・非公開 fn 関数名(パラメータ) 戻り値の型名」と表現します。&lt;/p&gt;
&lt;h2 id=&#34;heading&#34;&gt;セットアップ&lt;/h2&gt;
&lt;p&gt;バージョン0.11.0がリリースされれば、パッケージマネージャからインストール出来る様になると思います。&lt;br /&gt;
そうでない場合は、以下のコマンドを実行してください。&lt;br /&gt;
まず、LLVM16以上が必要です。&lt;br /&gt;
それをインストールしたら、Zigをコンパイルする方法は&lt;/p&gt;
&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;&lt;span style=&#34;color:#a2f&#34;&gt;cd&lt;/span&gt; zig-*
mkdir build
&lt;span style=&#34;color:#a2f&#34;&gt;cd&lt;/span&gt; build
cmake .. -DZIG_STATIC_LLVM&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;ON -DCMAKE_PREFIX_PATH&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;/usr
make install -DPREFIX&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;/usr
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;注意あたしはCRUXでしかコンパイル出来ませんでした。&lt;br /&gt;
Artix、OpenBSD、FreeBSDでは失敗しました。&lt;br /&gt;
Devuanは確認していません。&lt;/p&gt;
&lt;p&gt;インストール後、新しいフォルダを作り、新しいプロジェクトを作成しましょう:&lt;/p&gt;
&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;mkdir hello
&lt;span style=&#34;color:#a2f&#34;&gt;cd&lt;/span&gt; hello
zig init-exe
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;現在のファイルは以下の様になります:&lt;/p&gt;
&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;.
├── build.zig
└── src
└── main.zig
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;そのまま&lt;code lang=&#34;&#34;&gt;zig build run&lt;/code&gt;を実行すると:&lt;/p&gt;
&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;# zig build run
All your codebase are belong to us.
Run `zig build test` to run the tests.
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;heading-1&#34;&gt;「こんにちは、世界!」&lt;/h2&gt;
&lt;p&gt;build.zigについては次の記事で紹介します。&lt;br /&gt;
まず、src/main.zigを開き、全て削除し、以下のコードを書いて下さい。&lt;/p&gt;
&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;const&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;std&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#a2f&#34;&gt;@import&lt;/span&gt;(&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;std&amp;#34;&lt;/span&gt;);&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;const&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;std.io&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;io;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;pub&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;fn&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;main()&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;!&lt;/span&gt;&lt;span style=&#34;color:#0b0;font-weight:bold&#34;&gt;void&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;{&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;const&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;stdout_file&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;io.getStdOut().writer();&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;var&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;bw&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;io.bufferedWriter(stdout_file);&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;const&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;stdout&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;bw.writer();&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;try&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;stdout.print(&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;こんにちは、世界!&lt;/span&gt;&lt;span style=&#34;color:#b62;font-weight:bold&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;.{});&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;try&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;bw.flush();&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;}&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;保存すると、以下のエラーが表示されます:&lt;/p&gt;
&lt;pre&gt;&lt;code lang=&#34;&#34;&gt; 1 main.zig|2 col 10| : error: expected &amp;#39;;&amp;#39; after declaration
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;はい、エラーがあると、それを修正するまでテキストエディターを閉じる事が出来ません。&lt;br /&gt;
エラーを直しましょう!&lt;/p&gt;
&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;const&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;io&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;std.io;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;// ioとstd.ioを交換しましょう。
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;heading-2&#34;&gt;ビルドと実行すると&lt;/h3&gt;
&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;# zig build run
こんにちは、世界!
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;heading-3&#34;&gt;コードの解説&lt;/h3&gt;
&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;const&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;std&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#a2f&#34;&gt;@import&lt;/span&gt;(&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;std&amp;#34;&lt;/span&gt;);&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;これにより、Zigの公式標準ライブラリを使用出来る様になります。&lt;/p&gt;
&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;const&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;io&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;std.io;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;これにより、ioコマンドをより簡単に実行出来る様になります。&lt;br /&gt;
例えば、「std.io.getStdOut().writer();」を「io.getStdOut().writer();」に短縮出来ます。&lt;br /&gt;
勿論、「const writer = std.io.getStdOut().writer();」と書く事も可能ですが、一度しか実行しないならばそれはもったいないです。&lt;/p&gt;
&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;pub&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;fn&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;main()&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;!&lt;/span&gt;&lt;span style=&#34;color:#0b0;font-weight:bold&#34;&gt;void&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;{}&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;pubは公開を意味し、fnは関数を意味します。&lt;br /&gt;
JavaやC#を使った経験があれば、「public function」の様な物です。&lt;br /&gt;
興味深い部分は「!void」です。&lt;br /&gt;
この「!」は「anyerror」と同じ意味を持ちます。&lt;br /&gt;
「void」だけであれば、戻り値の型はいつでもvoidですが、「!void」の場合は「エラーがあれば、そのエラーを返し、なければvoidになる」という意味になります。&lt;br /&gt;
とても便利だわー!!&lt;/p&gt;
&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;try&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;stdout.print(&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;こんにちは、世界!&lt;/span&gt;&lt;span style=&#34;color:#b62;font-weight:bold&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;.{});&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;最後に、この「try」は「このコマンドがメモリ上で安全であれば、実行してください」という意味を持ちます。&lt;br /&gt;
また、この「.{}」は常に必要です。&lt;br /&gt;
値を使う場合は、それを「.{}」の中に入れましょう。&lt;br /&gt;
例えば:&lt;/p&gt;
&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;const&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;age&lt;span style=&#34;color:#666&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0b0;font-weight:bold&#34;&gt;u8&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;20&lt;/span&gt;;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;const&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;name&lt;span style=&#34;color:#666&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;[]&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;const&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0b0;font-weight:bold&#34;&gt;u8&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;田中&amp;#34;&lt;/span&gt;;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;try&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;stdout.print(&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;{s}さん、{d}歳になったら、大人ですよ。&lt;/span&gt;&lt;span style=&#34;color:#b62;font-weight:bold&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;.{&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;name,&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;age&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;});&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;田中さん、20歳になったら、大人ですよ。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;生成されるバイナリはzig-out/binフォルダに格納されます。&lt;/p&gt;
&lt;p&gt;続く&lt;/p&gt;
</content>
</entry>
<entry>
<id>blog/urloli-220.gmi</id>
<author><name></name></author>
<title type="html">】URLロリ 2.2.0登場</title>
<published>2023-07-17T02:40:00Z</published>
<category term="jp"></category>
<category term="blog"></category>
<category term="ウエブ開発"></category>
<category term=""></category>
<category term="urloli"></category>
<category term="urlロリ"></category>
<link href="gemini://technicalsuwako.moe/blog/urloli-220.gmi" rel="alternate"></link>
<content type="html">
&lt;p&gt;URLロリ は2.2.0にバージョンアップしました!!&lt;/p&gt;
&lt;h2 id=&#34;url&#34;&gt;URLロリって何?&lt;/h2&gt;
&lt;p&gt;URLロリはクッソ小さいURL短縮作成ソフトだわ〜♡&lt;/p&gt;
&lt;h2 id=&#34;heading&#34;&gt;変更&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;ポート番号の修正&lt;/li&gt;
&lt;li&gt;言語は&lt;a href=&#34;https://gitler.moe/suwako/goliblocale&#34;&gt;liblocale&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;複数言語対応&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;heading-1&#34;&gt;ソースコード&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://gitler.moe/suwako/urloli&#34;&gt;Gitler&lt;/a&gt;&lt;br /&gt;
&lt;a href=&#34;https://codeberg.org/TechnicalSuwako/urloli&#34;&gt;Codeberg&lt;/a&gt;&lt;br /&gt;
&lt;a href=&#34;https://notabug.org/TechnicalSuwako/urloli&#34;&gt;Notabug&lt;/a&gt;&lt;br /&gt;
&lt;a href=&#34;https://git.disroot.org/TechnicalSuwako/urloli&#34;&gt;Disroot&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;heading-2&#34;&gt;公式インスタンス&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://urlo.li/&#34;&gt;https://urlo.li/&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;heading-3&#34;&gt;ダウンロード&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://076.moe/repo/bin/urloli/&#34;&gt;https://076.moe/repo/bin/urloli/&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;heading-4&#34;&gt;会話&lt;/h2&gt;
&lt;h3 id=&#34;xmpp&#34;&gt;XMPP&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;xmpp:urloli@chat.xmpp.076.ne.jp?join&#34;&gt;xmpp:urloli@chat.xmpp.076.ne.jp?join&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;irc&#34;&gt;IRC&lt;/h3&gt;
&lt;p&gt;irc.076.ne.jp/6697&lt;br /&gt;
#urloli&lt;/p&gt;
&lt;p&gt;以上&lt;/p&gt;
</content>
</entry>
<entry>
<id>blog/hozonsite-110.gmi</id>
<author><name></name></author>
<title type="html">【076】保存サイト 1.1.0登場</title>
<published>2023-07-17T02:30:00Z</published>
<category term="jp"></category>
<category term="blog"></category>
<category term="ウエブ開発"></category>
<category term=""></category>
<category term="hozonsite"></category>
<category term="保存サイト"></category>
<link href="gemini://technicalsuwako.moe/blog/hozonsite-110.gmi" rel="alternate"></link>
<content type="html">
&lt;p&gt;保存サイト は1.1.0にバージョンアップしました!!&lt;/p&gt;
&lt;h2 id=&#34;heading&#34;&gt;保存サイトって何?&lt;/h2&gt;
&lt;p&gt;世界初FOSS系ウエブアーカイバーです。&lt;/p&gt;
&lt;h2 id=&#34;heading-1&#34;&gt;変更&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;言語は&lt;a href=&#34;https://gitler.moe/suwako/goliblocale&#34;&gt;liblocale&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;複数言語対応&lt;/li&gt;
&lt;li&gt;NetBSD対応&lt;/li&gt;
&lt;li&gt;IPアドレスを設定する様に&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;heading-2&#34;&gt;ソースコード&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://gitler.moe/suwako/hozonsite&#34;&gt;Gitler&lt;/a&gt;&lt;br /&gt;
&lt;a href=&#34;https://codeberg.org/TechnicalSuwako/hozonsite&#34;&gt;Codeberg&lt;/a&gt;&lt;br /&gt;
&lt;a href=&#34;https://notabug.org/TechnicalSuwako/hozonsite&#34;&gt;Notabug&lt;/a&gt;&lt;br /&gt;
&lt;a href=&#34;https://git.disroot.org/TechnicalSuwako/hozonsite&#34;&gt;Disroot&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;heading-3&#34;&gt;公式インスタンス&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://hozon.site/&#34;&gt;https://hozon.site/&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;heading-4&#34;&gt;ダウンロード&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://076.moe/repo/bin/hozonsite/&#34;&gt;https://076.moe/repo/bin/hozonsite/&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;heading-5&#34;&gt;会話&lt;/h2&gt;
&lt;h3 id=&#34;xmpp&#34;&gt;XMPP&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;xmpp:hozonsite@chat.xmpp.076.ne.jp?join&#34;&gt;xmpp:hozonsite@chat.xmpp.076.ne.jp?join&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;irc&#34;&gt;IRC&lt;/h3&gt;
&lt;p&gt;irc.076.ne.jp/6697&lt;br /&gt;
#hozonsite&lt;/p&gt;
&lt;p&gt;以上&lt;/p&gt;
</content>
</entry>
<entry>
<id>blog/urloli-211.gmi</id>
<author><name></name></author>
<title type="html">】URLロリ 2.1.1登場</title>
<published>2023-07-04T00:00:00Z</published>
<category term="jp"></category>
<category term="blog"></category>
<category term="ウエブ開発"></category>
<category term=""></category>
<category term="urloli"></category>
<category term="urlロリ"></category>
<link href="gemini://technicalsuwako.moe/blog/urloli-211.gmi" rel="alternate"></link>
<content type="html">
&lt;p&gt;URLロリ は2.1.1にバージョンアップしました!!&lt;/p&gt;
&lt;h2 id=&#34;url&#34;&gt;URLロリって何?&lt;/h2&gt;
&lt;p&gt;URLロリはクッソ小さいURL短縮作成ソフトだわ〜♡&lt;/p&gt;
&lt;h2 id=&#34;heading&#34;&gt;変更&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;バグを修正&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;heading-1&#34;&gt;ソースコード&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://gitler.moe/suwako/urloli&#34;&gt;Gitler&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;heading-2&#34;&gt;公式インスタンス&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://urlo.li/&#34;&gt;https://urlo.li/&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;heading-3&#34;&gt;ダウンロード&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://gitler.moe/suwako/urloli/releases&#34;&gt;リリースページ&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;heading-4&#34;&gt;会話&lt;/h2&gt;
&lt;h3 id=&#34;xmpp&#34;&gt;XMPP&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;xmpp:urloli@chat.xmpp.076.ne.jp?join&#34;&gt;xmpp:urloli@chat.xmpp.076.ne.jp?join&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;irc&#34;&gt;IRC&lt;/h3&gt;
&lt;p&gt;irc.076.ne.jp/6697&lt;br /&gt;
#urloli&lt;/p&gt;
&lt;p&gt;以上&lt;/p&gt;
</content>
</entry>
</feed>