<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:blogChannel="http://backend.userland.com/blogChannelModule" >
  <channel>
  <title>IT小作人の日記</title>
  <link>https://aieyzumcrgpdbggt.blog.shinobi.jp/</link>
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="https://aieyzumcrgpdbggt.blog.shinobi.jp/RSS/" />
  <description>IT関係の小作人労働の日々の日記です。
最近データベースが好きです。
インフラ構築、DB構築、アプリケーション開発・・・何でも屋です。
何でもできそうで、何にもできない。</description>
  <lastBuildDate>Fri, 15 May 2026 04:21:04 GMT</lastBuildDate>
  <language>ja</language>
  <copyright>© Ninja Tools Inc.</copyright>
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" />

    <item>
    <title>【C言語入門】変数の値を交換する：作業用変数を使わない「差分利用」のアルゴリズム</title>
    <description>
    <![CDATA[<p><br />
2つの変数の値を入れ替える際、通常は「tmp（一時的な変数）」という第3の箱を用意しますが、今回はあえて「差分」を利用して、2つの変数だけで完結させるトリッキーな手法を解説します。</p>
<h3 style="color: blue;">1. 実践：足し算・引き算による入れ替え</h3>
<p><b>【 動作確認 】</b> 以下のコードは、`a` と `b` の差を計算し、その結果を中継地点とすることで値を交換しています。`calc_swap.c` として保存して実行してみてください。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6; background-color: #f9f9f9;">#include &lt;stdio.h&gt;<br />
<br />
int main(void) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;int a = 10;<br />
&nbsp;&nbsp;&nbsp;&nbsp;int b = 3;<br />
&nbsp;&nbsp;&nbsp;&nbsp;printf("初期状態: a=%d, b=%d\n", a, b);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;// 1. aとbの「差」をbに保存<br />
&nbsp;&nbsp;&nbsp;&nbsp;b = a - b; // b = 10 - 3 = 7<br />
&nbsp;&nbsp;&nbsp;&nbsp;printf("ステップ1: a=%d, b=%d\n", a, b);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;// 2. 元のaから「差」を引いて、新しいaにする<br />
&nbsp;&nbsp;&nbsp;&nbsp;a = a - b; // a = 10 - 7 = 3 (入れ替え完了1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;printf("ステップ2: a=%d, b=%d\n", a, b);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;// 3. 新しいaに「差」を足して、新しいbにする<br />
&nbsp;&nbsp;&nbsp;&nbsp;b = b + a; // b = 7 + 3 = 10 (入れ替え完了2)<br />
&nbsp;&nbsp;&nbsp;&nbsp;printf("最終状態: a=%d, b=%d\n", a, b);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br />
}</div>
<h3 style="color: blue;">2. アルゴリズムが適用できる型と注意点</h3>
<p><b>【 技術的解説 】</b> この手法は数値計算に基づくため、適用できる型や制約に注意が必要です。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6; background-color: #f9f9f9;">★ <b>適用できる型</b>：<br />
・<b>整数型 (int, char, longなど)</b>：符号の有無にかかわらず動作します。<br />
・<b>浮動小数点型 (float, double)</b>：理論上は動作しますが、微小な計算誤差が発生する可能性があるため推奨されません。<br />
<br />
★ <b>重大な注意点（オーバーフローのリスク）</b>：<br />
・計算の途中で、その型が保持できる最大値（INT_MAXなど）を超えてしまう<b>オーバーフロー</b>が発生するリスクがあります。C言語の規格上、符号付き整数のオーバーフローは「未定義の動作」となり、予期せぬ挙動を引き起こす可能性があります。</div>
<h3 style="color: blue;">3. 技術的背景：なぜこのコードが生まれたのか</h3>
<p>現代のコンピュータではメモリも豊富にあり、作業用変数を使う `tmp = a; a = b; b = tmp;` の方が可読性も高く安全です。しかし、メモリが極めて限られていた時代や、特殊なCPU命令を最適化したい場面などでは、このような「メモリを節約する工夫」が重宝されてきました。</p>
<h3 style="color: blue;">4. 理解度チェック！練習問題</h3>
<p><b>【 復習問題 】</b> 今回紹介したアルゴリズムで、int型の変数 `a` と `b` の値を交換する際に発生しうる最も深刻なリスクはどれでしょうか？</p>
<p><b>選択肢：</b><br />
A. 計算に時間がかかりすぎる。<br />
B. 計算の途中で数値が型の最大範囲を超え、オーバーフローが発生する。<br />
C. printf関数で表示できなくなる。<br />
D. C言語の最新規格（C17）では禁止されている。</p>
<details style="margin-top: 10px; border: 1px solid #aaa; padding: 10px; border-radius: 5px;"> <summary style="cursor: pointer; font-weight: bold;">正解と解説を見る</summary>
<p><b>正解：B</b></p>
<p>大きな値同士の計算では、途中の加減算で型の限界（オーバーフロー）を超える可能性があります。パズル的な面白さはありますが、安全性を優先する現代のプログラミングでは、一時変数を使う方法が一般的です。</p>
</details>
<h3 style="color: blue;">5. まとめ</h3>
<p>「差分を利用して値を入れ替える」という発想は、変数の値を単なるデータではなく「状態の差」として捉える面白いアルゴリズムです。実務での利用には注意が必要ですが、こうした低レイヤのテクニックを知ることで、メモリと演算の仕組みに対する理解がより深まります。</p>]]>
    </description>
    <category>【C言語入門-練習問題付き】</category>
    <link>https://aieyzumcrgpdbggt.blog.shinobi.jp/Entry/904/</link>
    <pubDate>Fri, 15 May 2026 04:21:04 GMT</pubDate>
    <guid isPermaLink="false">aieyzumcrgpdbggt.blog.shinobi.jp://entry/904</guid>
  </item>
    <item>
    <title>【C言語入門】変数の宣言と初期化：C99規格で変わった「自由な書き方」</title>
    <description>
    <![CDATA[<p><br />
プログラムの中で値を一時的に保存しておく「箱」が変数です。今回は基本中の基本である整数型（int）を例に、その宣言方法と、規格の進化によって効率化したポイントを解説します。</p>
<h3 style="color: blue;">1. 実践：int型の宣言と初期化</h3>
<p><b>【 動作確認 】</b> 以下のコードを `var.c` として保存して実行します。変数 `a` に値を格納し、表示する基本的な構造です。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6; background-color: #f9f9f9;">#include &lt;stdio.h&gt;<br />
<br />
int main(void) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;int a = 10; // 宣言と同時に初期化<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;printf("aの値は %d です\n", a);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;a = 20; // 値の書き換え（代入）<br />
&nbsp;&nbsp;&nbsp;&nbsp;printf("書き換え後の値は %d です\n", a);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br />
}</div>
<h3 style="color: blue;">2. 規格による宣言位置の制限と緩和</h3>
<p><b>【 仕組みの解説 】</b> C言語の規格によって、変数を宣言できる場所のルールが異なります。現代のMac環境（C11/C17）では、C99以降の緩和されたルールが適用されています。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6; background-color: #f9f9f9;">★ <b>古い規格（C89以前）</b>：<br />
変数の宣言は、ブロック（ { } ）の<b>先頭</b>にまとめて記述しなければなりませんでした。 <br />
<br />
<span style="color: green;">// C89スタイル</span><br />
int main(void) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;<b>int a;</b><br />
&nbsp;&nbsp;&nbsp;&nbsp;<b>int b;</b><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;a = 10;<br />
&nbsp;&nbsp;&nbsp;&nbsp;b = 20;<br />
&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br />
}<br />
<br />
<hr />★ <b>現代の規格（C99以降）</b>：<br />
<b>「任意の位置」</b>で宣言が可能になりました。これにより、ロジックの途中で必要になったタイミングで変数を定義できます。 <br />
<br />
<span style="color: green;">// C99以降のスタイル（Macのデフォルト）</span><br />
int main(void) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;<b>int a = 10;</b><br />
&nbsp;&nbsp;&nbsp;&nbsp;printf("%d\n", a);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<b>int b = 20;</b> // 必要になった段階で宣言が可能<br />
&nbsp;&nbsp;&nbsp;&nbsp;printf("%d\n", b);<br />
&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br />
}</div>
<h3 style="color: blue;">3. 未初期化変数のリスク</h3>
<p><b>【 技術的注意点 】</b> `int a;` のように初期化を行わずに宣言した場合、その変数にはメモリ上に残っていた以前のデータ（不定値）が保持されます。これをそのまま使用すると意図しない挙動やバグの原因となるため、宣言時に明示的に初期化を行うことが推奨されます。</p>
<h3 style="color: blue;">4. 変数の性質に応じた宣言位置の選択</h3>
<p>現代の規格では自由な位置で宣言が可能ですが、コードの可読性を保つためには変数の役割に応じた整理が有効です。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6; background-color: #f9f9f9;">・<b>一時的な計算用変数</b>：使用する直前で宣言することで、変数の有効範囲（スコープ）を限定し、コードの複雑さを抑えます。<br />
・<b>主要な制御変数</b>：関数全体に関わる重要な変数は、あえて冒頭にまとめることで、その処理で何が中心的な役割を果たすかを明示できます。</div>
<h3 style="color: blue;">5. 理解度チェック！練習問題</h3>
<p><b>【 復習問題 】</b> 現代のC言語（C99以降）における変数の宣言について、**正しい説明**はどれでしょうか？</p>
<p><b>選択肢：</b><br />
A. 変数の宣言は必ず関数の1行目に書かなければならない。<br />
B. `int a = 10;` のように、宣言と同時に値を代入（初期化）することができる。<br />
C. 初期化していない変数には、自動的に「0」が代入される。<br />
D. `int` 型の変数には、後から文字列を代入できる。</p>
<details style="margin-top: 10px; border: 1px solid #aaa; padding: 10px; border-radius: 5px;"> <summary style="cursor: pointer; font-weight: bold;">正解と解説を見る</summary>
<p><b>正解：B</b></p>
<p>宣言と同時に初期化を行うのは、現代のC言語における標準的な作法です。初期化されていない変数には不定値が入るため、Bが唯一の正解となります。</p>
</details>
<h3 style="color: blue;">6. まとめ</h3>
<p>C99規格による制約の緩和は、C言語の記述効率を大きく向上させました。MacのClang環境では、これらのモダンな仕様をデフォルトで利用できます。変数の性質を見極め、適切な位置で宣言・初期化を行うことで、堅牢なプログラムの構築が可能になります。</p>]]>
    </description>
    <category>【データベース:Oracle復習】</category>
    <link>https://aieyzumcrgpdbggt.blog.shinobi.jp/Entry/903/</link>
    <pubDate>Thu, 07 May 2026 21:21:37 GMT</pubDate>
    <guid isPermaLink="false">aieyzumcrgpdbggt.blog.shinobi.jp://entry/903</guid>
  </item>
    <item>
    <title>【C言語入門】コメントを使いこなす：ソースコードに「メモ」を残す2つの方法</title>
    <description>
    <![CDATA[<p><br />
プログラムを読みやすくしたり、一時的に特定の処理を無効化（コメントアウト）したりするために欠かせないのが「コメント」です。実はC言語には2種類の書き方があり、それぞれ使えるようになった「時代（規格）」が異なります。</p>
<h3 style="color: blue;">1. 実践：2種類のコメントを書いてみる</h3>
<p><b>【 手を動かして確認 】</b> 新しく `comment.c` を作成し、以下のコードをコンパイルしてみてください。コメント部分はコンパイラに無視されるため、実行結果には影響しません。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6; background-color: #f9f9f9;">#include &lt;stdio.h&gt;<br />
<br />
int main(void) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;/* これは「複数行」コメントです。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;昔から使われている伝統的な書き方です */<br />
&nbsp;&nbsp;&nbsp;&nbsp;printf("Hello with Comments!\n");<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;// これは「1行」コメントです。現代の主流です。<br />
&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br />
}</div>
<h3 style="color: blue;">2. 伝統的な書き方：/* 文字列 */</h3>
<p><b>【 ここがエンジニアの視点 】</b> 最初期のC言語（旧規格）から存在する書き方です。記号で囲った範囲すべてがコメントになるため、長い解説を書くのに適しています。ただし、`/* ... /* ... */ */` のように入れ子（ネスト）にすることはできません。最初の `*/` が現れた時点でコメント終了とみなされ、エラーの原因になります。</p>
<h3 style="color: blue;">3. 現代的な書き方：// 文字列</h3>
<p><b>【 ここが仕組みのキモ 】</b> 行の途中に `//` を書くと、その行の末尾までがコメントになります。実はこれ、もともとはC++という別の言語の機能でしたが、<b>C99規格（1999年）から正式にC言語でも使えるようになりました。</b>今のMac（C17/C11）環境であれば、何の問題もなく使用可能です。</p>
<h3 style="color: blue;">4. 個人的な見解：なぜ「//」を優先して使うのか</h3>
<p><b>【 ここがこだわり 】</b> 2つの書き方がありますが、個人的には<b>「//」をメインで使う</b>ようにしています。その理由は、圧倒的に<b>「コードの修正（デバッグ）がしやすいから」</b>です。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6; background-color: #f9f9f9;">★ <b>修正のしやすさ（メンテナンス性）</b><br />
・`/* */` は、開始と終了の両方の記号を意識しなければならず、範囲を広げたり縮めたりする際に手間がかかります。<br />
・一方 `//` は、行の先頭に付ける・外すだけの単純作業で済みます。最近のエディタ（VS Codeなど）のショートカット機能とも相性が良く、直感的にコメントアウト・解除を切り替えられるのがメリットです。<br />
<br />
古いソースコードの保守でどうしても必要な場合を除き、普段の学習や開発では `//` だけで統一したほうが、作業効率は格段に上がると感じています。</div>
<h3 style="color: blue;">5. 理解度チェック！練習問題</h3>
<p><b>【 チャレンジ 】</b> C言語のコメントに関する説明として、**間違っているもの**はどれでしょうか？</p>
<p><b>選択肢：</b><br />
A. `/* */` は複数行を囲むことができる。<br />
B. `//` は行の末尾までをコメントにする。<br />
C. `//` 形式は、最初期のC言語（C89）でも標準で使えた。<br />
D. コメントアウトを活用すると、特定の手続きを一時的に無効化できる。</p>
<details style="margin-top: 10px; border: 1px solid #aaa; padding: 10px; border-radius: 5px;"> <summary style="cursor: pointer; font-weight: bold;">正解と解説を見る</summary>
<p><b>正解：C</b></p>
<p>`//` 形式がC言語の標準規格（C99）に採用されたのは1999年です。それより前の非常に古い規格では、`/* */` しか認められていませんでした。現在のMac環境（C17など）では気にせず使ってOKです。</p>
</details>
<h3 style="color: blue;">6. まとめ：やってみて分かったこと</h3>
<p>「なぜ2種類あるのか？」という疑問を深掘りすると、C言語が歩んできた進化の歴史に突き当たります。個人的にはメンテナンス性を重視して `//` を推奨しますが、両方の特徴を知っておくことで、他人が書いたコードを読む際にも戸惑わずに済みます。自分なりの「書き方のルール」を持って、楽しくコードを書いていきましょう。</p>]]>
    </description>
    <category>【C言語入門-練習問題付き】</category>
    <link>https://aieyzumcrgpdbggt.blog.shinobi.jp/Entry/902/</link>
    <pubDate>Wed, 06 May 2026 13:17:22 GMT</pubDate>
    <guid isPermaLink="false">aieyzumcrgpdbggt.blog.shinobi.jp://entry/902</guid>
  </item>
    <item>
    <title>【C言語入門】Macターミナルで解き明かす：コンパイラ「Clang」とC言語規格（C11/C17）の深い関係</title>
    <description>
    <![CDATA[<p><br />
ターミナルで `clang` と打ち込んでコンパイルしているとき、裏側では一体何が起きているのでしょうか。今回は、ツールとしてのコンパイラと、言語のルールである「規格」の関係、そして自分の環境の正体を暴く方法まで、まとめて解説します。</p>
<h3 style="color: blue;">1. 料理人とレシピの関係：ClangとC言語規格</h3>
<p><b>【 ここがポイント 】</b> C言語の学習において、コンパイラと規格は「料理人とレシピ」の関係に似ています。この違いを理解すると、エラーの原因や書き方のマナーがより鮮明に見えてきます。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6; background-color: #f9f9f9;">★ <b>Clang（料理人）</b><br />
・Mac標準のコンパイラ。ソースコードを読み、CPUが実行できる形に翻訳する「実務担当」です。<br />
<br />
★ <b>C言語規格（レシピ）</b><br />
・「C11」や「C17」といった、言語の書き方の公式ルールです。時代に合わせて更新されます。</div>
<h3 style="color: blue;">2. C言語の主な規格（C99 / C11 / C17）</h3>
<p><b>【 ここがポイント 】</b> C言語は1970年代に誕生しましたが、今も進化し続けています。特に重要なのが以下の3つです。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6; background-color: #f9f9f9;">・<b>C99</b>：1999年制定。変数の宣言をコードの途中で書けるようになるなど、便利になった世代。<br />
・<b>C11</b>：2011年制定。より高度な処理（並列処理など）への対応が強化されました。<br />
・<b>C17</b>：2018年制定。C11のバグ修正が中心の、現在最も「標準」として使われる安定したルール。</div>
<h3 style="color: blue;">3. 実践：自分のMacの「デフォルト規格」を調べる</h3>
<p><b>【 ターミナルの動き 】</b> 自分のMacのコンパイラが、普段どの時代のレシピ（規格）を基準にしているかを確認してみましょう。`--version` よりもさらに深い情報を引き出すコマンドを使います。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6; background-color: #f9f9f9;"># コンパイラの内蔵設定からバージョン情報を抽出する<br />
% clang -dM -E -x c /dev/null | grep __STDC_VERSION__<br />
<br />
[ 実行結果の例 ]<br />
#define __STDC_VERSION__ 201710L</div>
<p><b>【 結果の読み方 】</b> この数値は、その規格が策定された年月（あるいはバージョン番号）を示しています。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6; background-color: #f9f9f9;">・<b>201710L</b> ＝ <b>C17</b>（最新のMacでの標準設定）<br />
・<b>201112L</b> ＝ <b>C11</b><br />
・<b>199901L</b> ＝ <b>C99</b></div>
<h3 style="color: blue;">4. 応用：あえて規格を指定してビルドする</h3>
<p><b>【 ターミナルの動き 】</b> 特定のルールで厳格にチェックしたいときは、コンパイル時に `-std` オプションを付けます。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6; background-color: #f9f9f9;"># C11のルールに従ってコンパイルする場合<br />
clang -std=c11 hello.c -o hello</div>
<h3 style="color: blue;">5. 理解度チェック！練習問題</h3>
<p><b>【 チャレンジ 】</b> 今回学んだ内容の復習です。コンパイル時に、特定のC言語規格（例：C11）に準拠させるための正しい指定方法はどれでしょうか？</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6; background-color: #f9f9f9;"># 記述例：<br />
clang 【 空欄 】 hello.c -o hello</div>
<p><b>選択肢：</b><br />
A. -ver=c11<br />
B. -mode=c11<br />
C. -std=c11<br />
D. -rule=c11</p>
<details style="margin-top: 10px; border: 1px solid #aaa; padding: 10px; border-radius: 5px;"> <summary style="cursor: pointer; font-weight: bold;">正解と解説を見る</summary>
<p><b>正解：C. -std=c11</b></p>
<p>「Standard（規格）」を意味する <b>-std</b> オプションを使います。これによって、コンパイラという「料理人」にどの「レシピ」を使うかを明示的に指示できます。</p>
</details>
<h3 style="color: blue;">6. まとめ：やってみて分かったこと</h3>
<p>単に「プログラムを動かす」だけでなく、背後にある「Clang」というツールの特性や、「C17（201710L）」という準拠規格を知ることで、自分が今どの時代の技術を使っているのかが鮮明になりました。この「環境への理解」こそが、トラブルに強いエンジニアへの第一歩です。</p>]]>
    </description>
    <category>【C言語入門-練習問題付き】</category>
    <link>https://aieyzumcrgpdbggt.blog.shinobi.jp/Entry/901/</link>
    <pubDate>Wed, 06 May 2026 13:03:22 GMT</pubDate>
    <guid isPermaLink="false">aieyzumcrgpdbggt.blog.shinobi.jp://entry/901</guid>
  </item>
    <item>
    <title>【C言語入門】printfマスター：計算結果を表示する「書式指定子」の役割</title>
    <description>
    <![CDATA[<p><br />
前回の「Hello World」に続き、今回はコンピュータの本領である「計算」の結果を表示させてみます。C言語で数値を扱う際に避けて通れないのが、printf関数の<b>書式指定（フォーマット）</b>という仕組みです。</p>
<h3 style="color: blue;">1. 実践：計算結果を表示するプログラム</h3>
<p><b>【 手を動かして確認 】</b> 新しく `calc.c` というファイルを作成し、以下のコードを記述します。ただの文字列ではなく、実行時に計算が行われ、その結果が画面に表示されます。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6; background-color: #f9f9f9;">#include &lt;stdio.h&gt;<br />
<br />
int main(void) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;// 「%d」という穴に、1+1の結果を流し込む<br />
&nbsp;&nbsp;&nbsp;&nbsp;printf("計算結果は %d です\n", 1 + 1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br />
}</div>
<h3 style="color: blue;">2. コンパイルと実行結果</h3>
<p><b>【 ターミナルの動き 】</b> ターミナルでビルドして実行します。プログラムの中に「2」という数字は書いていませんが、実行時に計算された結果が出力されることを確認してください。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6; background-color: #f9f9f9;">% clang calc.c -o calc<br />
% ./calc<br />
計算結果は 2 です</div>
<h3 style="color: blue;">3. 【重要解説】printfの「書式指定子」とは？</h3>
<p><b>【 ここが仕組みのキモ 】</b> printfの「f」は **formatted（書式化された）** の略。単に表示するだけでなく、データをどのような形式で表示するかを指定できるのが最大の特徴です。ここで使った **`%d`** は、その中核となる「データの予約席」の役割を果たします。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6; background-color: #f9f9f9;">★ <b>%d の正体</b><br />
・<b>役割</b>：10進数の整数（Decimal）を表示するための「型抜き」のようなもの。<br />
・<b>対応関係</b>：カンマの後に書いた「1 + 1」という計算結果が、この `%d` の場所に自動的に流し込まれます。<br />
<br />
★ <b>なぜ直接数字を書かないのか？</b>：<br />
実際の開発では、計算の内容が複雑になったり、ユーザーの入力によって値が変化したりします。「ここは整数の場所」と事前に決めておくことで、どんな値が来ても正しく表示できる柔軟性が生まれます。</div>
<h3 style="color: blue;">4. 応用：書式とデータの対応ルール</h3>
<p><b>【 ミスを防ぐ視点 】</b> printfの中に複数の `%d` を置くことも可能です。その場合、左から順番にデータが割り当てられます。この「左からの順番」を意識することが、表示バグを防ぐ基本です。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6; background-color: #f9f9f9;">// 2つの穴に、順番に値を流し込む<br />
printf("%d と %d を足すと %d です\n", 10, 20, 10 + 20);<br />
<br />
[ 出力イメージ ]<br />
10 と 20 を足すと 30 です</div>
<h3 style="color: blue;">5. 理解度チェック！練習問題</h3>
<p><b>【 チャレンジ 】</b> 今回学んだ内容を復習しましょう。以下のプログラムの【空欄】に入る正しいコードはどれでしょうか？</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6; background-color: #f9f9f9;">#include &lt;stdio.h&gt;<br />
<br />
int main(void) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;// 「3 &times; 3 = 9」と表示させたい<br />
&nbsp;&nbsp;&nbsp;&nbsp;printf("3 * 3 = 【 空欄 】\n", 3 * 3);<br />
&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br />
}</div>
<p><b>選択肢：</b><br />
A. %s<br />
B. %d<br />
C. %f<br />
D. &amp;d</p>
<details style="margin-top: 10px; border: 1px solid #aaa; padding: 10px; border-radius: 5px;" open=""> <summary style="cursor: pointer; font-weight: bold;">正解と解説を見る</summary>
<p><b>正解：B. %d</b></p>
<p>計算結果（9）は整数なので、Decimal（10進数）を意味する「%d」を使用するのが正解です。%sは文字列、%fは小数を表示する際に使用します。</p>
</details>]]>
    </description>
    <category>【C言語入門-練習問題付き】</category>
    <link>https://aieyzumcrgpdbggt.blog.shinobi.jp/Entry/900/</link>
    <pubDate>Wed, 06 May 2026 12:53:57 GMT</pubDate>
    <guid isPermaLink="false">aieyzumcrgpdbggt.blog.shinobi.jp://entry/900</guid>
  </item>
    <item>
    <title>【C言語入門】Macターミナルで始めるC言語：Xcodeを使わずにClangで「Hello World」を動かす最短ルート</title>
    <description>
    <![CDATA[<p><br />
プログラミングの原点とも言えるC言語。Mac（Apple Silicon）環境には、標準で高性能なコンパイラ「Clang」が備わっています。今回は、重厚なGUIを持つXcodeはあえて使わず、ターミナルだけでコードを書き、ビルドして実行するまでの「一連の儀式」を、実際の動作環境に基づいて解説します。</p>
<h3 style="color: blue;">1. 開発環境の確認：Apple Clang (arm64)</h3>
<p><b>【 手を動かして確認 】</b> まずは、自分のMacに武器が備わっているか確認します。現在のMac（M1/M2/M3/M4チップ）では、アーキテクチャが「arm64」となっているのが特徴です。ターミナルで以下の結果が返ってくれば、準備は万端です。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6; background-color: #f9f9f9;">% clang --version<br />
Apple clang version 17.0.0 (clang-1700.0.13.5)<br />
Target: arm64-apple-darwin24.6.0<br />
InstalledDir: /Library/Developer/CommandLineTools/usr/bin</div>
<p>※ `Target: arm64` は、Apple Siliconに最適化されたバイナリを生成することを示しています。</p>
<h3 style="color: blue;">2. 作業ディレクトリの作成</h3>
<p><b>【 実践のポイント 】</b> 学習用のコードが散らからないよう、専用のディレクトリ（フォルダ）を用意します。こうした小さな整理整頓が、後のデバッグ効率を左右します。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6; background-color: #f9f9f9;"># デスクトップに学習用フォルダを作成して移動<br />
mkdir -p ~/Desktop/c-study &amp;&amp; cd ~/Desktop/c-study<br />
<br />
# 現在のディレクトリを確認<br />
pwd</div>
<h3 style="color: blue;">3. ソースコードの記述：hello.c</h3>
<p><b>【 ここがエンジニアの視点 】</b> テキストエディタを開き、以下のコードを入力して `hello.c` という名前で保存します。C言語の最も基本的な構成要素（標準入出力のインクルードと、main関数）のみを記述します。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6; background-color: #f9f9f9;">#include &lt;stdio.h&gt;<br />
<br />
int main(void) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;printf("Hello, World!\n");<br />
&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br />
}</div>
<h3 style="color: blue;">4. コンパイルの実行（ビルド）</h3>
<p><b>【 ターミナルの動き 】</b> 書いたばかりのテキスト（ソースコード）を、arm64アーキテクチャが理解できる実行ファイルへ変換します。`-o` オプションで、出力ファイル名を指定するのがMac流のスマートなやり方です。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6; background-color: #f9f9f9;"># hello.c を元に、実行ファイル hello を生成<br />
clang hello.c -o hello<br />
<br />
# 実行ファイルができたか確認（lsコマンド）<br />
ls -F<br />
&rarr; hello* と表示されればビルド成功です。</div>
<h3 style="color: blue;">5. プログラムの実行</h3>
<p><b>【 実行時の注意点 】</b> いよいよ実行です。カレントディレクトリにあるファイルを明示的に指定するため、頭に `./` を付けて実行ファイルを叩きます。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6; background-color: #f9f9f9;"># 実行<br />
./hello<br />
<br />
[ 出力結果 ]<br />
Hello, World!</div>
<h3 style="color: blue;">6. 【重要解説】なぜ `InstalledDir` がそこにあるのか？</h3>
<p><b>【 ここが仕組みのキモ 】</b> 先ほどのバージョン確認で表示された `InstalledDir: /Library/Developer/CommandLineTools/...` というパス。これは、Macが「Xcode本体をインストールしなくても、開発に必要な最小限のツール（Command Line Tools）を個別に管理している場所」を指しています。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6; background-color: #f9f9f9;">★ <b>Clangが選ばれる理由</b><br />
・Apple Silicon（arm64）への最適化が極めて優秀。<br />
・エラーメッセージが親切で、初心者でも「どこでミスしたか」が分かりやすい。<br />
<br />
★ <b>arm64アーキテクチャの意識</b>：<br />
今のMacで作った実行ファイルは、そのままでは古いIntel Mac（x86_64）では動きません。このように「どのCPU向けの実行ファイルを作るか」を意識することが、低レイヤを学ぶ醍醐味の一つです。</div>
<h3 style="color: blue;">7. 理解度チェック！練習問題</h3>
<p><b>【 チャレンジ 】</b> 今回の手順を復習しましょう。Macのターミナルで、カレントディレクトリにある実行ファイル「hello」を起動するための正しいコマンドはどれでしょうか？</p>
<p><b>選択肢：</b><br />
A. run hello<br />
B. hello.exe<br />
C. ./hello<br />
D. clang hello</p>
<details style="margin-top: 10px; border: 1px solid #aaa; padding: 10px; border-radius: 5px;"> <summary style="cursor: pointer; font-weight: bold;">正解と解説を見る</summary>
<p><b>正解：C. ./hello</b></p>
<p>セキュリティ上の理由から、ターミナルでは現在のディレクトリ（./）を明示的に指定して実行するルールになっています。clang hello と打つと、実行ではなく再コンパイルを試みようとしてエラーになるので注意しましょう。</p>
</details>
<h3 style="color: blue;">8. まとめ：やってみて分かったこと</h3>
<p>「コンパイル」という一見手間のかかるステップを踏むことで、テキストが「動くプログラム」に変わる瞬間を肌で感じることができました。IDE（統合開発環境）のボタン一つで実行するのも便利ですが、ターミナルで `clang` コマンドを直接叩く経験は、パスの概念やコンパイルプロセスの理解を深め、エンジニアとしての基礎体力を確実に底上げしてくれます。<br />
<br />
<br />
</p>]]>
    </description>
    <category>【C言語入門-練習問題付き】</category>
    <link>https://aieyzumcrgpdbggt.blog.shinobi.jp/Entry/899/</link>
    <pubDate>Wed, 06 May 2026 11:43:23 GMT</pubDate>
    <guid isPermaLink="false">aieyzumcrgpdbggt.blog.shinobi.jp://entry/899</guid>
  </item>
    <item>
    <title>【DBテクニック】SQLの実行速度を劇的に変える「チューニングの定石」</title>
    <description>
    <![CDATA[<p><br />
同じ結果を得るSQLでも、書き方ひとつでデータベース内部の「仕事量」は天と地ほど変わります。今回は、実行計画を意識した「現場で即効性のある」チューニングの一般事項を整理しました。</p>
<h3 style="color: blue;">1. 検索アルゴリズムを最適化する</h3>
<p><b>【 現場の感触 】</b> データベースに「無駄な探索」をさせないのが基本です。特に存在確認などは、最後まで数えるか、見つかった瞬間に止めるかで雲泥の差が出ます。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6; background-color: #f9f9f9;">★ <b>COUNTよりEXISTS</b>：1件でも条件に合う行が見つかれば探索を終了するため、全件スキャンするCOUNTより圧倒的に高速です。<br />
★ <b>ORよりIN</b>：ORを多用するとインデックスが効かなくなる場合がありますが、IN演算子（定数リスト）はオプティマイザが最適化しやすく、実行計画が安定します。<br />
★ <b>「＜」「＞」よりBETWEEN</b>：範囲指定が明確になり、インデックスレンジスキャンの効率が上がります。</div>
<h3 style="color: blue;">2. 余計な「ソート」と「スキャン」を削る</h3>
<p><b>【 現場の感触 】</b> データベースにとって最も重い処理の一つが「重複排除（ソート）」と「全表スキャン」です。これらを回避する選択がパフォーマンスの鍵です。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6; background-color: #f9f9f9;">★ <b>UNIONよりUNION ALL</b>：UNIONは重複を消すために内部で「ソート」を強制します。重複がないと分かっているなら、ソート不要のUNION ALLが鉄則です。<br />
★ <b>COUNT(*)よりCOUNT(主キー)</b>：製品によりますが、主キーを指定することで「インデックスだけを見れば済む（Index Only Scan）」状態になり、データ本体へのアクセスを減らせる場合があります。<br />
★ <b>インデックスの作成</b>：言うまでもなく基本中の基本。WHERE句やJOINキーへの適切なインデックス配置が全ての土台です。</div>
<h3 style="color: blue;">3. 解析器（オプティマイザ）のクセを掴む</h3>
<p><b>【 現場の感触 】</b> SQLは「書いた順序」が評価に影響することがあります。データベースの解析エンジンがどう動くかを意識して記述しましょう。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6; background-color: #f9f9f9;">★ <b>IN演算子の評価順序</b>：一般にINの中身は「左から順に」評価されます。ヒットする確率が高い値を左に置くことで、判定コストを下げられます。<br />
★ <b>WHERE句の記述順序</b>：多くのDBではWHERE句に書かれた順にフィルターをかけます。データ件数をより大きく絞り込める条件を「先に」書くことで、後続の判定対象を減らすのがセオリーです。</div>
<h3 style="color: blue;">4. まとめ：チューニングは「DBとの対話」</h3>
<p>今回紹介した項目は、いずれも「DBの内部リソース（CPU・メモリ・I/O）をいかに節約するか」に直結しています。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6; background-color: #f9f9f9;">★ <b>改善のチェックリスト</b>：<br />
1. 重複排除（UNION）を無意識に使っていないか？<br />
2. 全件カウント（COUNT）で存在確認していないか？<br />
3. WHERE句の条件順序は最適か？</div>
<p><br />
一つ一つは小さな工夫ですが、大量データを扱う本番環境ではこの積み重ねが「100倍の速度差」となって現れます。実行計画（EXPLAIN）を確認しながら、最適な一文を追求していきましょう。<br />
<br />
<br />
</p>]]>
    </description>
    <category>【データベースの知識】</category>
    <link>https://aieyzumcrgpdbggt.blog.shinobi.jp/Entry/898/</link>
    <pubDate>Tue, 05 May 2026 21:07:17 GMT</pubDate>
    <guid isPermaLink="false">aieyzumcrgpdbggt.blog.shinobi.jp://entry/898</guid>
  </item>
    <item>
    <title>【db.c】MacとC言語でデータベースをゼロからビルドしてみた完全実録</title>
    <description>
    <![CDATA[<p><br />
データベースの内部構造を理解するために、SQLiteの構造をモデルにした「db.c」をMac（Apple Silicon）環境で動かしてみました。環境構築から、誰もが抱く「あの疑問」の解決まで、省略なしの全行程を記録します。</p>
<h3 style="color: blue;">1. 開発環境の準備：Xcode Command Line Tools</h3>
<p><b>【 現場の感触 】</b> MacでC言語をコンパイルするには、Apple純正のコンパイラ（Clang）が必要です。まずはターミナルから、開発の「儀式」とも言えるツールのインストールから始めます。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6; background-color: #f9f9f9;"># ターミナル（Terminal.app）を起動し、以下を入力<br />
xcode-select --install<br />
<br />
※すでにインストール済みの場合は「already installed」と表示されます。未導入ならポップアップに従ってインストールを完了させてください。</div>
<h3 style="color: blue;">2. ソースコードの取得とディレクトリ作成</h3>
<p><b>【 現場の感触 】</b> 作業用フォルダを作成し、GitHubから最新の db.c をダウンロードします。curlコマンドを使って、GitHubのマスターリポジトリから直接保存します。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6; background-color: #f9f9f9;"># 作業フォルダの作成と移動<br />
mkdir ~/db-study &amp;&amp; cd ~/db-study<br />
<br />
# ソースコードのダウンロード<br />
curl -O https://raw.githubusercontent.com/cstack/db_tutorial/master/db.c</div>
<h3 style="color: blue;">3. コンパイルの実行</h3>
<p><b>【 現場の感触 】</b> Mac標準のコンパイラ（Clang）を使用して、ソースコードを実行可能なバイナリファイルに変換します。エラーが出なければ、同じフォルダ内に「db」という実行ファイルが作成されます。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6; background-color: #f9f9f9;"># clangでビルド。-o は出力ファイル名の指定。<br />
clang db.c -o db<br />
<br />
# 実行ファイルができたか確認（lsコマンド）<br />
ls -F<br />
&rarr; db* と表示されれば準備完了です。</div>
<h3 style="color: blue;">4. データベースの起動と操作（実践）</h3>
<p><b>【 現場の感触 】</b> 実際にプログラムを動かし、データを入力してみます。ここで驚くのが、<b>「CREATE TABLE」を一度も叩かずに insert ができてしまう</b>ことです。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6; background-color: #f9f9f9;"># 起動。引数にデータベースファイル名（mydb.db）を指定。<br />
./db mydb.db<br />
<br />
db &gt; insert 1 user1 person1@example.com<br />
Executed.<br />
db &gt; insert 2 user2 person2@example.com<br />
Executed.<br />
<br />
db &gt; select<br />
(1, user1, person1@example.com)<br />
(2, user2, person2@example.com)<br />
<br />
db &gt; .exit</div>
<h3 style="color: blue;">5. 【重要解説】なぜ「表」を作らなくても入るのか？</h3>
<p><b>【 仕組み 】</b> 通常のDBではありえないこの挙動の理由は、ソースコードの中にあります。この `db.c` は、<b>「ID、Username、Email」という3つの列を持つ1つのテーブルしか扱えないように、最初から「構造」がプログラムに直接書き込まれている（ハードコードされている）</b>からです。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6; background-color: #f9f9f9;">★ <b>スキーマとプログラムの合体</b><br />
・通常の汎用DB：何が来るか不明なため、まず「表の定義（メタデータ）」を作る必要がある。<br />
・自作 db.c：最初から「ID(4byte)、名前(32byte)、メルアド(255byte)」という1行291byteの固定データが来ると知っている。<br />
<br />
★ <b>メリット</b>：<br />
1行のサイズが常に一定（固定長）なので、n行目を探すには「291 &times; n」バイト目を見に行くだけで済みます。この割り切りが、自作DBの学習をシンプルにしています。</div>
<h3 style="color: blue;">6. 本質的な「検証」：データの永続性確認</h3>
<p><b>【 現場の感触 】</b> 最後に、プロセスを終了してもデータが消えないことを確認します。これこそが「データベースを極める」ための第一歩です。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6; background-color: #f9f9f9;">[ 再起動テスト ]<br />
① 再度実行： ./db mydb.db<br />
② データの確認： select と入力<br />
<br />
[ 結果 ]<br />
先ほど入れたデータがそのまま表示されれば、<b>「ファイルへのページ書き出し（Persistence）」</b>の仕組みが正常に動いている証拠です。</div>
<h3 style="color: blue;">7. まとめ：やってみて分かったこと</h3>
<p>「CREATE TABLEがいらない」のではなく、<b>「最初から1つだけCREATE済みの表がある状態で起動している」</b>という設計。この仕組みを理解することで、DBの心臓部である「ファイルI/O」や「ページ管理」がいかに動いているか、その一端を鮮明に体感することができました。</p>
<p><br />
巨大なRDBMSも、突き詰めればこうした「ファイルの読み書き」の積み重ね。自作してみることで、トラブル時にも「今はディスクと対話中かな？」といった具体的な想像力が働くようになります。<br />
<br />
<br />
</p>]]>
    </description>
    <category>【データベース:db.c】</category>
    <link>https://aieyzumcrgpdbggt.blog.shinobi.jp/Entry/897/</link>
    <pubDate>Mon, 04 May 2026 23:17:13 GMT</pubDate>
    <guid isPermaLink="false">aieyzumcrgpdbggt.blog.shinobi.jp://entry/897</guid>
  </item>
    <item>
    <title>【データベースの知識】SQLパフォーマンスチューニングの即効ヒント</title>
    <description>
    <![CDATA[<p><br />
同じ結果を得るSQLでも、書き方ひとつでデータベース内部の「仕事量」は劇的に変わります。今回は、明日からの開発でそのまま使える、実行速度を劇的に改善するための6つのTipsを紹介します。</p>
<h3 style="color: blue;">1. 実行効率を高める書き方の基本</h3>
<p><b>【 基本 】</b> データベースエンジンにとって、無駄なスキャンや重複排除（ソート）は最大の敵です。まずは、より効率的な演算子や関数を選ぶことから始めましょう。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6; background-color: #f9f9f9;">★ <b>COUNTよりEXISTS</b>：1件見つかった瞬間に検索を終了するため、全件カウントするより圧倒的に高速です。<br />
★ <b>UNIONよりUNION ALL</b>：UNIONは重複を消すために内部で「ソート」が発生します。重複がないと分かっているならALL一択です。<br />
★ <b>ORよりIN</b>：ORを多用するとインデックスが効かなくなる場合があります。複数の値を指定するならIN演算子の方が最適化されやすいです。</div>
<h3 style="color: blue;">2. インデックスとデータアクセスの最適化</h3>
<p><b>【 ポイント 】</b> インデックスはただ作るだけでなく、「使われるように書く」のがコツです。また、読み込むデータの範囲をいかに絞り込むかが勝負を分けます。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6; background-color: #f9f9f9;">★ <b>インデックスの作成</b>：WHERE句やJOINの結合キーには必ずインデックスを検討しましょう。<br />
★ <b>COUNT(*)より主キー参照</b>：製品によっては、主キーを指定することでインデックススキャンのみで処理が完結し、高速化する場合があります。<br />
★ <b>範囲指定はBETWEEN</b>：`col &gt; 10 AND col &lt; 20` と書くより、`BETWEEN` を使う方がオプティマイザが範囲を正しく認識しやすく、読みやすいSQLになります。</div>
<h3 style="color: blue;">3. まとめ：チューニングの優先順位</h3>
<p>闇雲に修正するのではなく、まずは以下の表を参考に、コストの高い部分から手を入れていきましょう。</p>
<table style="width: 100%; border-collapse: collapse; font-family: sans-serif; font-size: 0.9em; background-color: #fdfdfd;">
<tbody>
<tr style="background-color: #eee;"><th style="border: 1px solid #ccc; padding: 8px;">改善項目</th><th style="border: 1px solid #ccc; padding: 8px;">修正前</th><th style="border: 1px solid #ccc; padding: 8px;">推奨（修正後）</th><th style="border: 1px solid #ccc; padding: 8px;">効果の理由</th></tr>
<tr>
<td style="border: 1px solid #ccc; padding: 8px;"><b>存在確認</b></td>
<td style="border: 1px solid #ccc; padding: 8px;">COUNT(*) &gt; 0</td>
<td style="border: 1px solid #ccc; padding: 8px;"><b>EXISTS</b></td>
<td style="border: 1px solid #ccc; padding: 8px;">見つかったら即終了</td>
</tr>
<tr>
<td style="border: 1px solid #ccc; padding: 8px;"><b>集合演算</b></td>
<td style="border: 1px solid #ccc; padding: 8px;">UNION</td>
<td style="border: 1px solid #ccc; padding: 8px;"><b>UNION ALL</b></td>
<td style="border: 1px solid #ccc; padding: 8px;">ソート処理をスキップ</td>
</tr>
<tr>
<td style="border: 1px solid #ccc; padding: 8px;"><b>複数指定</b></td>
<td style="border: 1px solid #ccc; padding: 8px;">OR ... OR ...</td>
<td style="border: 1px solid #ccc; padding: 8px;"><b>IN ( ... )</b></td>
<td style="border: 1px solid #ccc; padding: 8px;">可読性と解析効率の向上</td>
</tr>
</tbody>
</table>
<p><br />
パフォーマンスチューニングに「銀の弾丸」はありませんが、これらの定石を組み合わせることで、システムのレスポンスは確実に見違えるはずです。</p>]]>
    </description>
    <category>【データベースの知識】</category>
    <link>https://aieyzumcrgpdbggt.blog.shinobi.jp/Entry/896/</link>
    <pubDate>Mon, 04 May 2026 22:24:20 GMT</pubDate>
    <guid isPermaLink="false">aieyzumcrgpdbggt.blog.shinobi.jp://entry/896</guid>
  </item>
    <item>
    <title>【PostgreSQL】論理レプリケーションを自前で動かしてみた実録</title>
    <description>
    <![CDATA[<p><br />
実際に手を動かすのが一番。ということで、PostgreSQLの論理レプリケーションをローカル環境で構築してみました。パブリッシャー（出す側）とサブスクライバー（受ける側）のやり取りを、実際にコマンドを叩きながら追いかけます。</p>
<h3 style="color: blue;">1. 設定の落とし穴：wal_levelの変更</h3>
<p><b>【 現場の感触 】</b> 最初のハードルは設定変更です。デフォルトでは論理レプリケーション用のログが出ないので、`postgresql.conf` を書き換えます。再起動が必要なので、本番環境なら「ちょっと待って」となるところですね。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6; background-color: #f9f9f9;"># wal_level を logical にして再起動！<br />
show wal_level;<br />
<br />
[ 結果 ]<br />
wal_level <br />
-----------<br />
logical &larr; これで準備完了。</div>
<h3 style="color: blue;">2. パブリケーションの作成と権限の「儀式」</h3>
<p><b>【 現場の感触 】</b> テーブルを作ってデータを放り込みます。ここで大事なのは「主キー（PK）」があること。論理レプリケーションでは「どの行を更新するか」を特定するためにPKが必須です。あとは接続用の専用ユーザーを作って、権限を付与します。この「運び屋」を作る作業がレプリケーションっぽさを感じさせます。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6; background-color: #f9f9f9;">-- 全テーブルを対象にパブリケーション作成<br />
CREATE PUBLICATION pub FOR ALL TABLES;<br />
<br />
-- レプリケーション専用の「運び屋」ユーザーを作る<br />
CREATE ROLE repluser LOGIN REPLICATION PASSWORD 'repluser';<br />
GRANT pg_read_all_data TO repluser;</div>
<h3 style="color: blue;">3. 同期開始！サブスクリプションの威力</h3>
<p><b>【 現場の感触 】</b> サブスクライバー側で接続情報を指定してサブスクリプションを作成。実行した瞬間に、既存のデータが「バッ」と流れてくるのは見ていて気持ちいいものです。試しにデータを1行追加すると、即座に反映されるのが確認できました。まさにリアルタイム！</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6; background-color: #f9f9f9;">-- サブスクライバー側で実行（ここで同期が始まる）<br />
CREATE SUBSCRIPTION sub CONNECTION 'host=... user=repluser...' PUBLICATION pub;<br />
<br />
-- パブリッシャー側で insert<br />
insert into sample_table values(3, 'ccc');<br />
<br />
-- サブスクライバー側で確認<br />
select * from sample_table; &rarr; ちゃんと 3 | ccc が反映されている！</div>
<h3 style="color: blue;">4. 応用：同期を止めても「裏で溜まっている」</h3>
<p><b>【 現場の感触 】</b> 運用でよくある「一時停止（DISABLE）」も試しました。停止中にパブリッシャー側でガシガシ更新（'ddd'を追加）しても、サブスクライバー側は静かなまま。でも、再度「ENABLE」にした瞬間、溜まっていた更新が追い付いてくる。この確実性が論理レプリの頼もしいところです。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6; background-color: #f9f9f9;">★ <b>検証のまとめ</b>：<br />
1. DISABLEにすると、サブスクライバー側はピタッと止まる。<br />
2. パブリッシャー側の変更は破棄されず、裏（スロット）に保持される。<br />
3. ENABLEに戻すと、未反映分が高速に流し込まれる。</div>
<p><br />
実際にやってみると、コマンド一発で同期が制御できる手軽さと、内部でWALがしっかり管理されている安心感がよく分かりました。バージョン間のデータ移行や、特定のデータ集約には最高に便利そうです。</p>]]>
    </description>
    <category>【データベース:PostgreSQL】</category>
    <link>https://aieyzumcrgpdbggt.blog.shinobi.jp/Entry/895/</link>
    <pubDate>Mon, 04 May 2026 22:20:19 GMT</pubDate>
    <guid isPermaLink="false">aieyzumcrgpdbggt.blog.shinobi.jp://entry/895</guid>
  </item>

    </channel>
</rss>