technicalsuwako.moe/gemini/blog.atom

619 行
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-12-25T00:00:00Z</updated>
<author><name>テクニカル諏訪子</name></author>
<link href="gemini://technicalsuwako.moe" rel="alternate"></link>
<entry>
<id>blog/anti-virus-dangerous.xhtml</id>
<author><name></name></author>
<title type="html">【セキュリティ】ウィルス対策ソフトは危険</title>
<published>2023-12-25T00:00:00Z</published>
<category term="jp"></category>
<category term="blog"></category>
<category term="linux"></category>
<category term="bsd"></category>
<category term="セキュリティー"></category>
<category term="デジタル自主"></category>
<category term="ソフトウェア"></category>
<category term="メール"></category>
<category term="プライバシー"></category>
<link href="gemini://technicalsuwako.moe/blog/anti-virus-dangerous.xhtml" rel="alternate"></link>
<content type="html">
&lt;p&gt;メリークリスマス!!&lt;br /&gt;
今回は大切な人へのプレゼントとして何を購入しましたか?&lt;br /&gt;
ウィルス対策ソフトと答えたら、返品した方が良いです。&lt;/p&gt;
&lt;h2 id=&#34;heading&#34;&gt;何故ウィルス対策ソフトが危険?&lt;/h2&gt;
&lt;p&gt;セキュリティ上の問題以外にも、ウィルス対策ソフトには様々な問題があります。&lt;br /&gt;
例えば、パソコンの速度が遅くなったり、多くのウェブページが表示されなくなることがあります。&lt;br /&gt;
しかし、これらはセキュリティの問題とは直接関係がありません。&lt;/p&gt;
&lt;p&gt;本当の危険は、ウィルス対策ソフトが貴方のファイルの内容(パスワードやクレジットカード番号を含む)をスキャンし、それらをネットにアップロードする事にあります。&lt;br /&gt;
&lt;a href=&#34;https://www.gnu.org/proprietary/proprietary.html&#34;&gt;殆どのウィルス対策ソフトはプロプライエタリなソフトウェアですであり、それ自体がセキュリティ上のリスクとなる事もあります。&lt;/a&gt;&lt;br /&gt;
&lt;a href=&#34;https://gigazine.net/news/20221208-apple-csam-scan-canceled/&#34;&gt;iPhoneユーザーはファイル内容のスキャンとネット上にアップロードに反対しましたが、何故パソコンユーザーはこれを推奨されるのでしょうか?&lt;/a&gt;&lt;br /&gt;
ウィルス対策ソフトを購入しないで下さい。&lt;br /&gt;
それは詐欺です!&lt;/p&gt;
&lt;h2 id=&#34;heading-1&#34;&gt;本当のウィルス対策はあるのでしょうか?&lt;/h2&gt;
&lt;p&gt;はい、存在します!&lt;br /&gt;
これは、自分の判断力を駆使する事です!&lt;br /&gt;
ブラウザでの広告をクリックしない事が重要です。&lt;br /&gt;
「Sponsor」や「スポンサー」というラベルが付いている広告は、絶対にクリックしないで下さい。&lt;br /&gt;
フィッシングメールには注意し、その対策についてはこの後で詳しく解説します。&lt;br /&gt;
WindowsやmacOSの代わりにLinuxやBSDを使用を検討してみて下さい。&lt;br /&gt;
Linux向けウィルスも存在しますが、その数は格段に少ないです。&lt;br /&gt;
デフォルト設定でJavascript、XHR、及びiFrameを無効にし、信頼出来るウェブサイトでのみ「必要な場合」に限り有効にして下さい。&lt;br /&gt;
不番な物があれば、リスクを避ける為に仮想マシンで実行する事をお勧めします。&lt;/p&gt;
&lt;h2 id=&#34;heading-2&#34;&gt;フィシングメールの対策&lt;/h2&gt;
&lt;p&gt;銀行、政府等による、ウィルス対策ソフトなしでフィッシングメールに対策出来ないって言われますが、実はそれが嘘です。&lt;br /&gt;
対策は:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;良いメールクライエントを使う事(Neomutt又はClaws Mailが超勧めます)&lt;/li&gt;
&lt;li&gt;HTMLメールを無効にし、テキストのみの表示にする事が良いです&lt;/li&gt;
&lt;li&gt;使わないサービスからメールが届いた場合、直ぐに削除する事&lt;/li&gt;
&lt;li&gt;使うサービスからメールが届いた場合、「To:」は会社のメールアドレスと、内容で貴方の名前か会社名で始まる事を確認する事(「顧客様、」や「ご担当者様」等といった曖昧な表現で始まる場合はフィッシングメールである可能性が高い)&lt;/li&gt;
&lt;li&gt;使うサービスからメールが届いた場合、メール内のリンクをクリックしないで下さい(メールアドレス確認メールを除く)。代わりに、ブラウザで手動で会社のウェブページを開き、ログインして下さい。特に「下記のリンクをクリックして下さい」みたいなリンクは絶対にクリックしないで下さい!!これは1番重要な点です!!)&lt;/li&gt;
&lt;li&gt;添付ファイルがあるメールは、特に予期していない場合は開かないで下さい&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以上&lt;/p&gt;
</content>
</entry>
<entry>
<id>blog/programming-early-return.xhtml</id>
<author><name></name></author>
<title type="html">【プログラミング】アドバイス2:早期リターン</title>
<published>2023-12-21T00:00:00Z</published>
<category term="jp"></category>
<category term="blog"></category>
<category term="システム開発"></category>
<category term="c言語"></category>
<category term="プログラミング"></category>
<link href="gemini://technicalsuwako.moe/blog/programming-early-return.xhtml" rel="alternate"></link>
<content type="html">
&lt;p&gt;&lt;a href=&#34;/blog/programming-pyramid-of-doom/&#34;&gt;前回は運命のピラミッドを避ける事について話しました。&lt;/a&gt;&lt;br /&gt;
運命のピラミッドを避けるる際、早期リターンをよく使用します。&lt;/p&gt;
&lt;h2 id=&#34;heading&#34;&gt;早期リターンとは?&lt;/h2&gt;
&lt;p&gt;早期リターンは、特定の条件が真(true)の場合に、関数の実行を直ぐに終了させる事です。&lt;br /&gt;
例えば、エラーが発生した場合、関数の最後まで実行する意味はありませんので、早期リターンを使う方が良いでしょう。&lt;/p&gt;
&lt;p&gt;C言語の例(早期リターンを使わない場合)&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:#0b0;font-weight:bold&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#00a000&#34;&gt;get_token&lt;/span&gt;() {
&lt;span style=&#34;color:#0b0;font-weight:bold&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;*&lt;/span&gt;token &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; malloc(&lt;span style=&#34;color:#666&#34;&gt;64&lt;/span&gt;);
json_object &lt;span style=&#34;color:#666&#34;&gt;*&lt;/span&gt;res &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; curl_con(&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;auth/login&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;, data, &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; (res &lt;span style=&#34;color:#666&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a2f&#34;&gt;NULL&lt;/span&gt;) {
printf(&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;エラー:ログインに失敗。&amp;#34;&lt;/span&gt;);
token &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;;
}
json_object &lt;span style=&#34;color:#666&#34;&gt;*&lt;/span&gt;data_obj, &lt;span style=&#34;color:#666&#34;&gt;*&lt;/span&gt;token_obj;
&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;json_object_object_get_ex(res, &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;data&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#666&#34;&gt;&amp;amp;&lt;/span&gt;data_obj)) {
printf(&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;JSONで&amp;#39;data&amp;#39;を見つけられませんでした。&amp;#34;&lt;/span&gt;);
token &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:#666&#34;&gt;!&lt;/span&gt;json_object_object_get_ex(data_obj, &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;token&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#666&#34;&gt;&amp;amp;&lt;/span&gt;token_obj)) {
printf(&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;JSONの&amp;#39;data&amp;#39;鍵で、&amp;#39;token&amp;#39;を見つけられませんでした。&amp;#34;&lt;/span&gt;);
token &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;;
}
token &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; json_object_get_string(token_obj);
json_object_put(res);
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;return&lt;/span&gt; token;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;上記の問題は、3つの異なるエラーチェックがあるにも関わらず、エラーが発生しても最後まで処理を続ける事です。&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:#0b0;font-weight:bold&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#00a000&#34;&gt;get_token&lt;/span&gt;() {
&lt;span style=&#34;color:#0b0;font-weight:bold&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;*&lt;/span&gt;token &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; malloc(&lt;span style=&#34;color:#666&#34;&gt;64&lt;/span&gt;);
json_object &lt;span style=&#34;color:#666&#34;&gt;*&lt;/span&gt;res &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; curl_con(&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;auth/login&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;, data, &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; (res &lt;span style=&#34;color:#666&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a2f&#34;&gt;NULL&lt;/span&gt;) {
printf(&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;エラー:ログインに失敗。&amp;#34;&lt;/span&gt;);
free(token); &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;// メモリ割当しましたが、エラーが発生したから、開放して下さい
&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#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:#a2f&#34;&gt;NULL&lt;/span&gt;; &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;// エラーが発生したから、終了しよう
&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;&lt;/span&gt; }
json_object &lt;span style=&#34;color:#666&#34;&gt;*&lt;/span&gt;data_obj, &lt;span style=&#34;color:#666&#34;&gt;*&lt;/span&gt;token_obj;
&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;json_object_object_get_ex(res, &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;data&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#666&#34;&gt;&amp;amp;&lt;/span&gt;data_obj)) {
printf(&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;JSONで&amp;#39;data&amp;#39;を見つけられませんでした。&amp;#34;&lt;/span&gt;);
json_object_put(res); &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;// エラーが発生したから、JSONオブジェクトを開放する
&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;&lt;/span&gt; free(token);
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a2f&#34;&gt;NULL&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;json_object_object_get_ex(data_obj, &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;token&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#666&#34;&gt;&amp;amp;&lt;/span&gt;token_obj)) {
printf(&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;JSONの&amp;#39;data&amp;#39;鍵で、&amp;#39;token&amp;#39;を見つけられませんでした。&amp;#34;&lt;/span&gt;);
json_object_put(res);
free(token);
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a2f&#34;&gt;NULL&lt;/span&gt;;
}
token &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; json_object_get_string(token_obj);
json_object_put(res);
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;return&lt;/span&gt; token;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;結果は同じですが、処理が少なくなる為、効率が向上します。&lt;/p&gt;
&lt;p&gt;以上&lt;/p&gt;
</content>
</entry>
<entry>
<id>blog/byobu-52.xhtml</id>
<author><name></name></author>
<title type="html">】byobu 5.2登場</title>
<published>2023-12-12T00:00:00Z</published>
<category term="jp"></category>
<category term="blog"></category>
<category term="ウエブ開発"></category>
<category term=""></category>
<category term="byobu"></category>
<link href="gemini://technicalsuwako.moe/blog/byobu-52.xhtml" rel="alternate"></link>
<content type="html">
&lt;h2 id=&#34;heading&#34;&gt;変更&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;今度から、テクニカル諏訪子ちゃんは更新します。&lt;/li&gt;
&lt;li&gt;メモリ、ディスク、CPU温度、及びCPUプロセスがLinux、OpenBSD、及びFreeBSDに対応する様にしました。&lt;/li&gt;
&lt;li&gt;「.byobu」→「.config/byobu」、「.byoburc」→「.config/byoburc」&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/byobu&#34;&gt;Gitler&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;以上&lt;/p&gt;
</content>
</entry>
<entry>
<id>blog/digital-autonomy-076video-hosting.xhtml</id>
<author><name></name></author>
<title type="html">【デジタル自主】076動画ホスティングの解決策</title>
<published>2023-12-11T00:00:00Z</published>
<category term="jp"></category>
<category term="blog"></category>
<category term="デジタル自主"></category>
<category term="freebsd"></category>
<category term="openbsd"></category>
<category term="bsd"></category>
<category term="nfs"></category>
<category term="relayd"></category>
<category term="nas"></category>
<category term="peertube"></category>
<category term="ネットワーク"></category>
<link href="gemini://technicalsuwako.moe/blog/digital-autonomy-076video-hosting.xhtml" rel="alternate"></link>
<content type="html">
&lt;p&gt;PeerTubeのホスティングと言えば、「高額」というイメージが浮かびます。&lt;br /&gt;
しかし、デジタル自主を理解すれば、高額な費用は必要ありません。&lt;br /&gt;
あたしはストレージやトラフィックの使用量に関わらず、毎月1,200円を支払っています。&lt;/p&gt;
&lt;h2 id=&#34;heading&#34;&gt;必要な物&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;古いパソコン3台(秋葉原でのジャンク品を選ぶ事を勧めます)&lt;/li&gt;
&lt;li&gt;枚1 TiBのSSD(勧め &lt;a href=&#34;https://www.amazon.co.jp/gp/product/B0BYZFB8D6&#34;&gt;https://www.amazon.co.jp/gp/product/B0BYZFB8D6&lt;/a&gt; 残念ですが、最近はCRUCIAL MX-500のSSDが凄く高くなりましたので、もう勧めれません)&lt;/li&gt;
&lt;li&gt;枚の大きさがどうでも良いSSD&lt;/li&gt;
&lt;li&gt;ルータ(勧め: &lt;a href=&#34;https://www.amazon.co.jp/gp/product/B08MH4VLR3&#34;&gt;https://www.amazon.co.jp/gp/product/B08MH4VLR3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;KVMスイッチ(勧め &lt;a href=&#34;https://www.amazon.co.jp/gp/product/B094N5LWKZ&#34;&gt;https://www.amazon.co.jp/gp/product/B094N5LWKZ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;キーボード(勧め: &lt;a href=&#34;https://www.amazon.co.jp/gp/product/B08M3BQ1TS&#34;&gt;https://www.amazon.co.jp/gp/product/B08M3BQ1TS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;VGAを対応するモニタ&lt;/li&gt;
&lt;li&gt;インターリンク フレッツ接続ZOOT NEXT(固定IPの為)&lt;/li&gt;
&lt;li&gt;(沢山サーバがあれば)ハブスイッチ(勧め: &lt;a href=&#34;https://www.amazon.co.jp/gp/product/B08YKSR6R8&#34;&gt;https://www.amazon.co.jp/gp/product/B08YKSR6R8&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;つのUSBメモリ(一つはFreeBSDと、一つはOpenBSD)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;特にKVMスイッチが必要はありませんが、つのモニタとキーボードを持ったら、とても便利です。\&lt;/p&gt;
&lt;p&gt;OpenBSDを使う理由はセキュリティで、FreeBSDを使う理由はパフォーマンスです。&lt;br /&gt;
一緒に完璧なコンビネーションとなります。&lt;/p&gt;
&lt;h2 id=&#34;usb&#34;&gt;USBメモリを準備して、インストールして下さい&lt;/h2&gt;
&lt;p&gt;FreeBSDとOpenBSDのイメージをダウンロードして下さい。&lt;br /&gt;
&lt;a href=&#34;https://download.freebsd.org/releases/amd64/amd64/ISO-IMAGES/14.0/&#34;&gt;FreeBSD 14.0-RELEASE&lt;/a&gt;&lt;br /&gt;
&lt;a href=&#34;https://cdn.openbsd.org/pub/OpenBSD/7.4/amd64/install74.img&#34;&gt;OpenBSD 7.4&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;この記事の目的の為に、USBメモリのフラッシュとFreeBSD及びOpenBSDのインストール方法を既に知っていると仮定します。&lt;/p&gt;
&lt;h2 id=&#34;heading-1&#34;&gt;あたしのセットアップ&lt;/h2&gt;
&lt;p&gt;あたしのセットアップは下記のイメージです。
ネットワーク以内のIPは&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;192.168.0.1 = ルータ&lt;/li&gt;
&lt;li&gt;192.168.0.104 = PeerTubeサーバ&lt;/li&gt;
&lt;li&gt;192.168.0.106 = relaydサーバ&lt;/li&gt;
&lt;li&gt;192.168.0.143 = NAS&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://ass.technicalsuwako.moe/DKp6BGXWTYu4JnBZ1biZPw.jpg&#34; alt=&#34;&#34; /&gt;
&lt;img src=&#34;https://ass.technicalsuwako.moe/4CUzz0i5QI2FoYuKotvAAQ.jpg&#34; alt=&#34;&#34; /&gt;
&lt;img src=&#34;https://ass.technicalsuwako.moe/JePPSZafQn25uCJxvFaKGw.jpg&#34; alt=&#34;&#34; /&gt;
&lt;img src=&#34;https://ass.technicalsuwako.moe/5VLgmL3DSTyoItyvOILtRw.jpg&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;p&gt;ちなみに、このネットワークのIPセグメントは下記のイメージです&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1 = ルータ&lt;/li&gt;
&lt;li&gt;2〜99 = DHCP&lt;/li&gt;
&lt;li&gt;100 = メインパソコン&lt;/li&gt;
&lt;li&gt;101〜120 = サーバ&lt;/li&gt;
&lt;li&gt;121〜130 = ノートパソコン(イーサネット)&lt;/li&gt;
&lt;li&gt;131〜140 = ノートパソコン(WiFi)&lt;/li&gt;
&lt;li&gt;141〜160 = ネットワーク機器(NAS、WiFiアクセスポイント、防犯カメラ等)&lt;/li&gt;
&lt;li&gt;161〜180 = ゲーム機(ニンテンドースイッチ、ニンテンドー3DS等)&lt;/li&gt;
&lt;li&gt;181〜200 = スマホ、タブパソコン等&lt;/li&gt;
&lt;li&gt;201〜254 = 何もない&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;relaydopenbsd&#34;&gt;サーバrelaydサーバ(OpenBSD)&lt;/h2&gt;
&lt;p&gt;このサーバでOpenBSDを使う理由はセキュリティです。&lt;br /&gt;
ネットワーク外からの接続は全部このサーバに通じます。&lt;/p&gt;
&lt;h3 id=&#34;etcacme-clientconf&#34;&gt;/etc/acme-client.conf&lt;/h3&gt;
&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;#
# $OpenBSD: acme-client.conf,v 1.4 2020/09/17 09:13:06 florian Exp $
#
authority letsencrypt {
api url &amp;#34;https://acme-v02.api.letsencrypt.org/directory&amp;#34;
account key &amp;#34;/etc/acme/letsencrypt-privkey.pem&amp;#34;
}
domain 076.moe {
alternative names {
www.076.moe,
stopsdgs.076.moe,
stopsmaho.076.moe,
mitra.076.moe,
mixi.076.moe,
video.076.moe,
imgproxy.076.moe
}
domain key &amp;#34;/etc/ssl/private/076.moe.key&amp;#34;
domain full chain certificate &amp;#34;/etc/ssl/076.moe.crt&amp;#34;
sign with letsencrypt
}
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;etchttpdconfssl&#34;&gt;/etc/httpd.conf(SSL証明書を受け取る為)&lt;/h3&gt;
&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;# $OpenBSD: httpd.conf,v 1.22 2020/11/04 10:34:18 denis Exp $
server &amp;#34;default&amp;#34; {
listen on * port 80
root &amp;#34;/htdocs&amp;#34;
location &amp;#34;/.well-known/acme-challenge/*&amp;#34; {
root &amp;#34;/acme&amp;#34;
request strip 2
}
}
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;etcrelaydconf&#34;&gt;/etc/relayd.conf&lt;/h3&gt;
&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;# $OpenBSD: relayd.conf,v 1.5 2018/05/06 20:56:55 benno Exp $
#
# Macros
#
relayd_addr=&amp;#34;0.0.0.0&amp;#34;
insrv4_addr=&amp;#34;192.168.0.104&amp;#34;
router_addr=&amp;#34;192.168.0.106&amp;#34;
table &amp;lt;video&amp;gt; { $insrv4_addr }
http protocol reverse {
tcp { nodelay, sack }
tls ciphers &amp;#34;TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256&amp;#34;
tls keypair &amp;#34;076.moe&amp;#34;
match request header append &amp;#34;X-Forwarded-For&amp;#34; value &amp;#34;$REMOTE_ADDR&amp;#34;
match request header append &amp;#34;X-Forwarded-Port&amp;#34; value &amp;#34;$REMOTE_PORT&amp;#34;
match response header set &amp;#34;X-Frame-Options&amp;#34; value &amp;#34;deny&amp;#34;
match response header set &amp;#34;X-XSS-Protection&amp;#34; value &amp;#34;1; mode=block&amp;#34;
match response header set &amp;#34;X-Content-Type-Options&amp;#34; value &amp;#34;nosniff&amp;#34;
match response header set &amp;#34;Strict-Transport-Security&amp;#34; value &amp;#34;max-age=31536000; includeSubDomains; preload&amp;#34;
match response header set &amp;#34;Permissions-Policy&amp;#34; value &amp;#34;accelerometer=()&amp;#34;
pass request quick header &amp;#34;Host&amp;#34; value &amp;#34;video.076.moe&amp;#34; forward to &amp;lt;video&amp;gt;
return error
pass
}
relay www_tls {
listen on $relayd_addr port 443 tls
protocol reverse
forward to &amp;lt;video&amp;gt; port 9000 check tcp
}
relay www_http {
listen on $relayd_addr port 80
protocol reverse
forward to &amp;lt;video&amp;gt; port 9000 check tcp
}
relay pt {
listen on $relayd_addr port 1935 tls
protocol reverse
forward to &amp;lt;video&amp;gt; port 19355 check tcp
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ポート1935番号は生配信の為です。&lt;/p&gt;
&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;rcctl &lt;span style=&#34;color:#a2f&#34;&gt;enable&lt;/span&gt; httpd
rcctl &lt;span style=&#34;color:#a2f&#34;&gt;enable&lt;/span&gt; relayd
rcctl start httpd
acme-client -v 076.moe
rcctl start relayd
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;nasfreebsd&#34;&gt;サーバNAS(FreeBSD)&lt;/h2&gt;
&lt;p&gt;FreeBSDを使う理由はZFSです。&lt;br /&gt;
インストールしながら、是非「ZFS」→「stripe」を選択して下さい。&lt;/p&gt;
&lt;p&gt;まずはSSDを確認して下さい&lt;/p&gt;
&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;$ dmesg | grep ada
ada0 at ahcich0 bus &lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt; scbus0 target &lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt; lun &lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;
ada0: &amp;lt;CT1000MX500SSD1 M3CR046&amp;gt; ACS-3 ATA SATA 3.x device
ada0: Serial Number
ada0: 600.000MB/s transfers &lt;span style=&#34;color:#666&#34;&gt;(&lt;/span&gt;SATA 3.x, UDMA6, PIO 512bytes&lt;span style=&#34;color:#666&#34;&gt;)&lt;/span&gt;
ada0: Command Queueing enabled
ada0: 953869MB &lt;span style=&#34;color:#666&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;1953525168&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;512&lt;/span&gt; byte sectors&lt;span style=&#34;color:#666&#34;&gt;)&lt;/span&gt;
ada1 at ahcich1 bus &lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt; scbus1 target &lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt; lun &lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;
ada1: &amp;lt;Lexar SSD NQ100 960GB SN11873&amp;gt; ACS-4 ATA SATA 3.x device
ada1: Serial Number
ada1: 600.000MB/s transfers &lt;span style=&#34;color:#666&#34;&gt;(&lt;/span&gt;SATA 3.x, UDMA6, PIO 512bytes&lt;span style=&#34;color:#666&#34;&gt;)&lt;/span&gt;
ada1: Command Queueing enabled
ada1: 915715MB &lt;span style=&#34;color:#666&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;1875385008&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;512&lt;/span&gt; byte sectors&lt;span style=&#34;color:#666&#34;&gt;)&lt;/span&gt;
ses0: ada0,pass0 in &lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;Slot 00&amp;#39;&lt;/span&gt;, SATA Slot: scbus0 target &lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;
ses0: ada1,pass1 in &lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;Slot 01&amp;#39;&lt;/span&gt;, SATA Slot: scbus1 target &lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ada1を作成しましょう。&lt;/p&gt;
&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;$ gpart create -s gpt ada1
$ gpart add -t freebsd-zfs -l disk1 ada1
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;zpoolを作って下さい。&lt;/p&gt;
&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;$ zpool create backup ada1p1
$ zpool list
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
backup 888G 396K 888G - - 0% 0% 1.00x ONLINE -
zroot 920G 180G 740G - - 0% 19% 1.00x ONLINE -
$ zfs create zroot/peertube
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ada1はバックアップ用に使用しますが、具体的な方法についてはこの記事では説明しません。&lt;/p&gt;
&lt;p&gt;peertubeユーザーとグループを創作して下さい。&lt;/p&gt;
&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;$ pw groupadd peertube
$ pw useradd peertube -g peertube -s /usr/sbin/nologin -d /nonexistent -c &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;PeerTube User&amp;#34;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;etcexports&#34;&gt;/etc/exports&lt;/h3&gt;
&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;/zroot/peertube -maproot=peertube:peertube 192.168.0.104
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;etcrcconf&#34;&gt;/etc/rc.conf&lt;/h3&gt;
&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;clear_tmp_enable=&amp;#34;YES&amp;#34;
syslogd_flags=&amp;#34;-ss&amp;#34;
hostname=&amp;#34;freebsdnas&amp;#34;
keymap=&amp;#34;jp.kbd&amp;#34;
ifconfig_re0=&amp;#34;inet 192.168.0.143 netmask 255.255.255.0&amp;#34;
defaultrouter=&amp;#34;192.168.0.1&amp;#34;
local_unbound_enable=&amp;#34;YES&amp;#34;
sshd_enable=&amp;#34;YES&amp;#34;
ntpd_enable=&amp;#34;YES&amp;#34;
rsyncd_enable=&amp;#34;YES&amp;#34;
moused_nondefault_enable=&amp;#34;NO&amp;#34;
# Set dumpdev to &amp;#34;AUTO&amp;#34; to enable crash dumps, &amp;#34;NO&amp;#34; to disable
dumpdev=&amp;#34;AUTO&amp;#34;
zfs_enable=&amp;#34;YES&amp;#34;
zfs_enable=&amp;#34;YES&amp;#34;
rpcbind_enable=&amp;#34;YES&amp;#34;
nfs_server_enable=&amp;#34;YES&amp;#34;
nfsd_flags=&amp;#34;-u -t -n 2&amp;#34;
mountd_enable=&amp;#34;YES&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;サービスを起動して下さい。&lt;/p&gt;
&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;$ service rpcbind start
$ service mountd start
$ service nfsd start
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;peertubefreebsd&#34;&gt;サーバPeerTubeサーバ(FreeBSD)&lt;/h2&gt;
&lt;p&gt;FreeBSDを使う理由は、PeerTubeの開発者がOpenBSDをサポートしていない為です。&lt;br /&gt;
いつでも通りにPeerTubeをインストールして下さい(nginxの設定が不要です)。&lt;/p&gt;
&lt;h3 id=&#34;etcrcconf-1&#34;&gt;/etc/rc.conf&lt;/h3&gt;
&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;&lt;span style=&#34;color:#b8860b&#34;&gt;clear_tmp_enable&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;YES&amp;#34;&lt;/span&gt;
&lt;span style=&#34;color:#b8860b&#34;&gt;syslogd_flags&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;-ss&amp;#34;&lt;/span&gt;
&lt;span style=&#34;color:#b8860b&#34;&gt;hostname&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;peertubesrv&amp;#34;&lt;/span&gt;
&lt;span style=&#34;color:#b8860b&#34;&gt;keymap&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;jp.kbd&amp;#34;&lt;/span&gt;
&lt;span style=&#34;color:#b8860b&#34;&gt;ifconfig_re0&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;inet 192.168.0.104 netmask 255.255.255.0&amp;#34;&lt;/span&gt;
&lt;span style=&#34;color:#b8860b&#34;&gt;defaultrouter&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;192.168.0.1&amp;#34;&lt;/span&gt;
&lt;span style=&#34;color:#b8860b&#34;&gt;local_unbound_enable&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;YES&amp;#34;&lt;/span&gt;
&lt;span style=&#34;color:#b8860b&#34;&gt;ifconfig_re0&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;DHCP&amp;#34;&lt;/span&gt;
&lt;span style=&#34;color:#b8860b&#34;&gt;sshd_enable&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;YES&amp;#34;&lt;/span&gt;
&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# Set dumpdev to &amp;#34;AUTO&amp;#34; to enable crash dumps, &amp;#34;NO&amp;#34; to disable&lt;/span&gt;
&lt;span style=&#34;color:#b8860b&#34;&gt;dumpdev&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;AUTO&amp;#34;&lt;/span&gt;
&lt;span style=&#34;color:#b8860b&#34;&gt;zfs_enable&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;YES&amp;#34;&lt;/span&gt;
&lt;span style=&#34;color:#b8860b&#34;&gt;shavit_enable&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;YES&amp;#34;&lt;/span&gt;
&lt;span style=&#34;color:#b8860b&#34;&gt;postgresql_enable&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;YES&amp;#34;&lt;/span&gt;
&lt;span style=&#34;color:#b8860b&#34;&gt;redis_enable&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;YES&amp;#34;&lt;/span&gt;
&lt;span style=&#34;color:#b8860b&#34;&gt;postgresql_class&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;postgres&amp;#34;&lt;/span&gt;
&lt;span style=&#34;color:#b8860b&#34;&gt;peertube_enable&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;YES&amp;#34;&lt;/span&gt;
&lt;span style=&#34;color:#b8860b&#34;&gt;nginx_enable&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;NO&amp;#34;&lt;/span&gt;
&lt;span style=&#34;color:#b8860b&#34;&gt;nfs_server_enable&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;YES&amp;#34;&lt;/span&gt;
&lt;span style=&#34;color:#b8860b&#34;&gt;nfs_client_enable&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;YES&amp;#34;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;$ &lt;span style=&#34;color:#a2f&#34;&gt;cd&lt;/span&gt; /var/www/peertube
$ rm -rf storage
$ mkdir storage
$ mount -t nfs 192.168.0.143:/zroot/peertube /var/www/peertube/storage
$ df -h
Filesystem Size Used Avail Capacity Mounted on
zroot/ROOT/default 92G 63G 29G 68% /
devfs 1.0K 0B 1.0K 0% /dev
zroot/tmp 29G 3.1M 29G 0% /tmp
zroot/usr/home 36G 7.2G 29G 20% /usr/home
zroot 29G 96K 29G 0% /zroot
zroot/var/audit 29G 96K 29G 0% /var/audit
zroot/var/log 29G 90M 29G 0% /var/log
zroot/usr/ports 31G 2.0G 29G 6% /usr/ports
zroot/var/crash 29G 96K 29G 0% /var/crash
zroot/var/tmp 29G 136K 29G 0% /var/tmp
zroot/var/mail 29G 444K 29G 0% /var/mail
zroot/usr/src 29G 96K 29G 0% /usr/src
192.168.0.143:/zroot/peertube 815G 103G 712G 13% /var/www/peertube/storage
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;以上&lt;/p&gt;
</content>
</entry>
<entry>
<id>blog/programming-pyramid-of-doom.xhtml</id>
<author><name></name></author>
<title type="html">【プログラミング】アドバイス1:運命のピラミッドを回避</title>
<published>2023-12-05T00:00:00Z</published>
<category term="jp"></category>
<category term="blog"></category>
<category term="システム開発"></category>
<category term="php"></category>
<category term="c言語"></category>
<category term="プログラミング"></category>
<category term="ウエブ開発"></category>
<link href="gemini://technicalsuwako.moe/blog/programming-pyramid-of-doom.xhtml" rel="alternate"></link>
<content type="html">
&lt;p&gt;プログラミングしたら、気づかずに運命のピラミッドを作る可能性が非常に高いです。&lt;br /&gt;
これを回避した方が良いと思います。&lt;/p&gt;
&lt;h2 id=&#34;heading&#34;&gt;運命のピラミッドとは?&lt;/h2&gt;
&lt;p&gt;ブログラミングで、運命のピラミッドとは、ネストされたインデントの多くのレベルを使用し、コードが読みにくくなる事です。&lt;br /&gt;
例えば、下記のC言語のコードは運命のピラミッドの問題は発生します。&lt;/p&gt;
&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;&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; argc, &lt;span style=&#34;color:#0b0;font-weight:bold&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;**&lt;/span&gt;argv) {
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;if&lt;/span&gt; (argc &lt;span style=&#34;color:#666&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;2&lt;/span&gt;) {
Display &lt;span style=&#34;color:#666&#34;&gt;*&lt;/span&gt;d &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; XOpenDisplay(&lt;span style=&#34;color:#a2f&#34;&gt;NULL&lt;/span&gt;);
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;if&lt;/span&gt; (d &lt;span style=&#34;color:#666&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#a2f&#34;&gt;NULL&lt;/span&gt;) {
&lt;span style=&#34;color:#0b0;font-weight:bold&#34;&gt;int&lt;/span&gt; src &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; DefaultScreen(d);
Window w &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; XCreateSimpleWindow(d, RootWindow(d, scr), &lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#666&#34;&gt;500&lt;/span&gt;, &lt;span style=&#34;color:#666&#34;&gt;500&lt;/span&gt;, &lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;, BlackPixel(d, scr), WhitePixel(d, scr));
XSelectInput(d, w, ExposureMask &lt;span style=&#34;color:#666&#34;&gt;|&lt;/span&gt; KeyPressMask);
XMapWindow(d, w);
XFlush(d);
GC gc &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; XCreateGC(d, w, &lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#a2f&#34;&gt;NULL&lt;/span&gt;);
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;if&lt;/span&gt; (gc &lt;span style=&#34;color:#666&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#a2f&#34;&gt;NULL&lt;/span&gt;) {
XImage &lt;span style=&#34;color:#666&#34;&gt;*&lt;/span&gt;ximg &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; openimg(d, argv[&lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;])&lt;span style=&#34;color:#666&#34;&gt;:&lt;/span&gt;
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;if&lt;/span&gt; (ximg &lt;span style=&#34;color:#666&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#a2f&#34;&gt;NULL&lt;/span&gt;) {
&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;// などなど
&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;&lt;/span&gt; }
} &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;else&lt;/span&gt; {
fprintf(stderr, &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:#a2f;font-weight:bold&#34;&gt;else&lt;/span&gt; {
fprintf(stderr, &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:#a2f;font-weight:bold&#34;&gt;else&lt;/span&gt; {
printf(&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;使用方法: %s &amp;lt;画像ファイル&amp;gt;&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;, argv[&lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;]);
}
&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;p&gt;変わりに、下記のコードを書いた方が良いです。&lt;/p&gt;
&lt;pre&gt;&lt;code lang=&#34;&#34;&gt;&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; argc, &lt;span style=&#34;color:#0b0;font-weight:bold&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;**&lt;/span&gt;argv) {
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;if&lt;/span&gt; (argc &lt;span style=&#34;color:#666&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;2&lt;/span&gt;) { &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;// argcはつ以下の場合、続行する意味はありません。
&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;&lt;/span&gt; printf(&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;使用方法: %s &amp;lt;画像ファイル&amp;gt;&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;, argv[&lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;]);
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;;
}
Display &lt;span style=&#34;color:#666&#34;&gt;*&lt;/span&gt;d &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; XOpenDisplay(&lt;span style=&#34;color:#a2f&#34;&gt;NULL&lt;/span&gt;);
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;if&lt;/span&gt; (d &lt;span style=&#34;color:#666&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a2f&#34;&gt;NULL&lt;/span&gt;) { &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;// 同様に、DisplayがNULLの場合、続行する意味はありません。
&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;&lt;/span&gt; fprintf(stderr, &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:#a2f;font-weight:bold&#34;&gt;return&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:#0b0;font-weight:bold&#34;&gt;int&lt;/span&gt; src &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; DefaultScreen(d);
Window w &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; XCreateSimpleWindow(d, RootWindow(d, scr), &lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#666&#34;&gt;500&lt;/span&gt;, &lt;span style=&#34;color:#666&#34;&gt;500&lt;/span&gt;, &lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;, BlackPixel(d, scr), WhitePixel(d, scr));
XSelectInput(d, w, ExposureMask &lt;span style=&#34;color:#666&#34;&gt;|&lt;/span&gt; KeyPressMask);
XMapWindow(d, w);
XFlush(d);
GC gc &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; XCreateGC(d, w, &lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#a2f&#34;&gt;NULL&lt;/span&gt;);
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;if&lt;/span&gt; (gc &lt;span style=&#34;color:#666&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a2f&#34;&gt;NULL&lt;/span&gt;) { &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;// 同じパターン
&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;&lt;/span&gt; fprintf(stderr, &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:#a2f;font-weight:bold&#34;&gt;return&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;;
}
XImage &lt;span style=&#34;color:#666&#34;&gt;*&lt;/span&gt;ximg &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; openimg(d, argv[&lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;])&lt;span style=&#34;color:#666&#34;&gt;:&lt;/span&gt;
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;if&lt;/span&gt; (ximg &lt;span style=&#34;color:#666&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a2f&#34;&gt;NULL&lt;/span&gt;) { &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;// また、同じパターン
&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;&lt;/span&gt; fprintf(stderr, &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;画像を開けられません: %s&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;, argv[&lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;]);
XFreeGC(d, gc);
XCloseDisplay(d);
&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;return&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;font-style:italic&#34;&gt;// などなど
&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#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:#666&#34;&gt;0&lt;/span&gt;;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;a href=&#34;https://gitler.moe/suwako/mivfx/src/branch/master/main.c&#34;&gt;実際、C言語の開発者は運命のピラミッドを作る事は珍しいです。&lt;/a&gt;&lt;br /&gt;
この問題は主にWeb開発で多く起こります。&lt;br /&gt;
&lt;a href=&#34;https://gitler.moe/tak4/bibis/src/branch/master/data-post.php&#34;&gt;ですから、PHPの例えはご覧下さい。&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code lang=&#34;&#34;&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;$thread_title&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;&amp;#39;&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;$thread_id&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;) {
&lt;span style=&#34;color:#b8860b&#34;&gt;$thread_title&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; load_post_title_by_id(&lt;span style=&#34;color:#b8860b&#34;&gt;$thread_id&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;&lt;span style=&#34;color:#b8860b&#34;&gt;$thread_title&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;) {
&lt;span style=&#34;color:#b8860b&#34;&gt;$thread_title&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;無題#&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt; mb_substr(&lt;span style=&#34;color:#b8860b&#34;&gt;$thread_id&lt;/span&gt;, &lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#666&#34;&gt;7&lt;/span&gt;);
}
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;少しだけ変わります。&lt;/p&gt;
&lt;pre&gt;&lt;code lang=&#34;&#34;&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;$thread_title&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;&amp;#39;&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;$threadid&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;) { &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;// 文字列で「&amp;gt;」を使用すると、バグが発生する可能性があります。
&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;$thread_title&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; load_post_title_by_id(&lt;span style=&#34;color:#b8860b&#34;&gt;$threadid&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;$thread_title&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;) { &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;// !$thread_title &amp;gt; &amp;#39;&amp;#39; はかなりおかしいので、これも修正しました。
&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;&lt;/span&gt; &lt;span style=&#34;color:#b8860b&#34;&gt;$thread_title&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;無題#&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt; mb_substr(&lt;span style=&#34;color:#b8860b&#34;&gt;$threadid&lt;/span&gt;, &lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#666&#34;&gt;7&lt;/span&gt;);
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;以上&lt;/p&gt;
</content>
</entry>
</feed>