From 4152629864e8733c61a0fd061024a234507d470a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=AB=8F=E8=A8=AA=E5=AD=90?= Date: Mon, 25 Dec 2023 19:11:02 +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=92=EF=BC=9A=E6=97=A9=E6=9C=9F=E3=83=AA?= =?UTF-8?q?=E3=82=BF=E3=83=BC=E3=83=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gemini/blog.atom | 130 +++++++++++++++------ gemini/blog.gmi | 1 + gemini/blog/programming-early-return.gmi | 82 +++++++++++++ gemini/index.gmi | 6 +- gemini/twtxt.txt | 1 + lynx.tmpl | 4 +- site.tmpl | 4 +- src/blog/programming-early-return/index.md | 82 +++++++++++++ 8 files changed, 268 insertions(+), 42 deletions(-) create mode 100644 gemini/blog/programming-early-return.gmi create mode 100644 src/blog/programming-early-return/index.md diff --git a/gemini/blog.atom b/gemini/blog.atom index 92f7c6e..d608275 100644 --- a/gemini/blog.atom +++ b/gemini/blog.atom @@ -3,13 +3,106 @@ gemini://technicalsuwako.moe テクニカル諏訪子 - 2023-12-12T00:00:00Z + 2023-12-21T00:00:00Z テクニカル諏訪子 + + blog/programming-early-return.gmi + + 【プログラミング】アドバイス2:早期リターン + 2023-12-21T00:00:00Z + + + + + + + + + + + + + + + + +<p><a href="/blog/programming-pyramid-of-doom/">前回は運命のピラミッドを避ける事について話しました。</a><br /> +運命のピラミッドを避けるる際、早期リターンをよく使用します。</p> +<h2 id="heading">早期リターンとは?</h2> +<p>早期リターンは、特定の条件が真(true)の場合に、関数の実行を直ぐに終了させる事です。<br /> +例えば、エラーが発生した場合、関数の最後まで実行する意味はありませんので、早期リターンを使う方が良いでしょう。</p> +<p>C言語の例(早期リターンを使わない場合):</p> +<pre><code lang=""><span style="color:#a2f;font-weight:bold">const</span> <span style="color:#0b0;font-weight:bold">char</span> <span style="color:#666">*</span><span style="color:#00a000">get_token</span>() { + <span style="color:#0b0;font-weight:bold">char</span> <span style="color:#666">*</span>token <span style="color:#666">=</span> malloc(<span style="color:#666">64</span>); + json_object <span style="color:#666">*</span>res <span style="color:#666">=</span> curl_con(<span style="color:#b44">&#34;auth/login&#34;</span>, <span style="color:#b44">&#34;POST&#34;</span>, data, <span style="color:#b44">&#34;&#34;</span>); + + <span style="color:#a2f;font-weight:bold">if</span> (res <span style="color:#666">==</span> <span style="color:#a2f">NULL</span>) { + printf(<span style="color:#b44">&#34;エラー:ログインに失敗。&#34;</span>); + token <span style="color:#666">=</span> <span style="color:#b44">&#34;&#34;</span>; + } + + json_object <span style="color:#666">*</span>data_obj, <span style="color:#666">*</span>token_obj; + <span style="color:#a2f;font-weight:bold">if</span> (<span style="color:#666">!</span>json_object_object_get_ex(res, <span style="color:#b44">&#34;data&#34;</span>, <span style="color:#666">&amp;</span>data_obj)) { + printf(<span style="color:#b44">&#34;JSONで&#39;data&#39;を見つけられませんでした。&#34;</span>); + token <span style="color:#666">=</span> <span style="color:#b44">&#34;&#34;</span>; + } + + <span style="color:#a2f;font-weight:bold">if</span> (<span style="color:#666">!</span>json_object_object_get_ex(data_obj, <span style="color:#b44">&#34;token&#34;</span>, <span style="color:#666">&amp;</span>token_obj)) { + printf(<span style="color:#b44">&#34;JSONの&#39;data&#39;鍵で、&#39;token&#39;を見つけられませんでした。&#34;</span>); + token <span style="color:#666">=</span> <span style="color:#b44">&#34;&#34;</span>; + } + + token <span style="color:#666">=</span> json_object_get_string(token_obj); + json_object_put(res); + + <span style="color:#a2f;font-weight:bold">return</span> token; +} +</code></pre><p>上記の問題は、3つの異なるエラーチェックがあるにも関わらず、エラーが発生しても最後まで処理を続ける事です。<br /> +それは非効率的です。<br /> +さらに、上記の例ではメモリリークが発生する可能性がある為、この方法はお勧め出来ません。<br /> +そこで、早期リターンを使って問題を解決しましょう。</p> +<pre><code lang=""><span style="color:#a2f;font-weight:bold">const</span> <span style="color:#0b0;font-weight:bold">char</span> <span style="color:#666">*</span><span style="color:#00a000">get_token</span>() { + <span style="color:#0b0;font-weight:bold">char</span> <span style="color:#666">*</span>token <span style="color:#666">=</span> malloc(<span style="color:#666">64</span>); + json_object <span style="color:#666">*</span>res <span style="color:#666">=</span> curl_con(<span style="color:#b44">&#34;auth/login&#34;</span>, <span style="color:#b44">&#34;POST&#34;</span>, data, <span style="color:#b44">&#34;&#34;</span>); + + <span style="color:#a2f;font-weight:bold">if</span> (res <span style="color:#666">==</span> <span style="color:#a2f">NULL</span>) { + printf(<span style="color:#b44">&#34;エラー:ログインに失敗。&#34;</span>); + free(token); <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:#a2f">NULL</span>; <span style="color:#080;font-style:italic">// エラーが発生したから、終了しよう +</span><span style="color:#080;font-style:italic"></span> } + + json_object <span style="color:#666">*</span>data_obj, <span style="color:#666">*</span>token_obj; + <span style="color:#a2f;font-weight:bold">if</span> (<span style="color:#666">!</span>json_object_object_get_ex(res, <span style="color:#b44">&#34;data&#34;</span>, <span style="color:#666">&amp;</span>data_obj)) { + printf(<span style="color:#b44">&#34;JSONで&#39;data&#39;を見つけられませんでした。&#34;</span>); + json_object_put(res); <span style="color:#080;font-style:italic">// エラーが発生したから、JSONオブジェクトを開放する +</span><span style="color:#080;font-style:italic"></span> free(token); + <span style="color:#a2f;font-weight:bold">return</span> <span style="color:#a2f">NULL</span>; + } + + <span style="color:#a2f;font-weight:bold">if</span> (<span style="color:#666">!</span>json_object_object_get_ex(data_obj, <span style="color:#b44">&#34;token&#34;</span>, <span style="color:#666">&amp;</span>token_obj)) { + printf(<span style="color:#b44">&#34;JSONの&#39;data&#39;鍵で、&#39;token&#39;を見つけられませんでした。&#34;</span>); + json_object_put(res); + free(token); + <span style="color:#a2f;font-weight:bold">return</span> <span style="color:#a2f">NULL</span>; + } + + token <span style="color:#666">=</span> json_object_get_string(token_obj); + json_object_put(res); + + <span style="color:#a2f;font-weight:bold">return</span> token; +} +</code></pre><p>結果は同じですが、処理が少なくなる為、効率が向上します。</p> +<p>以上</p> + + + + + blog/byobu-52.gmi @@ -488,40 +581,5 @@ zroot/usr/src 29G 96K 29G 0% /usr/src - - 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> - - - - - diff --git a/gemini/blog.gmi b/gemini/blog.gmi index fee5510..14da2d9 100644 --- a/gemini/blog.gmi +++ b/gemini/blog.gmi @@ -2,6 +2,7 @@ # 記事一覧 +=> /blog/programming-early-return.gmi 2023年12月21日 【プログラミング】アドバイス2:早期リターン => /blog/byobu-52.gmi 2023年12月12日 【076】byobu 5.2登場 => /blog/digital-autonomy-076video-hosting.gmi 2023年12月11日 【デジタル自主】076動画ホスティングの解決策 => /blog/programming-pyramid-of-doom.gmi 2023年12月05日 【プログラミング】アドバイス1:運命のピラミッドを回避 diff --git a/gemini/blog/programming-early-return.gmi b/gemini/blog/programming-early-return.gmi new file mode 100644 index 0000000..7b4504f --- /dev/null +++ b/gemini/blog/programming-early-return.gmi @@ -0,0 +1,82 @@ +=> /blog.gmi ブログ一覧へ + +# 【プログラミング】アドバイス2:早期リターン +投稿日:2023-12-21 + +=> /blog/programming-pyramid-of-doom.gmi 前回は運命のピラミッドを避ける事について話しました。 +運命のピラミッドを避けるる際、早期リターンをよく使用します。 + +## 早期リターンとは? +早期リターンは、特定の条件が真(true)の場合に、関数の実行を直ぐに終了させる事です。 +例えば、エラーが発生した場合、関数の最後まで実行する意味はありませんので、早期リターンを使う方が良いでしょう。 + +C言語の例(早期リターンを使わない場合): +```c +const char *get_token() { + char *token = malloc(64); + json_object *res = curl_con("auth/login", "POST", data, ""); + + if (res == NULL) { + printf("エラー:ログインに失敗。"); + token = ""; + } + + json_object *data_obj, *token_obj; + if (!json_object_object_get_ex(res, "data", &data_obj)) { + printf("JSONで'data'を見つけられませんでした。"); + token = ""; + } + + if (!json_object_object_get_ex(data_obj, "token", &token_obj)) { + printf("JSONの'data'鍵で、'token'を見つけられませんでした。"); + token = ""; + } + + token = json_object_get_string(token_obj); + json_object_put(res); + + return token; +} +``` + +上記の問題は、3つの異なるエラーチェックがあるにも関わらず、エラーが発生しても最後まで処理を続ける事です。 +それは非効率的です。 +さらに、上記の例ではメモリリークが発生する可能性がある為、この方法はお勧め出来ません。 +そこで、早期リターンを使って問題を解決しましょう。 + +```c +const char *get_token() { + char *token = malloc(64); + json_object *res = curl_con("auth/login", "POST", data, ""); + + if (res == NULL) { + printf("エラー:ログインに失敗。"); + free(token); // メモリ割当しましたが、エラーが発生したから、開放して下さい + return NULL; // エラーが発生したから、終了しよう + } + + json_object *data_obj, *token_obj; + if (!json_object_object_get_ex(res, "data", &data_obj)) { + printf("JSONで'data'を見つけられませんでした。"); + json_object_put(res); // エラーが発生したから、JSONオブジェクトを開放する + free(token); + return NULL; + } + + if (!json_object_object_get_ex(data_obj, "token", &token_obj)) { + printf("JSONの'data'鍵で、'token'を見つけられませんでした。"); + json_object_put(res); + free(token); + return NULL; + } + + token = json_object_get_string(token_obj); + json_object_put(res); + + return token; +} +``` + +結果は同じですが、処理が少なくなる為、効率が向上します。 + +以上 diff --git a/gemini/index.gmi b/gemini/index.gmi index 787544a..4e5c75f 100644 --- a/gemini/index.gmi +++ b/gemini/index.gmi @@ -18,9 +18,11 @@ => https://video.076.moe/a/suwako PeerTubeで登録 ## ミラー(HTTP) -=> https://technicalsuwako.moe/ 一般ネット 1 +=> https://technicalsuwako.moe/ 一般ネット 1 (GUI) +=> https://cli.technicalsuwako.moe/ 一般ネット 1 (CLI) => https://tilde.club/~technicalsuwako/ 一般ネット 2 -=> http://6qiatzlijtqo6giwvuhex5zgg3czzwrq5g6yick3stnn4xekw26zf7qd.onion/ Tor +=> http://6qiatzlijtqo6giwvuhex5zgg3czzwrq5g6yick3stnn4xekw26zf7qd.onion/ Tor (GUI) +=> http://cli.6qiatzlijtqo6giwvuhex5zgg3czzwrq5g6yick3stnn4xekw26zf7qd.onion/ Tor (CLI) => http://technicalsuwako.i2p/ I2P => http://technicalsuwako.i2p/?i2paddresshelper=ubsJs74cyvIxM5CAnadTpNP~8nL3FylU6CC9EzXlaLQVbUuzwzDWSrvTwTEiS1~GTlPaoMxlHe7vCHk0Mn4dnTg-wVZts721rHhu8w4cb0RPVneU5jmcXItsPMyg4oXLVLhv~qe4CEJDFHv6kumFZHUVw~bzorCvwUuISSBM1CqbmZ~SWz0MOHHQBBkIzUHncl~oTGHYJ2AGS0-RLmTSNQIv9Eam1X7EWOmi4VBTpGf-n39QjltWL6SKr9um49OgsYochG6pC8l0kneaIjpDrGUr1jJ6MrwTZxxMWeykuxZv1Vwta74tITjijVyBwKUmlHtUHnnH7IukvEGq5S-6YXUZO~nu5PC~ycNJ35mQUJDmiGAikUUY-vUHk0FvDP30XEQnubsOKEyKBXnd7hSDw8IAO~eAaE8gI21zCMW58Qey11WsxCzM1fAmIN9Y0af~eKkmSTbn14Ma0CGl9M8vt1h5k0i-rKt-V76DR5eyYQ6JBwT7UqB6qiD90OMaaQ6rBQAEAAcAAA== I2P アドレスヘルパー => http://73pxqisewxlcjmbjyxnorg5ngq54ii6nmoxt3knaod6ggry7dq4a.b32.i2p/ I2P B32 diff --git a/gemini/twtxt.txt b/gemini/twtxt.txt index 378423e..8f0db20 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-21T00:00:00Z09:00 【プログラミング】アドバイス2:早期リターン - gemini://technicalsuwako.moe/blog/blog/programming-early-return.gmi 2023-12-12T00:00:00Z09:00 【076】byobu 5.2登場 - gemini://technicalsuwako.moe/blog/blog/byobu-52.gmi 2023-12-11T00:00:00Z09:00 【デジタル自主】076動画ホスティングの解決策 - gemini://technicalsuwako.moe/blog/blog/digital-autonomy-076video-hosting.gmi 2023-12-05T00:00:00Z09:00 【プログラミング】アドバイス1:運命のピラミッドを回避 - gemini://technicalsuwako.moe/blog/blog/programming-pyramid-of-doom.gmi diff --git a/lynx.tmpl b/lynx.tmpl index f275400..fc6d66e 100644 --- a/lynx.tmpl +++ b/lynx.tmpl @@ -44,9 +44,9 @@