<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>AI | www.kabosu.info</title>
	<atom:link href="https://www.kabosu.info/category/ai/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.kabosu.info</link>
	<description>サーバ・ネットワークの覚え書き</description>
	<lastBuildDate>Mon, 21 Sep 2026 05:38:09 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.1</generator>
<site xmlns="com-wordpress:feed-additions:1">178840153</site>	<item>
		<title>このサイトの見た目を AI と作り直した（ブロックテーマ自作）</title>
		<link>https://www.kabosu.info/2026/09/kabosu-block-theme-with-ai/</link>
					<comments>https://www.kabosu.info/2026/09/kabosu-block-theme-with-ai/#respond</comments>
		
		<dc:creator><![CDATA[shinn]]></dc:creator>
		<pubDate>Mon, 21 Sep 2026 05:38:00 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[WordPress]]></category>
		<guid isPermaLink="false">https://www.kabosu.info/?p=775</guid>

					<description><![CDATA[<p>十年以上ほったらかしだったこのサイトの見た目を、ブロックテーマを新しく書いて作り直しました。デザインもロゴも生成 AI に作らせています。うまくいった工夫と、派手に踏んだ罠の記録です。</p>
The post <a href="https://www.kabosu.info/2026/09/kabosu-block-theme-with-ai/">このサイトの見た目を AI と作り直した（ブロックテーマ自作）</a> first appeared on <a href="https://www.kabosu.info">www.kabosu.info</a>.]]></description>
										<content:encoded><![CDATA[<blockquote class="wp-block-quote"><p><strong>この記事について</strong><br />
作業だけでなく、<strong>この記事の文章も AI（Claude）がまとめています</strong>。内容は実際の作業ログと実測値に基づいていますが、公開前に管理人が目を通しています。</p>
</blockquote>
<p>見た目が変わりました。</p>
<p>このサイトはずっと配布テーマの「First」をそのまま使っていて、しかも一度もいじっていませんでした。<br />
どれくらいいじっていなかったかというと、<strong>キャッチフレーズが &#8220;Just another WordPress site&#8221;（WordPress の初期値）のまま</strong>だったくらいです。<br />
今は「サーバ・ネットワークの覚え書き」になっています。</p>
<p>前回の<a href="https://www.kabosu.info/2026/09/almalinux10-migration-with-ai/">サーバ入れ替え</a>に続いて、これも作業はほぼ AI（Claude Code）にやらせました。</p>
<p><span id="more-775"></span></p>
<h2>子テーマをやめて、テーマを新しく書いた</h2>
<p>最初は「既存サイトをいじるなら子テーマ一択」だと思っていましたし、AI にもそう説明されました。<br />
ただ今回は見た目をまるごと変える話です。その場合、子テーマだと<strong>親テーマの CSS を打ち消す <code>!important</code> の山</strong>になります。</p>
<p>それで方針を変えて、ブロックテーマを新規に書くことにしました。理由は2つです。</p>
<p>ひとつは、色・文字サイズ・余白を <code>theme.json</code> の1か所に集約できること。<br />
もうひとつは、<strong>完成したあと自分でサイトエディタから調整できる</strong>ことです。CSS を触らずに色を変えられるのは、あとから効いてきます。</p>
<p>踏み切れたのは、事前に旧テーマを実測してもらったからでもあります。<br />
<code>functions.php</code> も <code>style.css</code> も配布物とハッシュが一致していて、<strong>自分で足した独自コードは1行も無い</strong>ことが確認できました。<br />
失うのはカスタマイザーの設定だけ、と分かれば思い切れます。</p>
<h2>本番をコピーした環境を手元に作って、そこで全部やった</h2>
<p>いきなり本番のテーマを差し替えるのは論外なので、手元に検証用の仮想マシンを立てました。<br /><strong>OS も PHP も MySQL も本番と同じバージョン</strong>に揃えてあります。</p>
<p>さらに、<strong>本番の記事データを丸ごと持ってきて、実際の記事で表示を確認</strong>しました。<br />
これが正解でした。作りたてのテーマはサンプル記事だと綺麗に見えるのに、実記事を入れたとたんに粗が出ます。</p>
<p>ちなみに記事の本文には画像が絶対 URL で書かれていたので、<strong>画像は本番から読まれます</strong>。<br />
アップロード済みの画像 49MB をコピーする必要はありませんでした。</p>
<h2>10年前の記事のコードが、地の文と同じ見た目になっていた</h2>
<p>実記事を入れて最初に見つかった問題です。</p>
<p>このサイトの古い記事は、コマンドの例を <code>&lt;blockquote&gt;&lt;code&gt;…&lt;/code&gt;&lt;/blockquote&gt;</code> で書いています。<br />
ブロックエディタが吐く <code>wp-block-code</code> ではないので、<strong>新しいテーマの CSS がまったく当たっていませんでした</strong>。公開記事21本のうち5本がこれです。</p>
<p>直すときにも2つ引っかかりました。</p>
<p><strong>1. <code>blockquote &gt; code</code> では当たらない。</strong><br />
WordPress の <code>wpautop</code> が間に <code>&lt;p&gt;</code> を挟むので、直接の子ではなくなります。子孫セレクタにする必要があります。</p>
<p><strong>2. <code>white-space: pre-wrap</code> だけ入れると行間が倍になる。</strong><br />
<code>wpautop</code> が入れた <code>&lt;br&gt;</code> と改行が二重に効くためです。<code>code br { display: none }</code> が要りました。</p>
<h2>ロゴとヘッダー画像は生成 AI に作らせた</h2>
<p>デザインを詰めていく途中で「白すぎる」「もう少し企業サイトっぽくしたい」と思い始めて、ついでに「せっかくなのでカボスも入れたい」「<code>kabosu.info</code> という文字をロゴにできないか」と欲が出ました。</p>
<p>画像は Gemini に作らせています。かぼすの輪切りを線画にして、回路のパターンと組み合わせたものです。<br />
<strong>綴りは一発で正確に出ました</strong>（生成 AI は文字が苦手なので、ここは確認必須だと思っていたのですが）。</p>
<p>効いた工夫を3つ。</p>
<p><strong>白い背景を透過に変換した。</strong><br />
生成された画像は背景が白です。そのままだと白地以外に置けないので、「白に近い画素ほど透明にする」処理をかけました。これで白地・生成り地・濃い緑地のどこに置いても破綻しません。</p>
<p><strong>線画は減色がよく効く。</strong><br />
色数を64色に落としたら <strong>349KB が 99KB（72%減）</strong>になりました。元と並べて見比べましたが、違いが分かりません。</p>
<p><strong>線画は拡大にも強い。</strong><br />
生成画像は 1024px が上限で、全幅のヘッダーに使うと大画面でぼけます。写真だとはっきり分かるのですが、<strong>線画の意匠にしたらほぼ気にならなくなりました</strong>。<br />
これは最初から狙ったわけではなく、デザインを変えた副産物です。</p>
<p>逆に、<strong>画面の中の小さなアイコンは生成 AI を使いませんでした</strong>。<br />
生成した画像のアイコンは線の太さが揃わず、小さくすると潰れます。SVG で手書きしたほうが確実ですし、テーマの色を自動で拾ってくれます。</p>
<h2>踏んだ罠</h2>
<p>ブロックテーマ特有のものが多かったので、同じところで困る人がいるかもしれません。</p>
<p><strong>カードの中身が勝手に中央寄せになる。</strong><br />
グループのレイアウトが <code>constrained</code> だと、WordPress 本体の CSS が子要素に <code>margin-inline: auto</code> を付けます。<code>default</code> にすれば左揃えに戻ります。<br />
「セクションだけ横幅が狭い」というのも原因は同じでした。</p>
<p><strong>テンプレートに書いた表示件数が効かない。</strong><br />
クエリブロックが「サイトの設定を継承する」になっていると、テーマ側の指定ではなく<strong>管理画面の表示設定に従います</strong>。<br />
3列のカード並びで10件だと最終行が1枚だけ余るので、結局サイト側の設定を9件に変えました。テーマの問題ではなかったわけです。</p>
<p><strong>背景に色を付けたら、記事本文が背景と同化した。</strong><br />
一覧ページはカードがあるので気づけるのですが、記事ページには囲いが無かったのです。<br />
記事ページだけ本文を白いパネルに載せる形にしたのですが、<strong>それでも見えませんでした</strong>。背景と白の差が2%しか無かったからです。背景をもう少し濃くして解決しました。</p>
<p><strong>そうしたら今度はカテゴリのボタンが同化した。</strong><br />
ボタンの背景色と、新しくした地の色がほぼ同じでした。<br /><strong>教訓: 地の色を変えたら、その系統の色を使っている要素を全部見直す。</strong></p>
<p><strong>記事の上の余白だけ狭かった。</strong><br />
見た目の微調整だと思ったら、<strong>中身は二重管理のバグ</strong>でした。<br />
テンプレート側が HTML に直接 <code>style="padding-top:…"</code> を書いていて、CSS より強いので上だけ効いていなかったのです。<br />
ブロックテーマはテンプレートが <code>style</code> 属性を吐くので、<strong>CSS で寸法を決めるならテンプレート側の直書きを外す</strong>のが鉄則でした。</p>
<p><strong>ロゴがヘッダーからはみ出した。</strong><br />
「生成したロゴは余白が多いので負のマージンで詰める」という定石をそのまま当てたのですが、<strong>この画像は先に余白を切り詰めてあった</strong>ので二重に効きました。<br />
目視だとよく分からなかったので、最後はブラウザで実際の座標を測って確認しています。</p>
<h2>いちばん笑ったやつ</h2>
<p>作業中、「コメント送信ボタンが縦に1600px 伸びる」という珍妙な症状が出ました。<br />
テーマの CSS をいくら見ても原因が見つかりません。</p>
<p>結論から言うと、<strong>テーマは正常でした</strong>。<br />
画面を画像に変換して確認するために自作していたツールのほうにバグがあり、ブラウザを互換モード（quirks mode）で描画させていたのが原因でした。</p>
<p><strong>教訓: テーマを疑う前に、それを映している環境を疑う。</strong></p>
<h2>おまけ — アクセスの7割は自分の監視だった</h2>
<p>構成を見直すにあたって、アクセスログも数えてもらいました。</p>
<p>結果は意外でした。<strong>リクエストの7割近くはトップページへのアクセスで、その正体は自分で仕掛けた死活監視</strong>だったのです。30秒おきに叩いていれば、そうもなります。</p>
<p>ボットと監視を除くと、人が読んでいる数はごくわずかでした。<br />
そして記事21本より、<a href="/ip/">IPアドレス確認</a>と<a href="/whois/">whois 検索</a>の2つのほうが読まれていました。</p>
<p>これを見て、見た目を直す目的を途中で変えました。<br />
アクセスを増やすためではなく、<strong>自分が納得できる形にすることと、古い手順で誰かを困らせないこと</strong>に置き直しています。<br />
3年より古い記事には「情報が古い可能性があります」という注記を出すようにしたのはそのためです。</p>The post <a href="https://www.kabosu.info/2026/09/kabosu-block-theme-with-ai/">このサイトの見た目を AI と作り直した（ブロックテーマ自作）</a> first appeared on <a href="https://www.kabosu.info">www.kabosu.info</a>.]]></content:encoded>
					
					<wfw:commentRss>https://www.kabosu.info/2026/09/kabosu-block-theme-with-ai/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">775</post-id>	</item>
		<item>
		<title>サーバを AlmaLinux 10 に入れ替えた話（作業はほぼ AI）</title>
		<link>https://www.kabosu.info/2026/09/almalinux10-migration-with-ai/</link>
					<comments>https://www.kabosu.info/2026/09/almalinux10-migration-with-ai/#respond</comments>
		
		<dc:creator><![CDATA[shinn]]></dc:creator>
		<pubDate>Mon, 21 Sep 2026 05:37:59 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[Linux]]></category>
		<guid isPermaLink="false">https://www.kabosu.info/?p=774</guid>

					<description><![CDATA[<p>サポートが切れた Amazon Linux 2 のまま動いていたサーバを、AlmaLinux 10 の 新サーバに入れ替えました。調査から手順書、構築、切り替えまでほぼ全部を AI（Claude Code）にやらせています。ダウンタイムは実質ゼロでした。</p>
The post <a href="https://www.kabosu.info/2026/09/almalinux10-migration-with-ai/">サーバを AlmaLinux 10 に入れ替えた話（作業はほぼ AI）</a> first appeared on <a href="https://www.kabosu.info">www.kabosu.info</a>.]]></description>
										<content:encoded><![CDATA[<blockquote class="wp-block-quote"><p><strong>この記事について</strong><br />
作業だけでなく、<strong>この記事の文章も AI（Claude）がまとめています</strong>。内容は実際の作業ログと実測値に基づいていますが、公開前に管理人が目を通しています。</p>
</blockquote>
<p>放置していたサーバの話です。<br />
このサイトを含む WordPress 5サイトが載っている AWS の EC2 が、ずっと Amazon Linux 2 のままでした。<br />
Amazon Linux 2 のサポートは 2026年6月30日で終了しているので、とっくに期限切れです。<br />
重い腰を上げて、AlmaLinux 10 の新しいサーバに入れ替えました。</p>
<p>今回の本題はどちらかというとそこではなく、<strong>この作業のほぼ全部を AI にやらせた</strong>という話です。<br />
使ったのは Anthropic の Claude Code。ターミナルで動く AI エージェントで、こちらの端末でコマンドを実行できます。</p>
<p><span id="more-774"></span></p>
<h2>方針 — 載せ替えずに、隣に建てて差し替える</h2>
<p>同じサーバの中で OS を上げていくやり方は、失敗したときに戻せません。<br />
なので<strong>新しいサーバを別に建てて、Elastic IP（固定IP）を付け替えるだけ</strong>にしました。<br />
うまくいかなければ IP を戻せば元通りです。</p>
<p>調べてみて助かったのが、このサーバは CloudFront（CDN）が前に立っていて、<strong>HTTPS の終端は CloudFront 側</strong>だったことです。<br />
サーバ自身は 80番で CloudFront からのアクセスだけを受けていました。<br />
つまり<strong>新サーバ側で証明書を作り直す必要がない</strong>。<br />
さらに CloudFront のオリジン指定がインスタンスの DNS 名だったので、IP を移すだけで 5サイトが同時に切り替わります。CDN 側の設定変更はゼロで済みました。</p>
<p>この「証明書を作り直さなくていい」という判断は、最初に構成を実測で洗い出したから出てきたものです。<br />
思い込みで進めていたら、要らない作業を一日分やっていたはずです。</p>
<h2>AlmaLinux 10 は、9 までの作法がわりと通じない</h2>
<p>RHEL 10 系になって変わったところで、けっこう時間を取られました。</p>
<p><strong>1. <code>dnf module</code> がもう無い</strong><br />
AppStream のモジュール機構そのものが廃止されていて、<code>dnf module list</code> は何も返しません。<br />
MySQL も <code>mysql-server</code> というパッケージ名が存在しません。正しくは <code>mysql8.4-server</code> です。<br />
これを知らずに <code>dnf list mysql-server</code> をやると「AlmaLinux 10 に MySQL は無い」と誤解します（しました）。</p>
<p>なお Oracle の <code>repo.mysql.com</code> を足す必要はありません。<br />
そちらは署名鍵が 2025年10月に期限切れで <code>dnf</code> に弾かれますし、AppStream 版とファイルが衝突します。</p>
<p><strong>2. postfix のハッシュ形式が変わった</strong><br />
Berkeley DB が廃止されて、<code>hash:</code> が使えなくなりました。既定は <code>lmdb</code> です。<br />
たちが悪いのは、<code>postmap</code> が黙って <code>.lmdb</code> を作ってしまうところです。<br />
設定ファイル側が <code>hash:</code> のままでもエラーが出ず、<strong>実際にメールを送る段になって初めて失敗します</strong>。</p>
<p><strong>3. cron の systemd ユニット名は <code>crond</code></strong><br />
<code>cronie</code> では起動しません。しかも <code>systemctl enable --now</code> に nginx や php-fpm と並べて書いていると、<strong>そこで止まって後ろが全部起動しません</strong>。</p>
<h2>MySQL 8.4 とゼロ日付</h2>
<p>照合順序（文字の並び順のルール）を <code>utf8mb4_unicode_520_ci</code> に揃えようとしたら、いくつかのテーブルで止まりました。</p>
<blockquote><p><code>ERROR 1067 (42000): Invalid default value for 'xxx'</code></p>
</blockquote>
<p>原因は <code>datetime DEFAULT '0000-00-00 00:00:00'</code>、いわゆるゼロ日付です。<br />
MySQL 8.4 はこれを既定で拒否します。<code>CONVERT TO CHARACTER SET</code> も <code>OPTIMIZE TABLE</code> も、中でテーブルを作り直すので引っかかります。</p>
<p>対処はセッションの <code>sql_mode</code> を空にすることでした。</p>
<blockquote><p><code>mysql -e "SET SESSION sql_mode=''; ALTER TABLE `db`.`tbl` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci;"</code></p>
</blockquote>
<p>結果、66テーブルすべて変換できました。失敗ゼロ、ストレージエンジンの変更もゼロです。</p>
<h2>いちばん詰まったのは SELinux</h2>
<p>このサーバはサイトを <code>/home/&lt;ユーザー&gt;/public_html</code> に置く構成です。<br />
AlmaLinux は SELinux が既定で enforcing なので、ここが3段構えの壁になりました。<strong>どれか1つでも欠けると全サイト落ちます。</strong></p>
<p><strong>1段目は SELinux ですらない。</strong><br />
<code>useradd</code> が作る <code>/home/&lt;ユーザー&gt;</code> のパーミッションは 700 で、nginx が通り抜けられません（旧サーバは 711 でした）。<br />
このときの症状が 403 ではなく php-fpm の「File not found.」で、SELinux の拒否ログ（AVC）も出ません。<br />
<strong>SELinux を疑って延々と時間を溶かす罠です。</strong></p>
<p><strong>2段目、ラベルは自作しないほうが早い。</strong><br />
既定ポリシーが <code>public_html</code> に <code>httpd_user_content_t</code> を付けてくれます。<br />
ここで汎用的な自作ルールを足すと、<strong>既定ルールの正規表現のほうが長いので優先されて負けます。</strong><br />
ユーザー名まで書いた明示的なルールにすれば勝てます。</p>
<p><strong>3段目、<code>public_html</code> の外は別扱い。</strong><br />
<code>wp-config.php</code> を公開ディレクトリの外に置いていたので、既定では php-fpm も nginx も読めませんでした。</p>
<p>あと boolean が4つ要ります。<code>httpd_enable_homedirs</code> と <code>httpd_read_user_content</code>（どちらも既定 off）、WordPress の更新 API のために <code>httpd_can_network_connect</code>、メール送信のために <code>httpd_can_sendmail</code>。<br />
<code>setsebool</code> に複数まとめて書くと失敗するので、1つずつ実行します。</p>
<p>この設計が正しかったかどうかは、切り替えのあとに自分で答え合わせができました。<br />
5サイトの WordPress を一気に全更新して約4,000ファイルが書き込まれましたが、<strong>SELinux の拒否は0件</strong>でした。</p>
<h2>切り替え</h2>
<p>データの移送は、旧サーバに一切触らずにやりました。<br />
旧サーバのセキュリティグループは CDN からの 80番しか開いていないので、新サーバから直接は届きません。<br />
穴を開けるのは本番の変更になるので、<strong>ディスクのスナップショットからボリュームを作って、新サーバに読み取り専用でマウント</strong>する経路にしました。</p>
<p>ここで小さな罠がひとつ。root ファイルシステムの複製なのでファイルシステムの UUID が元と重複します。<code>mount -o ro,nouuid</code> が必須でした。</p>
<p>さらに棚卸しの途中で気づいたのですが、<strong>旧サーバは毎朝6時23分に全テーブルロック付きの DB ダンプを作っていました</strong>。自分で昔しかけたものです。<br />
整合性があるので、そのまま移送元に使えました。本番で <code>mysqldump</code> を走らせる必要がありませんでした。</p>
<p>切り替え直前の最終同期だけは新しいダンプを取りましたが、<strong>書き込みが止まったのは10秒だけ</strong>（約250MB）です。</p>
<p>あとは Elastic IP を付け替えるだけ。2026年9月5日の午前0時19分に完了しました。</p>
<p>検証は、切り替えの前後で各サイトの応答をバイト単位で突き合わせました。</p>
<blockquote><p><code>サイトA  200 / 77,315 B  →  200 / 77,315 B   一致<br />
このサイト 200 / 66,628 B  →  200 / 66,628 B   一致<br />
サイトC  200 /  2,281 B  →  200 /  2,281 B   一致</code></p>
</blockquote>
<p>1サイトだけ 178バイトの差が出ましたが、中身を見たらページ内の動的な部分でした。<br />
そのあとキャッシュ回避のクエリを付けて本番 URL を叩き、新サーバのアクセスログに着弾していることまで確認しています。</p>
<p><strong>実質的なダウンタイムはありませんでした。</strong></p>
<h2>ついでに直ったこと</h2>
<p>移行後、表示が遅いのが気になって調べてもらいました。<br />
てっきり古いプラグインが吐いている大量の PHP Warning のせいだと思っていたのですが、<strong>実際は PHP の OPcache の容量不足</strong>でした。<br />
設定を変えただけで応答が約3.4倍速くなりました。</p>
<p>思い込みで「プラグインを消す」方向に進んでいたら、速くならないうえにサイトが壊れていたかもしれません。</p>
<h2>AI と組んでみての感想</h2>
<p>よかったのは、<strong>実測してから判断する</strong>のを徹底してくれるところです。<br />
「たぶんこうだったはず」で進めると事故るタイプの作業なので、毎回その場で確認してから手を動かしてくれるのは助かりました。<br />
実際、「昔は別サービスへリダイレクトしていたはず」と思っていたドメインが、<strong>実は切り替え前からとっくに到達不能だった</strong>ことも、この過程で判明しています。</p>
<p>接続も全部 AWS Systems Manager（SSM）経由で、<strong>SSH は一度も使っていません</strong>。22番ポートを開けずに済みました。</p>
<p>一方で、<strong>丸投げはできません。</strong><br />
「これを消していいか」「本番を止めていいか」といった判断は全部こちらに聞いてきますし、聞いてこないと困ります。<br />
やらせるのは調査・手順化・実行で、<strong>決めるのは人間</strong>、という分担がちょうどよかったです。</p>
<p>作った手順書やバックアップも、AI 側から「復元できるか実際に試しましょう」と言ってきて、試したら自分の作り込みのバグが見つかりました。<br />
<strong>作れたことと、動くことは別</strong>というのを、あらためて思い知らされた作業でした。</p>The post <a href="https://www.kabosu.info/2026/09/almalinux10-migration-with-ai/">サーバを AlmaLinux 10 に入れ替えた話（作業はほぼ AI）</a> first appeared on <a href="https://www.kabosu.info">www.kabosu.info</a>.]]></content:encoded>
					
					<wfw:commentRss>https://www.kabosu.info/2026/09/almalinux10-migration-with-ai/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">774</post-id>	</item>
	</channel>
</rss>
