technicalsuwako.moe/gemini/blog.atom

280 行
19 KiB
XML
Raw Blame 履歴

このファイルには曖昧(ambiguous)なUnicode文字が含まれています

このファイルには、他の文字と見間違える可能性があるUnicode文字が含まれています。 それが意図的なものと考えられる場合は、この警告を無視して構いません。 それらの文字を表示するにはエスケープボタンを使用します。

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