From 16529c47692268ead51c0f799aaa856547f7f44a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=AB=8F=E8=A8=AA=E5=AD=90?= Date: Sun, 10 Dec 2023 22:56:07 +0900 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E3=83=97=E3=83=AD=E3=82=B0=E3=83=A9?= =?UTF-8?q?=E3=83=9F=E3=83=B3=E3=82=B0=E3=80=91=E3=82=A2=E3=83=89=E3=83=90?= =?UTF-8?q?=E3=82=A4=E3=82=B9=EF=BC=91=EF=BC=9A=E9=81=8B=E5=91=BD=E3=81=AE?= =?UTF-8?q?=E3=83=94=E3=83=A9=E3=83=9F=E3=83=83=E3=83=89=E3=82=92=E5=9B=9E?= =?UTF-8?q?=E9=81=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gemini/blog.atom | 163 +++++++++++++----- gemini/blog.gmi | 1 + gemini/blog/programming-pyramid-of-doom.gmi | 114 ++++++++++++ gemini/twtxt.txt | 1 + src/blog/programming-pyramid-of-doom/index.md | 114 ++++++++++++ 5 files changed, 352 insertions(+), 41 deletions(-) create mode 100644 gemini/blog/programming-pyramid-of-doom.gmi create mode 100644 src/blog/programming-pyramid-of-doom/index.md diff --git a/gemini/blog.atom b/gemini/blog.atom index 6cb8951..de97879 100644 --- a/gemini/blog.atom +++ b/gemini/blog.atom @@ -3,13 +3,134 @@ gemini://technicalsuwako.moe テクニカル諏訪子 - 2023-12-01T13:30:00Z + 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 @@ -154,45 +275,5 @@ - - blog/spliti-210.gmi - - 【076】spliti 2.1.0登場 - 2023-11-15T00:00:00Z - - - - - - - - - - - - - - - - -<h2 id="spliti">splitiって何?</h2> -<p>splitiはMixiのフェイクニュース部分向けプライバシーUIです。</p> -<h2 id="heading">変更</h2> -<ul> -<li>出版社ページを追加</li> -<li>出版社ページのページネーション</li> -<li>カテゴリーのページネーション</li> -<li>つぶやきを見るページ(list_quote.pl)を追加</li> -</ul> -<h2 id="heading-1">ソースコード</h2> -<p><a href="https://gitler.moe/suwako/spliti">Gitler</a></p> -<h2 id="heading-2">公式インスタンス</h2> -<p><a href="">https://mixi.076.moe/</a></p> -<p>以上</p> - - - - - diff --git a/gemini/blog.gmi b/gemini/blog.gmi index 040cf5f..bcd0e5e 100644 --- a/gemini/blog.gmi +++ b/gemini/blog.gmi @@ -2,6 +2,7 @@ # 記事一覧 +=> /blog/programming-pyramid-of-doom.gmi 2023年12月05日 【プログラミング】アドバイス1:運命のピラミッドを回避 => /blog/sp-112.gmi 2023年12月01日 【076】sp 1.1.2登場 => /blog/sp-111.gmi 2023年12月01日 【076】sp 1.1.1登場 => /blog/sp-110.gmi 2023年12月01日 【076】sp 1.1.0登場 diff --git a/gemini/blog/programming-pyramid-of-doom.gmi b/gemini/blog/programming-pyramid-of-doom.gmi new file mode 100644 index 0000000..729d3ad --- /dev/null +++ b/gemini/blog/programming-pyramid-of-doom.gmi @@ -0,0 +1,114 @@ +=> /blog.gmi ブログ一覧へ + +#【プログラミング】アドバイス1:運命のピラミッドを回避 +投稿日:2023-12-05 + +プログラミングしたら、気づかずに運命のピラミッドを作る可能性が非常に高いです。 +これを回避した方が良いと思います。 + +## 運命のピラミッドとは? + +ブログラミングで、運命のピラミッドとは、ネストされたインデントの多くのレベルを使用し、コードが読みにくくなる事です。 +例えば、下記のC言語のコードは運命のピラミッドの問題は発生します。 + +```c +int main(int argc, char **argv) { + if (argc >= 2) { + Display *d = XOpenDisplay(NULL); + if (d != NULL) { + int src = DefaultScreen(d); + Window w = XCreateSimpleWindow(d, RootWindow(d, scr), 0, 0, 500, 500, 1, BlackPixel(d, scr), WhitePixel(d, scr)); + XSelectInput(d, w, ExposureMask | KeyPressMask); + XMapWindow(d, w); + XFlush(d); + + GC gc = XCreateGC(d, w, 0, NULL); + if (gc != NULL) { + XImage *ximg = openimg(d, argv[1]): + if (ximg != NULL) { + // などなど + } + } else { + fprintf(stderr, "グラフィックス内容を創作に失敗しました。\n"); + } + } else { + fprintf(stderr, "画像を開けられません。\n"); + } + } else { + printf("使用方法: %s <画像ファイル>\n", argv[0]); + } + + return 0; +} +``` + +変わりに、下記のコードを書いた方が良いです。 + +```c +int main(int argc, char **argv) { + if (argc < 2) { // argcは2つ以下の場合、続行する意味はありません。 + printf("使用方法: %s <画像ファイル>\n", argv[0]); + return 1; + } + + Display *d = XOpenDisplay(NULL); + if (d == NULL) { // 同様に、DisplayがNULLの場合、続行する意味はありません。 + fprintf(stderr, "画像を開けられません。\n"); + return -1; + } + + int src = DefaultScreen(d); + Window w = XCreateSimpleWindow(d, RootWindow(d, scr), 0, 0, 500, 500, 1, BlackPixel(d, scr), WhitePixel(d, scr)); + XSelectInput(d, w, ExposureMask | KeyPressMask); + XMapWindow(d, w); + XFlush(d); + + GC gc = XCreateGC(d, w, 0, NULL); + if (gc == NULL) { // 同じパターン + fprintf(stderr, "グラフィックス内容を創作に失敗しました。\n"); + return -1; + } + + XImage *ximg = openimg(d, argv[1]): + if (ximg == NULL) { // また、同じパターン + fprintf(stderr, "画像を開けられません: %s\n", argv[1]); + XFreeGC(d, gc); + XCloseDisplay(d); + return -1; + } + + // などなど + + return 0; +} +``` + +=> https://gitler.moe/suwako/mivfx/src/branch/master/main.c 実際、C言語の開発者は運命のピラミッドを作る事は珍しいです。 +この問題は主にWeb開発で多く起こります。 +=> https://gitler.moe/tak4/bibis/src/branch/master/data-post.php ですから、PHPの例えはご覧下さい。 + +```php + $thread_title = ''; + if ($thread_id > '') { + $thread_title = load_post_title_by_id($thread_id); + if (!$thread_title > '') { + $thread_title = '無題#' . mb_substr($thread_id, 0, 7); + } + } +``` + +少しだけ変わります。 + +```php + $thread_title = ''; + + if ($thread_id != '') { // 文字列で「>」を使用すると、バグが発生する可能性があります。 + $thread_title = load_post_title_by_id($thread_id); + } + + if ($thread_title != '') { // !$thread_title > '' はかなりおかしいので、これも修正しました。 + $thread_title = '無題#' . mb_substr($thread_id, 0, 7); + } +``` + +以上 diff --git a/gemini/twtxt.txt b/gemini/twtxt.txt index e98523e..58118f5 100644 --- a/gemini/twtxt.txt +++ b/gemini/twtxt.txt @@ -3,6 +3,7 @@ # avatar = gemini://076.moe/static/suwako.jpg # description = テクニカル諏訪子様のtwtxtフィード # link = ホームページ gemini://technicalsuwako.moe +2023-12-05T00:00:00Z09:00 【プログラミング】アドバイス1:運命のピラミッドを回避 - gemini://technicalsuwako.moe/blog/blog/programming-pyramid-of-doom.gmi 2023-12-01T13:30:00Z09:00 【076】sp 1.1.2登場 - gemini://technicalsuwako.moe/blog/blog/sp-112.gmi 2023-12-01T13:00:00Z09:00 【076】sp 1.1.1登場 - gemini://technicalsuwako.moe/blog/blog/sp-111.gmi 2023-12-01T00:00:00Z09:00 【076】sp 1.1.0登場 - gemini://technicalsuwako.moe/blog/blog/sp-110.gmi diff --git a/src/blog/programming-pyramid-of-doom/index.md b/src/blog/programming-pyramid-of-doom/index.md new file mode 100644 index 0000000..5081f4a --- /dev/null +++ b/src/blog/programming-pyramid-of-doom/index.md @@ -0,0 +1,114 @@ +title: 【プログラミング】アドバイス1:運命のピラミッドを回避 +author: 凛 +date: 2023-12-05 +tags: jp,blog,システム開発,php,c言語,プログラミング,ウエブ開発 +---- +プログラミングしたら、気づかずに運命のピラミッドを作る可能性が非常に高いです。\ +これを回避した方が良いと思います。 + +## 運命のピラミッドとは? + +ブログラミングで、運命のピラミッドとは、ネストされたインデントの多くのレベルを使用し、コードが読みにくくなる事です。\ +例えば、下記のC言語のコードは運命のピラミッドの問題は発生します。 + +```c +int main(int argc, char **argv) { + if (argc >= 2) { + Display *d = XOpenDisplay(NULL); + if (d != NULL) { + int src = DefaultScreen(d); + Window w = XCreateSimpleWindow(d, RootWindow(d, scr), 0, 0, 500, 500, 1, BlackPixel(d, scr), WhitePixel(d, scr)); + XSelectInput(d, w, ExposureMask | KeyPressMask); + XMapWindow(d, w); + XFlush(d); + + GC gc = XCreateGC(d, w, 0, NULL); + if (gc != NULL) { + XImage *ximg = openimg(d, argv[1]): + if (ximg != NULL) { + // などなど + } + } else { + fprintf(stderr, "グラフィックス内容を創作に失敗しました。\n"); + } + } else { + fprintf(stderr, "画像を開けられません。\n"); + } + } else { + printf("使用方法: %s <画像ファイル>\n", argv[0]); + } + + return 0; +} +``` + +変わりに、下記のコードを書いた方が良いです。 + +```c +int main(int argc, char **argv) { + if (argc < 2) { // argcは2つ以下の場合、続行する意味はありません。 + printf("使用方法: %s <画像ファイル>\n", argv[0]); + return 1; + } + + Display *d = XOpenDisplay(NULL); + if (d == NULL) { // 同様に、DisplayがNULLの場合、続行する意味はありません。 + fprintf(stderr, "画像を開けられません。\n"); + return -1; + } + + int src = DefaultScreen(d); + Window w = XCreateSimpleWindow(d, RootWindow(d, scr), 0, 0, 500, 500, 1, BlackPixel(d, scr), WhitePixel(d, scr)); + XSelectInput(d, w, ExposureMask | KeyPressMask); + XMapWindow(d, w); + XFlush(d); + + GC gc = XCreateGC(d, w, 0, NULL); + if (gc == NULL) { // 同じパターン + fprintf(stderr, "グラフィックス内容を創作に失敗しました。\n"); + return -1; + } + + XImage *ximg = openimg(d, argv[1]): + if (ximg == NULL) { // また、同じパターン + fprintf(stderr, "画像を開けられません: %s\n", argv[1]); + XFreeGC(d, gc); + XCloseDisplay(d); + return -1; + } + + // などなど + + return 0; +} +``` + +[実際、C言語の開発者は運命のピラミッドを作る事は珍しいです。](https://gitler.moe/suwako/mivfx/src/branch/master/main.c)\ +この問題は主にWeb開発で多く起こります。\ +[ですから、PHPの例えはご覧下さい。](https://gitler.moe/tak4/bibis/src/branch/master/data-post.php) + +```php + $thread_title = ''; + if ($thread_id > '') { + $thread_title = load_post_title_by_id($thread_id); + if (!$thread_title > '') { + $thread_title = '無題#' . mb_substr($thread_id, 0, 7); + } + } +``` + +少しだけ変わります。 + +```php + $thread_title = ''; + + if ($threadid != '') { // 文字列で「>」を使用すると、バグが発生する可能性があります。 + $thread_title = load_post_title_by_id($threadid); + } + + if ($thread_title != '') { // !$thread_title > '' はかなりおかしいので、これも修正しました。 + $thread_title = '無題#' . mb_substr($threadid, 0, 7); + } +``` + +以上