280 行
19 KiB
XML
280 行
19 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-12-05T00:00:00Z</updated>
|
||
|
||
<author><name>テクニカル諏訪子</name></author>
|
||
<link href="gemini://technicalsuwako.moe" rel="alternate"></link>
|
||
|
||
|
||
|
||
<entry>
|
||
<id>blog/programming-pyramid-of-doom.gmi</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.gmi" rel="alternate"></link>
|
||
<content type="html">
|
||
|
||
|
||
|
||
<p>プログラミングしたら、気づかずに運命のピラミッドを作る可能性が非常に高いです。<br />
|
||
これを回避した方が良いと思います。</p>
|
||
<h2 id="heading">運命のピラミッドとは?</h2>
|
||
<p>ブログラミングで、運命のピラミッドとは、ネストされたインデントの多くのレベルを使用し、コードが読みにくくなる事です。<br />
|
||
例えば、下記のC言語のコードは運命のピラミッドの問題は発生します。</p>
|
||
<pre><code lang=""><span style="color:#0b0;font-weight:bold">int</span> <span style="color:#00a000">main</span>(<span style="color:#0b0;font-weight:bold">int</span> argc, <span style="color:#0b0;font-weight:bold">char</span> <span style="color:#666">**</span>argv) {
|
||
<span style="color:#a2f;font-weight:bold">if</span> (argc <span style="color:#666">&gt;=</span> <span style="color:#666">2</span>) {
|
||
Display <span style="color:#666">*</span>d <span style="color:#666">=</span> XOpenDisplay(<span style="color:#a2f">NULL</span>);
|
||
<span style="color:#a2f;font-weight:bold">if</span> (d <span style="color:#666">!=</span> <span style="color:#a2f">NULL</span>) {
|
||
<span style="color:#0b0;font-weight:bold">int</span> src <span style="color:#666">=</span> DefaultScreen(d);
|
||
Window w <span style="color:#666">=</span> XCreateSimpleWindow(d, RootWindow(d, scr), <span style="color:#666">0</span>, <span style="color:#666">0</span>, <span style="color:#666">500</span>, <span style="color:#666">500</span>, <span style="color:#666">1</span>, BlackPixel(d, scr), WhitePixel(d, scr));
|
||
XSelectInput(d, w, ExposureMask <span style="color:#666">|</span> KeyPressMask);
|
||
XMapWindow(d, w);
|
||
XFlush(d);
|
||
|
||
GC gc <span style="color:#666">=</span> XCreateGC(d, w, <span style="color:#666">0</span>, <span style="color:#a2f">NULL</span>);
|
||
<span style="color:#a2f;font-weight:bold">if</span> (gc <span style="color:#666">!=</span> <span style="color:#a2f">NULL</span>) {
|
||
XImage <span style="color:#666">*</span>ximg <span style="color:#666">=</span> openimg(d, argv[<span style="color:#666">1</span>])<span style="color:#666">:</span>
|
||
<span style="color:#a2f;font-weight:bold">if</span> (ximg <span style="color:#666">!=</span> <span style="color:#a2f">NULL</span>) {
|
||
<span style="color:#080;font-style:italic">// などなど
|
||
</span><span style="color:#080;font-style:italic"></span> }
|
||
} <span style="color:#a2f;font-weight:bold">else</span> {
|
||
fprintf(stderr, <span style="color:#b44">&#34;グラフィックス内容を創作に失敗しました。</span><span style="color:#b62;font-weight:bold">\n</span><span style="color:#b44">&#34;</span>);
|
||
}
|
||
} <span style="color:#a2f;font-weight:bold">else</span> {
|
||
fprintf(stderr, <span style="color:#b44">&#34;画像を開けられません。</span><span style="color:#b62;font-weight:bold">\n</span><span style="color:#b44">&#34;</span>);
|
||
}
|
||
} <span style="color:#a2f;font-weight:bold">else</span> {
|
||
printf(<span style="color:#b44">&#34;使用方法: %s &lt;画像ファイル&gt;</span><span style="color:#b62;font-weight:bold">\n</span><span style="color:#b44">&#34;</span>, argv[<span style="color:#666">0</span>]);
|
||
}
|
||
|
||
<span style="color:#a2f;font-weight:bold">return</span> <span style="color:#666">0</span>;
|
||
}
|
||
</code></pre><p>変わりに、下記のコードを書いた方が良いです。</p>
|
||
<pre><code lang=""><span style="color:#0b0;font-weight:bold">int</span> <span style="color:#00a000">main</span>(<span style="color:#0b0;font-weight:bold">int</span> argc, <span style="color:#0b0;font-weight:bold">char</span> <span style="color:#666">**</span>argv) {
|
||
<span style="color:#a2f;font-weight:bold">if</span> (argc <span style="color:#666">&lt;</span> <span style="color:#666">2</span>) { <span style="color:#080;font-style:italic">// argcは2つ以下の場合、続行する意味はありません。
|
||
</span><span style="color:#080;font-style:italic"></span> printf(<span style="color:#b44">&#34;使用方法: %s &lt;画像ファイル&gt;</span><span style="color:#b62;font-weight:bold">\n</span><span style="color:#b44">&#34;</span>, argv[<span style="color:#666">0</span>]);
|
||
<span style="color:#a2f;font-weight:bold">return</span> <span style="color:#666">1</span>;
|
||
}
|
||
|
||
Display <span style="color:#666">*</span>d <span style="color:#666">=</span> XOpenDisplay(<span style="color:#a2f">NULL</span>);
|
||
<span style="color:#a2f;font-weight:bold">if</span> (d <span style="color:#666">==</span> <span style="color:#a2f">NULL</span>) { <span style="color:#080;font-style:italic">// 同様に、DisplayがNULLの場合、続行する意味はありません。
|
||
</span><span style="color:#080;font-style:italic"></span> fprintf(stderr, <span style="color:#b44">&#34;画像を開けられません。</span><span style="color:#b62;font-weight:bold">\n</span><span style="color:#b44">&#34;</span>);
|
||
<span style="color:#a2f;font-weight:bold">return</span> <span style="color:#666">-</span><span style="color:#666">1</span>;
|
||
}
|
||
|
||
<span style="color:#0b0;font-weight:bold">int</span> src <span style="color:#666">=</span> DefaultScreen(d);
|
||
Window w <span style="color:#666">=</span> XCreateSimpleWindow(d, RootWindow(d, scr), <span style="color:#666">0</span>, <span style="color:#666">0</span>, <span style="color:#666">500</span>, <span style="color:#666">500</span>, <span style="color:#666">1</span>, BlackPixel(d, scr), WhitePixel(d, scr));
|
||
XSelectInput(d, w, ExposureMask <span style="color:#666">|</span> KeyPressMask);
|
||
XMapWindow(d, w);
|
||
XFlush(d);
|
||
|
||
GC gc <span style="color:#666">=</span> XCreateGC(d, w, <span style="color:#666">0</span>, <span style="color:#a2f">NULL</span>);
|
||
<span style="color:#a2f;font-weight:bold">if</span> (gc <span style="color:#666">==</span> <span style="color:#a2f">NULL</span>) { <span style="color:#080;font-style:italic">// 同じパターン
|
||
</span><span style="color:#080;font-style:italic"></span> fprintf(stderr, <span style="color:#b44">&#34;グラフィックス内容を創作に失敗しました。</span><span style="color:#b62;font-weight:bold">\n</span><span style="color:#b44">&#34;</span>);
|
||
<span style="color:#a2f;font-weight:bold">return</span> <span style="color:#666">-</span><span style="color:#666">1</span>;
|
||
}
|
||
|
||
XImage <span style="color:#666">*</span>ximg <span style="color:#666">=</span> openimg(d, argv[<span style="color:#666">1</span>])<span style="color:#666">:</span>
|
||
<span style="color:#a2f;font-weight:bold">if</span> (ximg <span style="color:#666">==</span> <span style="color:#a2f">NULL</span>) { <span style="color:#080;font-style:italic">// また、同じパターン
|
||
</span><span style="color:#080;font-style:italic"></span> fprintf(stderr, <span style="color:#b44">&#34;画像を開けられません: %s</span><span style="color:#b62;font-weight:bold">\n</span><span style="color:#b44">&#34;</span>, argv[<span style="color:#666">1</span>]);
|
||
XFreeGC(d, gc);
|
||
XCloseDisplay(d);
|
||
<span style="color:#a2f;font-weight:bold">return</span> <span style="color:#666">-</span><span style="color:#666">1</span>;
|
||
}
|
||
|
||
<span style="color:#080;font-style:italic">// などなど
|
||
</span><span style="color:#080;font-style:italic"></span>
|
||
<span style="color:#a2f;font-weight:bold">return</span> <span style="color:#666">0</span>;
|
||
}
|
||
</code></pre><p><a href="https://gitler.moe/suwako/mivfx/src/branch/master/main.c">実際、C言語の開発者は運命のピラミッドを作る事は珍しいです。</a><br />
|
||
この問題は主にWeb開発で多く起こります。<br />
|
||
<a href="https://gitler.moe/tak4/bibis/src/branch/master/data-post.php">ですから、PHPの例えはご覧下さい。</a></p>
|
||
<pre><code lang=""> <span style="color:#b8860b">$thread_title</span> <span style="color:#666">=</span> <span style="color:#b44">&#39;&#39;</span>;
|
||
<span style="color:#a2f;font-weight:bold">if</span> (<span style="color:#b8860b">$thread_id</span> <span style="color:#666">&gt;</span> <span style="color:#b44">&#39;&#39;</span>) {
|
||
<span style="color:#b8860b">$thread_title</span> <span style="color:#666">=</span> load_post_title_by_id(<span style="color:#b8860b">$thread_id</span>);
|
||
<span style="color:#a2f;font-weight:bold">if</span> (<span style="color:#666">!</span><span style="color:#b8860b">$thread_title</span> <span style="color:#666">&gt;</span> <span style="color:#b44">&#39;&#39;</span>) {
|
||
<span style="color:#b8860b">$thread_title</span> <span style="color:#666">=</span> <span style="color:#b44">&#39;無題#&#39;</span> <span style="color:#666">.</span> mb_substr(<span style="color:#b8860b">$thread_id</span>, <span style="color:#666">0</span>, <span style="color:#666">7</span>);
|
||
}
|
||
}
|
||
</code></pre><p>少しだけ変わります。</p>
|
||
<pre><code lang=""> <span style="color:#b8860b">$thread_title</span> <span style="color:#666">=</span> <span style="color:#b44">&#39;&#39;</span>;
|
||
|
||
<span style="color:#a2f;font-weight:bold">if</span> (<span style="color:#b8860b">$threadid</span> <span style="color:#666">!=</span> <span style="color:#b44">&#39;&#39;</span>) { <span style="color:#080;font-style:italic">// 文字列で「&gt;」を使用すると、バグが発生する可能性があります。
|
||
</span><span style="color:#080;font-style:italic"></span> <span style="color:#b8860b">$thread_title</span> <span style="color:#666">=</span> load_post_title_by_id(<span style="color:#b8860b">$threadid</span>);
|
||
}
|
||
|
||
<span style="color:#a2f;font-weight:bold">if</span> (<span style="color:#b8860b">$thread_title</span> <span style="color:#666">!=</span> <span style="color:#b44">&#39;&#39;</span>) { <span style="color:#080;font-style:italic">// !$thread_title &gt; &#39;&#39; はかなりおかしいので、これも修正しました。
|
||
</span><span style="color:#080;font-style:italic"></span> <span style="color:#b8860b">$thread_title</span> <span style="color:#666">=</span> <span style="color:#b44">&#39;無題#&#39;</span> <span style="color:#666">.</span> mb_substr(<span style="color:#b8860b">$threadid</span>, <span style="color:#666">0</span>, <span style="color:#666">7</span>);
|
||
}
|
||
</code></pre><p>以上</p>
|
||
|
||
|
||
</content>
|
||
</entry>
|
||
|
||
<entry>
|
||
<id>blog/sp-112.gmi</id>
|
||
<author><name>凛</name></author>
|
||
<title type="html">【076】sp 1.1.2登場</title>
|
||
<published>2023-12-01T13:30:00Z</published>
|
||
|
||
<category term="jp"></category>
|
||
|
||
<category term="blog"></category>
|
||
|
||
<category term="ウエブ開発"></category>
|
||
|
||
<category term="076"></category>
|
||
|
||
<category term="sp"></category>
|
||
|
||
<link href="gemini://technicalsuwako.moe/blog/sp-112.gmi" rel="alternate"></link>
|
||
<content type="html">
|
||
|
||
|
||
|
||
<h2 id="sp">spって何?</h2>
|
||
<p>spはシンプルなパスワードマネージャです。</p>
|
||
<h2 id="heading">変更</h2>
|
||
<ul>
|
||
<li>OpenBSDでのコンパイラーが発生された問題を修正した</li>
|
||
</ul>
|
||
<h2 id="heading-1">ソースコード</h2>
|
||
<p><a href="https://gitler.moe/suwako/sp">Gitler</a></p>
|
||
<p>以上</p>
|
||
|
||
|
||
</content>
|
||
</entry>
|
||
|
||
<entry>
|
||
<id>blog/sp-111.gmi</id>
|
||
<author><name>凛</name></author>
|
||
<title type="html">【076】sp 1.1.1登場</title>
|
||
<published>2023-12-01T13:00:00Z</published>
|
||
|
||
<category term="jp"></category>
|
||
|
||
<category term="blog"></category>
|
||
|
||
<category term="ウエブ開発"></category>
|
||
|
||
<category term="076"></category>
|
||
|
||
<category term="sp"></category>
|
||
|
||
<link href="gemini://technicalsuwako.moe/blog/sp-111.gmi" rel="alternate"></link>
|
||
<content type="html">
|
||
|
||
|
||
|
||
<h2 id="sp">spって何?</h2>
|
||
<p>spはシンプルなパスワードマネージャです。</p>
|
||
<h2 id="heading">変更</h2>
|
||
<ul>
|
||
<li>make install-zsh部分を修正</li>
|
||
</ul>
|
||
<h2 id="heading-1">ソースコード</h2>
|
||
<p><a href="https://gitler.moe/suwako/sp">Gitler</a></p>
|
||
<p>以上</p>
|
||
|
||
|
||
</content>
|
||
</entry>
|
||
|
||
<entry>
|
||
<id>blog/sp-110.gmi</id>
|
||
<author><name>凛</name></author>
|
||
<title type="html">【076】sp 1.1.0登場</title>
|
||
<published>2023-12-01T00:00:00Z</published>
|
||
|
||
<category term="jp"></category>
|
||
|
||
<category term="blog"></category>
|
||
|
||
<category term="ウエブ開発"></category>
|
||
|
||
<category term="076"></category>
|
||
|
||
<category term="sp"></category>
|
||
|
||
<link href="gemini://technicalsuwako.moe/blog/sp-110.gmi" rel="alternate"></link>
|
||
<content type="html">
|
||
|
||
|
||
|
||
<h2 id="sp">spって何?</h2>
|
||
<p>spはシンプルなパスワードマネージャです。</p>
|
||
<h2 id="heading">変更</h2>
|
||
<ul>
|
||
<li>TOTP対応</li>
|
||
<li>READMEファイルで使い方を詳しく説明する</li>
|
||
<li>zshキャプチャー</li>
|
||
<li>パスワード追加関数を安定化</li>
|
||
<li>パスワード表示とパスワードのコピー関数で、GNU Passで保存したパスワードの場合は改行を追加しない様に</li>
|
||
</ul>
|
||
<h2 id="heading-1">ソースコード</h2>
|
||
<p><a href="https://gitler.moe/suwako/sp">Gitler</a></p>
|
||
<p>以上</p>
|
||
|
||
|
||
</content>
|
||
</entry>
|
||
|
||
<entry>
|
||
<id>blog/sp-100.gmi</id>
|
||
<author><name>凛</name></author>
|
||
<title type="html">【076】sp 1.0.0登場</title>
|
||
<published>2023-11-30T00:00:00Z</published>
|
||
|
||
<category term="jp"></category>
|
||
|
||
<category term="blog"></category>
|
||
|
||
<category term="ウエブ開発"></category>
|
||
|
||
<category term="076"></category>
|
||
|
||
<category term="sp"></category>
|
||
|
||
<link href="gemini://technicalsuwako.moe/blog/sp-100.gmi" rel="alternate"></link>
|
||
<content type="html">
|
||
|
||
|
||
|
||
<h2 id="sp">spって何?</h2>
|
||
<p>spはシンプルなパスワードマネージャです。</p>
|
||
<h2 id="heading">変更</h2>
|
||
<ul>
|
||
<li>最初リリース</li>
|
||
</ul>
|
||
<h2 id="heading-1">ソースコード</h2>
|
||
<p><a href="https://gitler.moe/suwako/sp">Gitler</a></p>
|
||
<p>以上</p>
|
||
|
||
|
||
</content>
|
||
</entry>
|
||
|
||
|
||
</feed>
|