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">>=</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">"グラフィックス内容を創作に失敗しました。</span><span style="color:#b62;font-weight:bold">\n</span><span style="color:#b44">"</span>);
+ }
+ } <span style="color:#a2f;font-weight:bold">else</span> {
+ fprintf(stderr, <span style="color:#b44">"画像を開けられません。</span><span style="color:#b62;font-weight:bold">\n</span><span style="color:#b44">"</span>);
+ }
+ } <span style="color:#a2f;font-weight:bold">else</span> {
+ printf(<span style="color:#b44">"使用方法: %s <画像ファイル></span><span style="color:#b62;font-weight:bold">\n</span><span style="color:#b44">"</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"><</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">"使用方法: %s <画像ファイル></span><span style="color:#b62;font-weight:bold">\n</span><span style="color:#b44">"</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">"画像を開けられません。</span><span style="color:#b62;font-weight:bold">\n</span><span style="color:#b44">"</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">"グラフィックス内容を創作に失敗しました。</span><span style="color:#b62;font-weight:bold">\n</span><span style="color:#b44">"</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">"画像を開けられません: %s</span><span style="color:#b62;font-weight:bold">\n</span><span style="color:#b44">"</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">''</span>;
+ <span style="color:#a2f;font-weight:bold">if</span> (<span style="color:#b8860b">$thread_id</span> <span style="color:#666">></span> <span style="color:#b44">''</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">></span> <span style="color:#b44">''</span>) {
+ <span style="color:#b8860b">$thread_title</span> <span style="color:#666">=</span> <span style="color:#b44">'無題#'</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">''</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">''</span>) { <span style="color:#080;font-style:italic">// 文字列で「>」を使用すると、バグが発生する可能性があります。
+</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">''</span>) { <span style="color:#080;font-style:italic">// !$thread_title > '' はかなりおかしいので、これも修正しました。
+</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">'無題#'</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);
+ }
+```
+
+以上