gemini://technicalsuwako.moe テクニカル諏訪子 2023-12-05T00:00:00Z テクニカル諏訪子 blog/programming-pyramid-of-doom.gmi 【プログラミング】アドバイス1:運命のピラミッドを回避 2023-12-05T00:00:00Z <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> blog/sp-112.gmi 【076】sp 1.1.2登場 2023-12-01T13:30:00Z <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> blog/sp-111.gmi 【076】sp 1.1.1登場 2023-12-01T13:00:00Z <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> blog/sp-110.gmi 【076】sp 1.1.0登場 2023-12-01T00:00:00Z <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> blog/sp-100.gmi 【076】sp 1.0.0登場 2023-11-30T00:00:00Z <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>