<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Web開発 on AIによる技術記事 備忘録</title><link>https://ai.hack-le.com/tags/web%E9%96%8B%E7%99%BA/</link><description>Recent content in Web開発 on AIによる技術記事 備忘録</description><generator>Hugo -- gohugo.io</generator><language>ja</language><lastBuildDate>Mon, 02 Nov 2026 09:00:33 +0900</lastBuildDate><atom:link href="https://ai.hack-le.com/tags/web%E9%96%8B%E7%99%BA/index.xml" rel="self" type="application/rss+xml"/><item><title>自宅サーバー公開におけるルーティング設計：Cloudflare TunnelとCaddyの役割分担</title><link>https://ai.hack-le.com/%E8%87%AA%E5%AE%85%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E5%85%AC%E9%96%8B%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E8%A8%AD%E8%A8%88%EF%BC%9Acloudflare/</link><pubDate>Sun, 25 Oct 2026 22:30:33 +0900</pubDate><guid>https://ai.hack-le.com/%E8%87%AA%E5%AE%85%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E5%85%AC%E9%96%8B%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E8%A8%AD%E8%A8%88%EF%BC%9Acloudflare/</guid><description>&lt;p&gt;自宅サーバーで複数のWebアプリケーションをホストする際、外部公開手段としての &lt;strong&gt;Cloudflare Tunnel（&lt;code&gt;cloudflared&lt;/code&gt;）&lt;/strong&gt; 、ローカル環境用のリバースプロキシとしての &lt;strong&gt;Caddy&lt;/strong&gt;、そしてLAN内の名前解決を担う &lt;strong&gt;AdGuard Home&lt;/strong&gt; などのDNSサーバーを併用する設計は広く利用されています。&lt;/p&gt;&#10;&lt;p&gt;この構成を検討する際によく生じる疑問が、「外部からのアクセスは Caddy を経由させるべきなのか、それとも &lt;code&gt;cloudflared&lt;/code&gt; から直接各アプリケーションのポートへ向けるべきなのか」というルーティングの設計判断です。結論から言えば、通信プロトコルとしてはいずれの経路も正常に成立します。両者の違いは正誤ではなく、&lt;strong&gt;システムの単純性を取るか、ローカル側での制御の一元化を取るか&lt;/strong&gt;という設計原則のトレードオフにあります。&lt;/p&gt;&#10;&lt;h2 id="物理配置とネットワーク境界の前提"&gt;物理配置とネットワーク境界の前提&#10;&lt;/h2&gt;&lt;p&gt;構成を整理する上での大前提として、各コンポーネントがネットワーク上のどこに配置されているかを正確に把握する必要があります。&lt;/p&gt;&#10;&lt;p&gt;外部からのトラフィックを受ける最初の接点は、インターネット上に分散配置された &lt;strong&gt;Cloudflare Edge&lt;/strong&gt; です。外部ユーザーはこのエッジサーバーに対して HTTPS アクセスを行います。一方、 &lt;strong&gt;&lt;code&gt;cloudflared&lt;/code&gt; の実体はインターネット上ではなく、自宅LAN内のサーバー上で動作するデーモン&lt;/strong&gt;です。このデーモンが自宅内から Cloudflare Edge に向けて外向き（アウトバウンド）の安全なトンネル接続を確立し、外部からの要求を自宅ネットワーク内部へ引き込みます。&lt;/p&gt;&#10;&lt;p&gt;したがって、通信の物理的な境界線は「インターネット上の Cloudflare Edge」と「自宅LAN内の &lt;code&gt;cloudflared&lt;/code&gt;」の間に引かれます。その上で、引き込んだトラフィックを LAN 内でどう分配するかが設計の分岐点となります。&lt;/p&gt;&#10;&lt;div class="mermaid"&gt;&#10;graph TD&#10;subgraph &amp;#34;インターネット (WAN)&amp;#34;&#10;User_Ext[&amp;#34;外部ユーザー&amp;#34;]&#10;CF_Edge[&amp;#34;Cloudflare Edge&amp;#34;]&#10;end&#10;subgraph &amp;#34;自宅LAN&amp;#34;&#10;Tunnel[&amp;#34;cloudflared&amp;#34;]&#10;User_Int[&amp;#34;LAN内クライアント&amp;#34;]&#10;AGH[&amp;#34;AdGuard Home(スプリットDNS)&amp;#34;]&#10;Caddy[&amp;#34;Caddy(リバースプロキシ)&amp;#34;]&#10;App[&amp;#34;Webアプリケーション群&amp;#34;]&#10;end&#10;User_Ext --&amp;gt; CF_Edge&#10;CF_Edge Tunnel&#10;User_Int -.-&amp;gt; AGH&#10;AGH -.-&amp;gt; User_Int&#10;&lt;/div&gt;&#10;&lt;h2 id="caddy-を経由させる構成単一ゲートウェイ原則"&gt;Caddy を経由させる構成（単一ゲートウェイ原則）&#10;&lt;/h2&gt;&lt;p&gt;外部からの通信をすべて一度 Caddy に集約し、Caddy から各アプリケーションへ中継する構成です。この方式は、トラフィックの流入元が外部トンネルであれローカルWi-Fiであれ、すべてのアプリケーションの前段に Caddy を唯一の「内部ゲートウェイ」として配置するという思想に基づいています。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;外部: ユーザー -&amp;gt; Cloudflare Edge -&amp;gt; cloudflared -&amp;gt; Caddy -&amp;gt; アプリケーション&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;内部: ユーザー -&amp;gt; (AdGuard Home で解決) -&amp;gt; Caddy -&amp;gt; アプリケーション&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="メリット"&gt;メリット&#10;&lt;/h3&gt;&lt;p&gt;この構成の最大の強みは、&lt;strong&gt;ルーティングとアクセスログのローカル一元化&lt;/strong&gt;にあります。&lt;code&gt;cloudflared&lt;/code&gt; 側の設定は「ドメイン全体の通信をすべてローカルの Caddy へ流す」という抽象的なルールのみで固定できます。これにより、新しくアプリケーションを追加・変更する際も、外部のトンネル設定に手を加える必要がなく、ローカルの &lt;code&gt;Caddyfile&lt;/code&gt; と内部 DNS レコードを更新するだけで作業が完結します。また、すべてのアクセスが Caddy を通過するため、ローカルサーバー単体で統一的なアクセスログを取得・監視することが可能です。&lt;/p&gt;&#10;&lt;h3 id="デメリットと注意点"&gt;デメリットと注意点&#10;&lt;/h3&gt;&lt;p&gt;この方式の課題は、&lt;strong&gt;二重リバースプロキシによる運用の複雑化&lt;/strong&gt;です。Cloudflare Edge で一度終端された HTTPS 通信が Caddy に渡されるため、プロキシヘッダーの適切な伝播が不可欠となります。具体的には、Caddy 側で &lt;code&gt;trusted_proxies&lt;/code&gt; などの設定を正しく行わないと、クライアントの送信元 IP アドレスが &lt;code&gt;cloudflared&lt;/code&gt; のローカル IP に上書きされたり、プロトコル（HTTP/HTTPS）の認識違いによって WordPress 等のアプリケーションでリダイレクトループが発生する原因になります。また、Caddy が停止した際に外部・内部双方の通信が同時にダウンするという、単一障害点（SPOF）を抱えることになります。&lt;/p&gt;&#10;&lt;h2 id="caddy-を経由させない構成疎結合最小ホップ原則"&gt;Caddy を経由させない構成（疎結合・最小ホップ原則）&#10;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;cloudflared&lt;/code&gt; が備える Ingress ルールを用い、外部からの通信を Caddy を介さずに直接各アプリケーションのポート番号へフォワードする構成です。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;外部: ユーザー -&amp;gt; Cloudflare Edge -&amp;gt; cloudflared -&amp;gt; アプリケーション&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;内部: ユーザー -&amp;gt; (AdGuard Home で解決) -&amp;gt; Caddy -&amp;gt; アプリケーション&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="メリット-1"&gt;メリット&#10;&lt;/h3&gt;&lt;p&gt;この構成の根拠は、&lt;strong&gt;不要な中間レイヤーの排除&lt;/strong&gt;にあります。&lt;code&gt;cloudflared&lt;/code&gt; 自体がリバースプロキシとしての転送機能を備えているため、後段にさらに Caddy を挟むことは処理遅延と障害要因を増やすだけにすぎないという判断です。多段プロキシ構造を避けることで、前述したヘッダーの食い違いや SSL 終端に起因するリダイレクトトラブルのリスクを根本から排除できます。また、Caddy の設定ミスや障害が外部公開用エンドポイントに波及しません。&lt;/p&gt;&#10;&lt;h3 id="デメリットと注意点-1"&gt;デメリットと注意点&#10;&lt;/h3&gt;&lt;p&gt;一方で、&lt;strong&gt;ルーティング設定が2箇所に分散する&lt;/strong&gt;という管理上のコストが発生します。外部からのアクセス経路は Cloudflare 側（Zero Trust ダッシュボードまたはローカルの &lt;code&gt;config.yml&lt;/code&gt;）で定義し、LAN 内からのアクセス経路は &lt;code&gt;Caddyfile&lt;/code&gt; で個別に定義しなければなりません。ポート番号やコンテナの配置を変更した際に一方の更新を忘れると、「LAN内からは開けるが外部からは繋がらない」といった不整合が生じやすくなります。&lt;/p&gt;&#10;&lt;h2 id="運用における選択基準"&gt;運用における選択基準&#10;&lt;/h2&gt;&lt;p&gt;コミュニティや実際の運用環境における傾向を踏まえると、選択の基準は「管理するサービスの規模」と「ローカル完結の重要度」に集約されます。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Caddy 経由が選ばれるケース&lt;/strong&gt;: 多数のコンテナやサービスを自宅内で常時稼働させており、AdGuard Home によるスプリットホライズンDNSを構築してLAN内からの高速な直接アクセスを維持したい環境。サービス追加のたびに外部トンネルの設定を弄る手間を減らし、ローカル側の設定ファイル群でインフラを一元管理したい場合に適しています。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Caddy 非経由（直接転送）が選ばれるケース&lt;/strong&gt;: 公開するサービスが少数（数個程度）に限定されている環境。Cloudflare Zero Trust の GUI 管理画面上でサブドメインの転送先とアクセス制御（Cloudflare Access 等による認証）をまとめて視覚的に管理したい場合や、多段プロキシに起因するネットワークトラブルの検証コストを最小限に抑えたい場合に適しています。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;どちらの構成を選択する場合であっても、ネットワークの物理的な境界と各プロキシが担う責務の境界を明確に定義することが、安定したセルフホスト運用の基盤となります。&lt;/p&gt;&#10;</description></item><item><title>CaddyのファイルサーバーにBasic認証を設定する方法とドメイン追加時のreload挙動</title><link>https://ai.hack-le.com/caddy%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%ABbasic%E8%AA%8D%E8%A8%BC%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%A8%E3%83%89/</link><pubDate>Fri, 04 Sep 2026 15:49:56 +0900</pubDate><guid>https://ai.hack-le.com/caddy%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%ABbasic%E8%AA%8D%E8%A8%BC%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%A8%E3%83%89/</guid><description>&lt;p&gt;軽量でHTTPSの自動設定が強力なWebサーバー「Caddy」において、ファイルサーバー機能にBasic認証を付加する手順と、ドメイン追加時にサービス再起動が必要かどうかについてのまとめです。&lt;/p&gt;&#10;&lt;h2 id="basic認証の設定手順"&gt;Basic認証の設定手順&#10;&lt;/h2&gt;&lt;p&gt;Caddyで静的ファイルを配信する &lt;code&gt;file_server&lt;/code&gt; ディレクティブに対してBasic認証を設定する場合、平文のパスワードをそのままCaddyfileに記述することはできません。事前にパスワードのハッシュ値を生成し、それを設定ファイルに組み込む必要があります。&lt;/p&gt;&#10;&lt;p&gt;まず、サーバーのターミナル上で &lt;code&gt;caddy hash-password&lt;/code&gt; コマンドを実行します。対話形式でパスワードの入力を求められるため、使用したいパスワードを入力すると、bcryptアルゴリズムによって暗号化されたハッシュ文字列が出力されます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;caddy hash-password&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 入力プロンプトにパスワードを入力すると、ハッシュ値が出力されます&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 出力例: $2a$14$Zkx19XLiW6VYouLHR5NmfOFU0z2GTNmpkT/5qqR78lmQ827KnFsEK&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ハッシュ文字列が得られたら、Caddyfileのサイト定義内に &lt;code&gt;basicauth&lt;/code&gt; ディレクティブを追記します。サイト全体を保護する場合は以下のようにルートに配置します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;example.com &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; root * /var/www/html&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Basic認証の設定&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; basicauth &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# ユーザー名 ハッシュ化されたパスワード&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; alice &lt;span class="nv"&gt;$2&lt;/span&gt;a&lt;span class="nv"&gt;$14$Zkx19XLiW6VYouLHR5NmfOFU0z2GTNmpkT&lt;/span&gt;/5qqR78lmQ827KnFsEK&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; file_server&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;特定のディレクトリ（例: &lt;code&gt;/admin/&lt;/code&gt; 以下）のみを認証の対象としたい場合は、ディレクティブの直後にパスの指定をマッチャーとして付与することで適用範囲を限定できます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;example.com &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; root * /var/www/html&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# /admin 以下のパスのみ認証を要求&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; basicauth /admin/* &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; bob &lt;span class="nv"&gt;$2&lt;/span&gt;a&lt;span class="nv"&gt;$14$Zkx19XLiW6VYouLHR5NmfOFU0z2GTNmpkT&lt;/span&gt;/5qqR78lmQ827KnFsEK&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; file_server&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ドメイン追加時の証明書発行とreloadの挙動"&gt;ドメイン追加時の証明書発行とreloadの挙動&#10;&lt;/h2&gt;&lt;p&gt;Caddyfileに新しいドメインを追加した際、Webサーバーのプロセスを &lt;code&gt;restart&lt;/code&gt; させる必要はありません。Caddyは &lt;strong&gt;reloadコマンドのみで証明書の発行まで完結&lt;/strong&gt; します。サービスを停止して再起動をかける必要はありません。&lt;/p&gt;&#10;&lt;p&gt;設定変更後は、サーバー上で &lt;code&gt;caddy reload&lt;/code&gt; または &lt;code&gt;systemctl reload caddy&lt;/code&gt; を実行します。Caddyはゼロダウンタイムで新しい設定を読み込み、構成に追加された新しいドメインを検知すると、即座にバックグラウンドでACME（Let&amp;rsquo;s EncryptやZeroSSLなど）を通じたSSL/TLS証明書の自動取得と適用を開始します。&lt;/p&gt;&#10;&lt;p&gt;ただし、正常に証明書が発行されるためには、前提条件として以下の2点が整っている必要があります。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;追加したドメインのDNSレコード（A/AAAA）が正しくサーバーのIPアドレスを向いていること&lt;/li&gt;&#10;&lt;li&gt;HTTP-01チャレンジなどの検証を通すため、外部から80番および443番ポートへの通信が疎通可能な状態であること&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;これらが満たされていれば、リロードを実行するだけで数秒から十数秒のうちにHTTPS通信が確立されます。&lt;/p&gt;&#10;</description></item><item><title>「サーバ」という言葉には3つの顔がある――初心者が最初につまずく理由と整理法</title><link>https://ai.hack-le.com/%E3%80%8C%E3%82%B5%E3%83%BC%E3%83%90%E3%80%8D%E3%81%A8%E3%81%84%E3%81%86%E8%A8%80%E8%91%89%E3%81%AB%E3%81%AF3%E3%81%A4%E3%81%AE%E9%A1%94%E3%81%8C%E3%81%82%E3%82%8B%E2%80%95%E2%80%95%E5%88%9D%E5%BF%83/</link><pubDate>Thu, 27 Aug 2026 10:52:47 +0900</pubDate><guid>https://ai.hack-le.com/%E3%80%8C%E3%82%B5%E3%83%BC%E3%83%90%E3%80%8D%E3%81%A8%E3%81%84%E3%81%86%E8%A8%80%E8%91%89%E3%81%AB%E3%81%AF3%E3%81%A4%E3%81%AE%E9%A1%94%E3%81%8C%E3%81%82%E3%82%8B%E2%80%95%E2%80%95%E5%88%9D%E5%BF%83/</guid><description>&lt;p&gt;ITの学習や業務の中で、私たちはごく自然に「サーバ」という言葉を使っています。しかし、一口にサーバと言っても、話す人や文脈によって指している対象がまったく異なることがあります。その違いを大別すると、&lt;strong&gt;物理的なハードウェア&lt;/strong&gt;、&lt;strong&gt;ソフトウェア&lt;/strong&gt;、そして&lt;strong&gt;役割を表す概念&lt;/strong&gt;の3つに分けられます。&lt;/p&gt;&#10;&lt;p&gt;このレイヤーのズレを意識しないまま会話を進めてしまうと、特に初学者の学習において大きな混乱の原因となります。本記事では、この3つの違いを論理的に整理し、なぜ初心者がつまずきやすいのかを備忘録としてまとめます。&lt;/p&gt;&#10;&lt;h2 id="3つのレイヤーで理解するサーバの正体"&gt;3つのレイヤーで理解する「サーバ」の正体&#10;&lt;/h2&gt;&lt;p&gt;サーバ（Server）という英単語の語源は、提供する・給仕するという意味を持つ &lt;code&gt;serve&lt;/code&gt; に由来します。レストランにおける「給仕係（店員）」と「客（クライアント）」の関係をイメージすると、3つの違いが明確になります。&lt;/p&gt;&#10;&lt;p&gt;1つ目は、&lt;strong&gt;概念・役割としてのサーバ&lt;/strong&gt;です。これはクライアント・サーバモデルと呼ばれるアーキテクチャや関係性そのものを指します。要求（リクエスト）を出す側をクライアント、その要求を受け取ってサービスやデータを返す（レスポンス）側をサーバと呼びます。ここには物理的な機械や特定のプログラムという実体の制約はなく、あくまで「要求に応じる役割」という抽象的な関係性を意味しています。&lt;/p&gt;&#10;&lt;p&gt;2つ目は、&lt;strong&gt;ソフトウェアとしてのサーバ&lt;/strong&gt;です。これはクライアントからの要求を処理して応答を返す具体的な&lt;strong&gt;プログラム&lt;/strong&gt;を指します。たとえば、Webページを配信する &lt;code&gt;Apache&lt;/code&gt; や &lt;code&gt;Nginx&lt;/code&gt;、データベースを管理する &lt;code&gt;MySQL&lt;/code&gt; や &lt;code&gt;PostgreSQL&lt;/code&gt; などがこれに該当します。手元のノートパソコンであっても、これらのソフトウェアをインストールして起動すれば、そのプログラムは立派なWebサーバやデータベースサーバとして機能します。&lt;/p&gt;&#10;&lt;p&gt;3つ目は、&lt;strong&gt;ハードウェアとしてのサーバ&lt;/strong&gt;です。これはサーバソフトウェアを安定して24時間365日動かし続けるために設計された&lt;strong&gt;物理的なコンピュータ機械&lt;/strong&gt;を指します。データセンターのラックに収められているような、高い耐障害性や連続稼働用の冷却性能を備えた専用マシンです。&lt;/p&gt;&#10;&lt;p&gt;これらを整理すると、「1台の物理コンピュータ（ハードウェア）の中で、複数のサーバプログラム（ソフトウェア）が稼働し、それぞれが利用者の要求に応えてデータを提供する（概念・役割）」という多重構造になっていることがわかります。&lt;/p&gt;&#10;&lt;h2 id="なぜ初心者はサーバという言葉でつまずくのか"&gt;なぜ初心者は「サーバ」という言葉でつまずくのか&#10;&lt;/h2&gt;&lt;p&gt;この3つの意味が日常会話で無意識に使い分けられていることこそが、初心者が学習初期に感じる混乱の根本的な原因です。具体的には、次のような場面で思考のフリーズが発生します。&lt;/p&gt;&#10;&lt;p&gt;まず、 &lt;strong&gt;「自分のパソコンがサーバになる」という感覚が掴めない&lt;/strong&gt;という問題があります。「サーバ＝データセンターにある巨大で特別な黒い箱」という先入観を持っていると、Web開発の入門時に「ローカル環境にWebサーバを立ち上げる」と指示された際、なぜ普通のノートPCが突然サーバになるのか理解できなくなります。自分のPC上で &lt;code&gt;localhost&lt;/code&gt; や &lt;code&gt;127.0.0.1&lt;/code&gt; に対してリクエストを送る行為は、同じマシン内でクライアント（ブラウザ）とサーバ（Webサーバソフト）が同時に動いている状態ですが、ハードウェアとソフトウェアを混同しているとこの構造が見えてきません。&lt;/p&gt;&#10;&lt;p&gt;次に、 &lt;strong&gt;「サーバが落ちた」というトラブルの解像度が低くなる&lt;/strong&gt;点です。障害が発生した際、物理マシンの電源やネットワークが切断されたのか、&lt;code&gt;Nginx&lt;/code&gt; などのプロセスが停止したのか、それともプログラム内部のバグで例外が発生したのかによって対処法は全く異なります。しかし、すべてを一括りに「サーバの問題」と捉えてしまうと、何が壊れているのかを正しく切り分けられなくなります。&lt;/p&gt;&#10;&lt;p&gt;さらに現代では、クラウドサービスや仮想化技術の普及により、物理と論理の境界がより曖昧になっています。AWSなどのクラウド上で仮想マシンを作成することを日常的に「サーバを立てる」と呼びますが、これはソフトウェアによって仮想的に作られたコンピュータであり、物理的な実体と1対1で結びついているわけではありません。&lt;/p&gt;&#10;&lt;h2 id="文脈のズレを意識して解像度を上げる"&gt;文脈のズレを意識して解像度を上げる&#10;&lt;/h2&gt;&lt;p&gt;私たちが普段何気なく交わしている会話を振り返ると、主語のレイヤーが頻繁に入れ替わっていることに気づきます。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;サーバを契約する・購入する&lt;/strong&gt;（ハードウェアやインフラ設備の文脈）&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;サーバをインストールする・起動する&lt;/strong&gt;（ソフトウェアやプロセスの文脈）&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;サーバにリクエストを送信する&lt;/strong&gt;（概念やアーキテクチャの文脈）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;相手にサーバの仕組みを説明するときや、自身が技術的なトラブルシューティングを行うときは、いまどのレイヤーの話をしているのかを意識することが大切です。ハードウェア、ソフトウェア、そして概念という3つの視点を持つだけで、ITシステム全体の構造を格段にクリアに見通せるようになります。&lt;/p&gt;&#10;</description></item><item><title>ファビコンが .ico だった理由と現代のWebでPNGが推奨されるまでの技術史</title><link>https://ai.hack-le.com/%E3%83%95%E3%82%A1%E3%83%93%E3%82%B3%E3%83%B3%E3%81%8C-ico-%E3%81%A0%E3%81%A3%E3%81%9F%E7%90%86%E7%94%B1%E3%81%A8%E7%8F%BE%E4%BB%A3%E3%81%AEweb%E3%81%A7png%E3%81%8C%E6%8E%A8%E5%A5%A8%E3%81%95/</link><pubDate>Wed, 26 Aug 2026 10:50:26 +0900</pubDate><guid>https://ai.hack-le.com/%E3%83%95%E3%82%A1%E3%83%93%E3%82%B3%E3%83%B3%E3%81%8C-ico-%E3%81%A0%E3%81%A3%E3%81%9F%E7%90%86%E7%94%B1%E3%81%A8%E7%8F%BE%E4%BB%A3%E3%81%AEweb%E3%81%A7png%E3%81%8C%E6%8E%A8%E5%A5%A8%E3%81%95/</guid><description>&lt;h2 id="wordpressのサイトアイコンにpngが推奨される理由"&gt;WordPressのサイトアイコンにPNGが推奨される理由&#10;&lt;/h2&gt;&lt;p&gt;WordPressでサイトアイコンを設定する際、推奨されるフォーマットは .ico ではなく 512 × 512 ピクセル以上の正方形PNG です。かつてWebサイトのアイコンといえば .ico ファイルを用意するのが一般的でしたが、現代のCMSでは高解像度のPNG画像が標準となっています。&lt;/p&gt;&#10;&lt;p&gt;これは、サイトアイコンの役割が従来のデスクトップブラウザのタブ表示だけでなく、スマートフォンやタブレットのホーム画面に追加された際のアプリアイコンとしても利用されるようになったためです。WordPressは、アップロードされた1枚の高解像度PNG画像から、ブラウザタブ用の小さなサイズ（16pxや32px）だけでなく、iOSやAndroidが要求する高解像度アイコン（180pxや192pxなど）をシステム内部で自動生成し、適切なHTMLタグを出力します。透過処理を綺麗に保持でき、一般的な画像編集ツールで扱いやすいPNGが、現代のWeb管理において最も合理的であると判断されています。&lt;/p&gt;&#10;&lt;h2 id="なぜかつてはico形式が標準だったのか"&gt;なぜかつてはICO形式が標準だったのか&#10;&lt;/h2&gt;&lt;p&gt;現代の技術から見れば「最初からPNGやベクター形式のSVGを採用すればよかったのではないか」という疑問が生じます。しかし、ファビコンが誕生した1990年代末の技術的制約を振り返ると、ICO形式以外の選択肢は事実上存在しませんでした。&lt;/p&gt;&#10;&lt;p&gt;ICO形式は1985年の Windows 1.0 の時代からOSの標準アイコン形式として使われており、低解像度のビットマップ画像を1つのファイルに束ねるコンテナとして設計されていました。一方でPNG形式は1996年に仕様が策定されたばかりで普及途上であり、当時の非力な端末にとってはデコード処理の負荷が高く、初期のブラウザでは半透明処理に不具合を抱えていました。また、SVG形式は2001年に仕様化されましたが、数十MHzから数百MHz程度の当時のCPUにとって、リアルタイムにベクター計算を行って描画させる処理は重すぎました。&lt;/p&gt;&#10;&lt;p&gt;1999年に Internet Explorer 5 が「お気に入り（Favorites）」にWebサイト独自のアイコンを表示する機能を導入した際、Microsoftは新形式を設計するのではなく、Windowsが長年ネイティブでサポートしていたICO形式の描画エンジンをそのままWebに流用しました。これが事実上の業界標準として世界中に定着したのが favicon.ico の始まりです。&lt;/p&gt;&#10;&lt;h2 id="レガシー仕様がもたらした技術的負債と現代への移行"&gt;レガシー仕様がもたらした技術的負債と現代への移行&#10;&lt;/h2&gt;&lt;p&gt;黎明期において合理的だったこの仕組みは、Webの急速な進化とモバイル端末の普及に伴い、開発現場における技術的負債へと変化していきました。&lt;/p&gt;&#10;&lt;p&gt;顕著だった問題の一つが、ブラウザによる /favicon.ico への自動リクエストです。HTML側にアイコンの指定がなくても、ブラウザが自動的にサーバーのルート直下にある /favicon.ico を取得しにいく仕様が定着したため、アイコンを用意していない静的サーバーや管理画面、APIサーバーなどのログが404エラーで埋まるという現象が多発しました。開発者はエラーログの肥大化を防ぐためだけに、不要なダミーの .ico ファイルを配置せざるを得ない状況に直面しました。&lt;/p&gt;&#10;&lt;p&gt;さらにスマートフォンが登場すると、Appleが apple-touch-icon.png を独自に導入するなど各プラットフォームが異なる仕様を求めた結果、HTMLヘッダー内に大量のアイコン指定タグが並ぶという混乱を招きました。&lt;/p&gt;&#10;&lt;p&gt;現在では、SVGアイコンによる解像度フリーな運用やダークモードへの動的対応が可能になっています。それでもなお、古いブラウザやシステムとの互換性を保つために favicon.ico の配置が必要とされる場面は残っており、過去のOS独自仕様がWeb標準に影響を与え続けた典型的な歴史の1つとなっています。&lt;/p&gt;&#10;</description></item><item><title>WordPressで特定記事の最終更新日を表示するショートコードを作る</title><link>https://ai.hack-le.com/wordpress%E3%81%A7%E7%89%B9%E5%AE%9A%E8%A8%98%E4%BA%8B%E3%81%AE%E6%9C%80%E7%B5%82%E6%9B%B4%E6%96%B0%E6%97%A5%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%B3/</link><pubDate>Mon, 20 Oct 2025 10:34:50 +0900</pubDate><guid>https://ai.hack-le.com/wordpress%E3%81%A7%E7%89%B9%E5%AE%9A%E8%A8%98%E4%BA%8B%E3%81%AE%E6%9C%80%E7%B5%82%E6%9B%B4%E6%96%B0%E6%97%A5%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%B3/</guid><description>&lt;p&gt;WordPressで「特定の記事の最終更新日」をトップページや固定ページに表示したい場面は多い。&lt;br&gt;&#10;しかしテンプレートファイルを直接編集するのは手間がかかるうえ、テーマアップデートで上書きされる危険もある。&lt;br&gt;&#10;この問題は、&lt;strong&gt;ショートコードを自作してfunctions.phpに登録する&lt;/strong&gt;ことで簡潔に解決できる。&lt;/p&gt;&#10;&lt;h2 id="環境と前提"&gt;環境と前提&#10;&lt;/h2&gt;&lt;p&gt;本稿の内容はWordPress 6.x系を前提としている。&lt;br&gt;&#10;テーマは任意だが、&lt;code&gt;functions.php&lt;/code&gt; にコードを追記できる環境であることが条件である。&lt;br&gt;&#10;子テーマを使っている場合は、子テーマ側に記述することで親テーマの更新にも耐えられる。&lt;/p&gt;&#10;&lt;h2 id="ショートコードの実装"&gt;ショートコードの実装&#10;&lt;/h2&gt;&lt;p&gt;最終更新日を出力するショートコード &lt;code&gt;[updated]&lt;/code&gt; を以下のように定義する。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// [updated id=&amp;#34;123&amp;#34; format=&amp;#34;Y-m-d&amp;#34;]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;shortcode_post_updated&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$atts&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$atts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;shortcode_atts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;id&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;format&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Y-m-d&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;),&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$atts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;updated&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nv"&gt;$atts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// id未指定なら出力なし&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$updated&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;get_the_modified_time&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$atts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;format&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nv"&gt;$atts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nv"&gt;$updated&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;esc_html&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$updated&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;add_shortcode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;updated&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;shortcode_post_updated&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このコードを &lt;code&gt;functions.php&lt;/code&gt; に追加すれば、ショートコード &lt;code&gt;[updated id=&amp;quot;123&amp;quot;]&lt;/code&gt; で記事ID 123 の最終更新日を表示できる。&lt;br&gt;&#10;&lt;code&gt;format&lt;/code&gt; 属性を指定すれば日付フォーマットを自由に変更できる。&lt;/p&gt;&#10;&lt;p&gt;例：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[updated id=&amp;#34;123&amp;#34; format=&amp;#34;Y年n月j日&amp;#34;]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;出力結果：&lt;code&gt;2025年10月19日&lt;/code&gt;&lt;/p&gt;&#10;&lt;h2 id="タイトル付きの拡張版"&gt;タイトル付きの拡張版&#10;&lt;/h2&gt;&lt;p&gt;記事タイトルと更新日を併記したい場合は、次のようにショートコードを拡張できる。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// [updated_with_title id=&amp;#34;123&amp;#34; format=&amp;#34;Y-m-d&amp;#34;]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;shortcode_post_updated_with_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$atts&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$atts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;shortcode_atts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;id&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;format&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Y-m-d&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;),&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$atts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;updated_with_title&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nv"&gt;$atts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$post&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;get_post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$atts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nv"&gt;$post&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;get_the_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$post&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$updated&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;get_the_modified_time&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$atts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;format&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nv"&gt;$atts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;esc_html&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$title&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;（更新日: &amp;#39;&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$updated&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;）&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;add_shortcode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;updated_with_title&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;shortcode_post_updated_with_title&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これにより、&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[updated_with_title id=&amp;#34;45&amp;#34; format=&amp;#34;Y/m/d&amp;#34;]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;と書くだけで&lt;br&gt;&#10;「記事タイトル（更新日: 2025/10/19）」&lt;br&gt;&#10;という形式で表示できる。&lt;/p&gt;&#10;&lt;h2 id="実運用上の注意点"&gt;実運用上の注意点&#10;&lt;/h2&gt;&lt;p&gt;このショートコードはループ外で動作するため、トップページや固定ページの任意の位置に埋め込める。&lt;br&gt;&#10;ただし、キャッシュ系プラグイン（WP Super Cache、LiteSpeed Cacheなど）を使用している場合は、更新後にキャッシュを手動削除しないと表示が反映されない場合がある。&lt;br&gt;&#10;また、日付の取得には &lt;code&gt;get_the_modified_time()&lt;/code&gt; を使用しているため、テーマによってはタイムゾーン設定が影響することがある。必要に応じて &lt;code&gt;get_post_modified_time()&lt;/code&gt; に置き換えてもよい。&lt;/p&gt;&#10;&lt;h2 id="まとめ"&gt;まとめ&#10;&lt;/h2&gt;&lt;p&gt;ショートコード化することで、テンプレート編集を避けながら任意の場所に更新日を表示できるようになった。&lt;br&gt;&#10;WordPressの柔軟性を保ったまま、メンテナンス性を高めるシンプルな実装例として有用である。&lt;/p&gt;&#10;</description></item><item><title>WordPressのカスタムフィールドをREST APIで取得する方法</title><link>https://ai.hack-le.com/wordpress%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%82%92rest-api%E3%81%A7%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/</link><pubDate>Thu, 11 Sep 2025 01:56:35 +0900</pubDate><guid>https://ai.hack-le.com/wordpress%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%82%92rest-api%E3%81%A7%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/</guid><description>&lt;p&gt;WordPressで作成したカスタムフィールドは、デフォルトではREST APIのレスポンスに含まれない。しかし、&lt;code&gt;register_rest_field()&lt;/code&gt;関数を使用することで、カスタムフィールドをREST APIのレスポンスに追加できる。本記事では、カスタムフィールドをREST APIで取得する手順を具体的に解説する。&lt;/p&gt;&#10;&lt;h2 id="前提環境"&gt;前提環境&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;WordPress 5.0以上&lt;/li&gt;&#10;&lt;li&gt;対象カスタムフィールドが既に投稿に設定済み&lt;/li&gt;&#10;&lt;li&gt;functions.phpまたはプラグインファイルへの編集権限&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="カスタムフィールドをrest-apiに追加する手順"&gt;カスタムフィールドをREST APIに追加する手順&#10;&lt;/h2&gt;&lt;h3 id="コードの実装"&gt;コードの実装&#10;&lt;/h3&gt;&lt;p&gt;以下のコードをテーマのfunctions.phpまたはプラグインファイルに追加する。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;add_action(&amp;#39;rest_api_init&amp;#39;, function() {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; register_rest_field(&amp;#39;post&amp;#39;, &amp;#39;custom_field_name&amp;#39;, array(&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#39;get_callback&amp;#39; =&amp;gt; function($post) {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return get_post_meta($post[&amp;#39;id&amp;#39;], &amp;#39;custom_field_name&amp;#39;, true);&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; },&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#39;schema&amp;#39; =&amp;gt; array(&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#39;description&amp;#39; =&amp;gt; &amp;#39;Custom field description&amp;#39;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#39;type&amp;#39; =&amp;gt; &amp;#39;string&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; )&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ));&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;});&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このコードの各パラメータについて詳しく説明する。&lt;/p&gt;&#10;&lt;h3 id="パラメータの説明"&gt;パラメータの説明&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;register_rest_field()&lt;/code&gt;関数の第1引数では、対象となる投稿タイプを指定する。投稿の場合は&lt;code&gt;'post'&lt;/code&gt;、固定ページの場合は&lt;code&gt;'page'&lt;/code&gt;、カスタム投稿タイプの場合はその投稿タイプ名を指定する。&lt;/p&gt;&#10;&lt;p&gt;第2引数では、REST APIのレスポンスに表示されるフィールド名を指定する。この名前は実際のカスタムフィールド名と異なっても構わないが、わかりやすさのため同じ名前にすることが多い。&lt;/p&gt;&#10;&lt;p&gt;第3引数の配列では、以下の設定を行う。&lt;code&gt;get_callback&lt;/code&gt;は、フィールドの値を取得するための関数を定義する。ここで&lt;code&gt;get_post_meta()&lt;/code&gt;関数を使用してカスタムフィールドの値を取得している。第3引数に&lt;code&gt;true&lt;/code&gt;を指定することで、配列ではなく単一の値として取得される。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;schema&lt;/code&gt;では、API仕様書に表示されるフィールドの説明とデータ型を定義する。データ型には&lt;code&gt;string&lt;/code&gt;、&lt;code&gt;integer&lt;/code&gt;、&lt;code&gt;boolean&lt;/code&gt;などが指定できる。&lt;/p&gt;&#10;&lt;h3 id="実際の使用例"&gt;実際の使用例&#10;&lt;/h3&gt;&lt;p&gt;たとえば、記事の閲覧数を記録する&lt;code&gt;page_views&lt;/code&gt;というカスタムフィールドがある場合、以下のように実装する。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;add_action(&amp;#39;rest_api_init&amp;#39;, function() {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; register_rest_field(&amp;#39;post&amp;#39;, &amp;#39;page_views&amp;#39;, array(&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#39;get_callback&amp;#39; =&amp;gt; function($post) {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return get_post_meta($post[&amp;#39;id&amp;#39;], &amp;#39;page_views&amp;#39;, true);&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; },&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#39;schema&amp;#39; =&amp;gt; array(&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#39;description&amp;#39; =&amp;gt; &amp;#39;Page view count&amp;#39;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#39;type&amp;#39; =&amp;gt; &amp;#39;integer&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; )&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ));&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;});&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この設定を行うと、REST APIのレスポンスは以下のようになる。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;id&amp;#34;: 123,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;title&amp;#34;: {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;rendered&amp;#34;: &amp;#34;サンプル記事&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; },&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;content&amp;#34;: {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;rendered&amp;#34;: &amp;#34;記事の内容...&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; },&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;page_views&amp;#34;: 1500,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;meta&amp;#34;: {...}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;カスタムフィールド&lt;code&gt;page_views&lt;/code&gt;が、投稿データと同じレベル（トップレベル）に配置されていることがわかる。&lt;/p&gt;&#10;&lt;h2 id="動作確認の方法"&gt;動作確認の方法&#10;&lt;/h2&gt;&lt;h3 id="curlコマンドでの確認"&gt;curlコマンドでの確認&#10;&lt;/h3&gt;&lt;p&gt;コマンドラインからcurlを使用して確認する。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl https://example.com/wp-json/wp/v2/posts/123&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;レスポンスのJSONデータの中に、設定したカスタムフィールド名とその値が含まれていれば実装成功である。&lt;/p&gt;&#10;&lt;h2 id="複数のカスタムフィールドを追加する場合"&gt;複数のカスタムフィールドを追加する場合&#10;&lt;/h2&gt;&lt;p&gt;複数のカスタムフィールドをREST APIに追加したい場合は、&lt;code&gt;register_rest_field()&lt;/code&gt;を複数回呼び出す。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;add_action(&amp;#39;rest_api_init&amp;#39;, function() {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; // 閲覧数フィールド&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; register_rest_field(&amp;#39;post&amp;#39;, &amp;#39;page_views&amp;#39;, array(&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#39;get_callback&amp;#39; =&amp;gt; function($post) {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return get_post_meta($post[&amp;#39;id&amp;#39;], &amp;#39;page_views&amp;#39;, true);&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; },&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#39;schema&amp;#39; =&amp;gt; array(&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#39;description&amp;#39; =&amp;gt; &amp;#39;Page view count&amp;#39;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#39;type&amp;#39; =&amp;gt; &amp;#39;integer&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; )&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ));&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; // 評価フィールド&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; register_rest_field(&amp;#39;post&amp;#39;, &amp;#39;rating&amp;#39;, array(&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#39;get_callback&amp;#39; =&amp;gt; function($post) {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return get_post_meta($post[&amp;#39;id&amp;#39;], &amp;#39;rating&amp;#39;, true);&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; },&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#39;schema&amp;#39; =&amp;gt; array(&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#39;description&amp;#39; =&amp;gt; &amp;#39;Post rating&amp;#39;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#39;type&amp;#39; =&amp;gt; &amp;#39;number&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; )&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ));&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;});&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この方法により、単一のアクションフック内で複数のカスタムフィールドをまとめて追加できる。&lt;/p&gt;&#10;&lt;h2 id="注意点とトラブルシューティング"&gt;注意点とトラブルシューティング&#10;&lt;/h2&gt;&lt;h3 id="カスタムフィールドの値が表示されない場合"&gt;カスタムフィールドの値が表示されない場合&#10;&lt;/h3&gt;&lt;p&gt;カスタムフィールドがREST APIに表示されない場合、以下を確認する必要がある。まず、対象の投稿に実際にカスタムフィールドの値が設定されているかをWordPress管理画面で確認する。値が設定されていない場合、APIのレスポンスには空の値またはnullが返される。&lt;/p&gt;&#10;&lt;p&gt;次に、&lt;code&gt;get_post_meta()&lt;/code&gt;関数の第1引数で正しい投稿IDが取得できているかを確認する。デバッグのため、一時的に&lt;code&gt;error_log()&lt;/code&gt;関数を使用して投稿IDやカスタムフィールドの値をログに出力して確認することも有効である。&lt;/p&gt;&#10;&lt;h3 id="テーマ間での互換性"&gt;テーマ間での互換性&#10;&lt;/h3&gt;&lt;p&gt;現在の実装方法では、テーマを変更するとfunctions.phpも変更されるため、新しいテーマでも同じコードを追加する必要がある。テーマに依存しない実装を行いたい場合は、専用のプラグインを作成することを推奨する。&lt;/p&gt;&#10;&lt;p&gt;プラグインとして実装する場合は、以下のようなファイル構造で作成する。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;?php&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/*&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Plugin Name: Custom Fields REST API&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Description: Adds custom fields to REST API&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Version: 1.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;*/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;add_action(&amp;#39;rest_api_init&amp;#39;, function() {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; register_rest_field(&amp;#39;post&amp;#39;, &amp;#39;page_views&amp;#39;, array(&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#39;get_callback&amp;#39; =&amp;gt; function($post) {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return get_post_meta($post[&amp;#39;id&amp;#39;], &amp;#39;page_views&amp;#39;, true);&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; },&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#39;schema&amp;#39; =&amp;gt; array(&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#39;description&amp;#39; =&amp;gt; &amp;#39;Page view count&amp;#39;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#39;type&amp;#39; =&amp;gt; &amp;#39;integer&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; )&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ));&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;});&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このファイルをプラグインディレクトリに配置することで、テーマに依存しない実装が可能になる。&lt;/p&gt;&#10;&lt;h2 id="まとめ"&gt;まとめ&#10;&lt;/h2&gt;&lt;p&gt;WordPressのカスタムフィールドをREST APIで取得するには、&lt;code&gt;register_rest_field()&lt;/code&gt;関数を使用する方法が最も確実である。この方法により、フロントエンドのJavaScriptアプリケーションやモバイルアプリケーションから、カスタムフィールドの値に簡単にアクセスできるようになる。実装時は、データ型の指定とエラーハンドリングに注意し、動作確認を十分に行うことが重要である。&lt;/p&gt;&#10;</description></item><item><title>WordPressでURLを自動的にハイパーリンクにする実装方法</title><link>https://ai.hack-le.com/wordpress%E3%81%A7url%E3%82%92%E8%87%AA%E5%8B%95%E7%9A%84%E3%81%AB%E3%83%8F%E3%82%A4%E3%83%91%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%AF%E3%81%AB%E3%81%99%E3%82%8B%E5%AE%9F%E8%A3%85%E6%96%B9%E6%B3%95/</link><pubDate>Fri, 01 Aug 2025 05:46:44 +0900</pubDate><guid>https://ai.hack-le.com/wordpress%E3%81%A7url%E3%82%92%E8%87%AA%E5%8B%95%E7%9A%84%E3%81%AB%E3%83%8F%E3%82%A4%E3%83%91%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%AF%E3%81%AB%E3%81%99%E3%82%8B%E5%AE%9F%E8%A3%85%E6%96%B9%E6%B3%95/</guid><description>&lt;p&gt;WordPressでブログを運営していると、投稿内にURLを記載することがよくある。しかし、毎回手動でリンクタグを書くのは面倒で、特に長いURLの場合は可読性も下がってしまう。本記事では、httpやhttpsで始まるURLを自動的にハイパーリンクに変換する方法を紹介する。&lt;/p&gt;&#10;&lt;p&gt;実装環境はWordPress 6.0以降を想定している。PHPの基本的な知識があれば十分理解できる内容である。&lt;/p&gt;&#10;&lt;h2 id="wordpress標準のmake_clickable関数を使った実装"&gt;WordPress標準のmake_clickable()関数を使った実装&#10;&lt;/h2&gt;&lt;p&gt;WordPressには&lt;code&gt;make_clickable()&lt;/code&gt;という標準関数が用意されており、これを使うのが最もシンプルで確実な方法である。この関数は、テキスト内のURLやメールアドレスを自動的に検出し、適切なHTMLリンクに変換してくれる。&lt;/p&gt;&#10;&lt;p&gt;実装方法は、アクティブなテーマのfunctions.phpファイルに以下のコードを追加するだけである。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;function auto_link_urls($content) {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return make_clickable($content);&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;add_filter(&amp;#39;the_content&amp;#39;, &amp;#39;auto_link_urls&amp;#39;);&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;add_filter(&amp;#39;comment_text&amp;#39;, &amp;#39;auto_link_urls&amp;#39;);&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この実装により、投稿本文（&lt;code&gt;the_content&lt;/code&gt;）とコメント（&lt;code&gt;comment_text&lt;/code&gt;）の両方で自動リンク化が有効になる。例えば、投稿内に「詳細はhttps://example.com/documentを参照してください」と書けば、自動的に「詳細は&amp;lt;a href=&amp;ldquo;&lt;a class="link" href="https://example.com/document%22&amp;amp;gt;https://example.com/document&amp;amp;lt;/a" target="_blank" rel="noopener"&#10; &gt;https://example.com/document"&amp;gt;https://example.com/document&amp;lt;/a&lt;/a&gt;&amp;gt;を参照してください」という形でHTMLが生成される。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;make_clickable()&lt;/code&gt;関数の優れた点は、既存のHTMLタグ内のURLには影響しないことである。つまり、手動で設定したリンクや画像のsrc属性などは変更されず、プレーンテキストのURLのみが対象となる。また、メールアドレスも同様に&lt;code&gt;mailto:&lt;/code&gt;リンクに変換されるため、非常に実用的である。&lt;/p&gt;&#10;&lt;h2 id="より詳細な制御が必要な場合の正規表現による実装"&gt;より詳細な制御が必要な場合の正規表現による実装&#10;&lt;/h2&gt;&lt;p&gt;標準の&lt;code&gt;make_clickable()&lt;/code&gt;関数では制御しきれない場合もある。例えば、リンクに特定のCSSクラスを付与したい、target属性を設定したい、特定のドメインのみ対象にしたいといった要求がある場合である。&lt;/p&gt;&#10;&lt;p&gt;このような場合は、正規表現を使ったカスタム関数を作成する方法がある。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;function custom_auto_link($content) {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; $pattern = &amp;#39;/(?&amp;lt;!href=&amp;#34;)(?&amp;lt;!src=&amp;#34;)(https?:\/\/[^\s&amp;lt;&amp;gt;&amp;#34;\&amp;#39;]+)/i&amp;#39;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; $replacement = &amp;#39;&amp;lt;a href=&amp;#34;$1&amp;#34; target=&amp;#34;_blank&amp;#34; rel=&amp;#34;noopener&amp;#34;&amp;gt;$1&amp;lt;/a&amp;gt;&amp;#39;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return preg_replace($pattern, $replacement, $content);&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;add_filter(&amp;#39;the_content&amp;#39;, &amp;#39;custom_auto_link&amp;#39;);&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この正規表現パターンでは、&lt;code&gt;(?&amp;lt;!href=&amp;quot;)&lt;/code&gt;と&lt;code&gt;(?&amp;lt;!src=&amp;quot;)&lt;/code&gt;という後読み否定アサーションを使用している。これにより、既存のhref属性やsrc属性内のURLは除外され、プレーンテキストのURLのみが対象となる。また、&lt;code&gt;target=&amp;quot;_blank&amp;quot;&lt;/code&gt;属性を付けることで、リンクを新しいタブで開くように設定し、&lt;code&gt;rel=&amp;quot;noopener&amp;quot;&lt;/code&gt;でセキュリティ上の問題も回避している。&lt;/p&gt;&#10;&lt;p&gt;ただし、この方法は&lt;code&gt;make_clickable()&lt;/code&gt;関数ほど洗練されていないため、エッジケースでの動作に注意が必要である。特に、複雑なHTMLが混在する場合や、URLに特殊文字が含まれる場合などでは、予期しない結果になる可能性がある。&lt;/p&gt;&#10;&lt;h2 id="特定のフィルターのみに適用する方法"&gt;特定のフィルターのみに適用する方法&#10;&lt;/h2&gt;&lt;p&gt;すべてのコンテンツに自動リンク化を適用したくない場合もある。例えば、投稿本文には適用したいが、コメントには適用したくない場合や、特定のカスタムフィールドにのみ適用したい場合である。&lt;/p&gt;&#10;&lt;p&gt;コメントのみに適用したい場合は、以下のように書く。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;add_filter(&amp;#39;comment_text&amp;#39;, &amp;#39;make_clickable&amp;#39;);&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;カスタムフィールドの値に適用したい場合は、表示時に関数を通すようにする。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;function auto_link_custom_field($value) {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return make_clickable($value);&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;// テンプレートファイルでの使用例&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;echo auto_link_custom_field(get_field(&amp;#39;url_field&amp;#39;));&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このように、WordPressのフィルターシステムを活用することで、必要な場所にのみ機能を適用できる。フィルターの優先度も指定可能で、他のプラグインとの競合を避けたい場合は優先度を調整すればよい。&lt;/p&gt;&#10;&lt;h2 id="実装時の注意点と推奨される書き方"&gt;実装時の注意点と推奨される書き方&#10;&lt;/h2&gt;&lt;p&gt;基本的な実装は前述のシンプルなコードで十分だが、より堅牢なシステムを構築したい場合は、いくつかの考慮点がある。&lt;/p&gt;&#10;&lt;p&gt;管理画面やRSSフィード生成時には自動リンク化を無効にしたい場合がある。これは、編集画面でのプレビューに影響したり、フィード内でのリンク表示に問題が生じたりする可能性があるためである。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;function my_theme_auto_link_urls($content) {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if (is_admin() || is_feed()) {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return $content;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return make_clickable($content);&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;add_filter(&amp;#39;the_content&amp;#39;, &amp;#39;my_theme_auto_link_urls&amp;#39;, 10);&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;add_filter(&amp;#39;comment_text&amp;#39;, &amp;#39;my_theme_auto_link_urls&amp;#39;, 10);&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;また、関数名には必ずプレフィックスを付けることが推奨される。これは、他のテーマやプラグインとの名前衝突を避けるためである。&lt;code&gt;my_theme_&lt;/code&gt;のような形でテーマ名を含めたプレフィックスを使用すれば、問題を回避できる。&lt;/p&gt;&#10;&lt;p&gt;しかし、個人サイトや小規模なプロジェクトであれば、最初に紹介したシンプルなコードで十分である。過度な抽象化や将来の拡張性を考慮した実装は、実際には使われないことが多く、コードの可読性を下げる結果になりがちである。動作するシンプルなコードこそが、最良の解決策と言える。&lt;/p&gt;&#10;&lt;h2 id="まとめ"&gt;まとめ&#10;&lt;/h2&gt;&lt;p&gt;WordPressでURLを自動的にハイパーリンクにする方法として、&lt;code&gt;make_clickable()&lt;/code&gt;関数を使った実装を紹介した。この方法は、WordPressの標準機能を活用するため安全性が高く、実装も非常にシンプルである。&lt;/p&gt;&#10;&lt;p&gt;最も基本的な実装は、functions.phpに数行のコードを追加するだけで完了する。より詳細な制御が必要な場合は正規表現を使った方法もあるが、一般的な用途では標準関数で十分である。&lt;/p&gt;&#10;&lt;p&gt;実際の運用では、シンプルで理解しやすいコードを維持することが重要である。複雑な実装よりも、動作が確実で保守しやすいコードの方が、長期的には価値が高い。&lt;/p&gt;&#10;</description></item><item><title>WordPress 6.8.2完全ガイド</title><link>https://ai.hack-le.com/wordpress-6-8-2%E5%AE%8C%E5%85%A8%E3%82%AC%E3%82%A4%E3%83%89/</link><pubDate>Wed, 16 Jul 2025 03:51:21 +0900</pubDate><guid>https://ai.hack-le.com/wordpress-6-8-2%E5%AE%8C%E5%85%A8%E3%82%AC%E3%82%A4%E3%83%89/</guid><description>&lt;p&gt;WordPress 6.8.2は2025年7月15日にリリースされた重要なメンテナンスリリースです。この更新は新機能の追加ではなく、&lt;strong&gt;20のコア修正と15のブロックエディター改善&lt;/strong&gt;に焦点を当てた安定性向上のリリースとなっています。&lt;/p&gt;&#10;&lt;h2 id="リリース概要と重要な変更点"&gt;リリース概要と重要な変更点&#10;&lt;/h2&gt;&lt;p&gt;WordPress 6.8.2は&lt;strong&gt;ショートサイクルメンテナンスリリース&lt;/strong&gt;として位置づけられ、WordPress 6.8で導入された機能の不具合修正と性能向上を目的としています。リリースは@audrasjb、@estelaris、@zunaid321によって主導されました。&lt;/p&gt;&#10;&lt;p&gt;このバージョンで最も重要な変更は、&lt;strong&gt;WordPress 4.1-4.6のセキュリティサポート終了&lt;/strong&gt;と、&lt;strong&gt;bcryptパスワードハッシュ化&lt;/strong&gt;の継続的な改善です。日本のWordPress開発者コミュニティでは、特にbcryptへの移行による下位互換性の問題について活発な議論が行われています。&lt;/p&gt;&#10;&lt;h2 id="主な修正内容と改善点"&gt;主な修正内容と改善点&#10;&lt;/h2&gt;&lt;h3 id="コア修正20項目"&gt;コア修正（20項目）&#10;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;テーマ関連の重要な修正&lt;/strong&gt;：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Twenty Twenty-Five&lt;/strong&gt;：エディタースタイルが読み込まれない問題を修正&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Twenty Sixteen&lt;/strong&gt;：引用ブロックのプレーンスタイルでエディターに枠線が表示される問題を解決&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Twenty Fourteen&lt;/strong&gt;：最新コメントブロックのリンク色がコンテンツサイドバーに適用される問題を修正&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Twenty Twenty-One&lt;/strong&gt;：メニュートグルが「load」イベント後まで反応しない問題を解決&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;メディア処理の改善&lt;/strong&gt;：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Mac スクリーンショットアップロード問題&lt;/strong&gt;：ファイル名にクエスチョンマークが挿入され画像が破損する問題を修正&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;oEmbed プロバイダー変更&lt;/strong&gt;：app.screencast.com の削除と HTTP から HTTPS への移行&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;開発環境の強化&lt;/strong&gt;：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;ブロックエディタースタイルの開発モード&lt;/strong&gt;導入&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Twemoji v16.0.1&lt;/strong&gt;への更新&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;TinyMCE キャッシュキー&lt;/strong&gt;の更新によるパフォーマンス向上&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="ブロックエディター改善15項目"&gt;ブロックエディター改善（15項目）&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;ナビゲーションブロック&lt;/strong&gt;：パフォーマンス最適化と有効性チェック改善&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;クエリループ&lt;/strong&gt;：&amp;lsquo;query.inherit&amp;rsquo; 属性値の上書き防止&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;画像ブロック&lt;/strong&gt;：ライブラリから同じ画像を再選択時の古いURL問題を修正&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;詳細ブロック&lt;/strong&gt;：すべての非インタラクティブフォーマットを有効化し、キーボードアクセシビリティを改善&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;メディアプレースホルダー&lt;/strong&gt;：ローカルURLパスを許可するメディアURL入力タイプの回帰を修正&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="システム要件"&gt;システム要件&#10;&lt;/h2&gt;&lt;p&gt;WordPress 6.8.2は&lt;strong&gt;WordPress 6.8と同じシステム要件&lt;/strong&gt;を維持しています：&lt;/p&gt;&#10;&lt;h3 id="最小要件"&gt;最小要件&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;PHP&lt;/strong&gt;: バージョン7.4以上&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;MySQL&lt;/strong&gt;: バージョン5.7以上 または &lt;strong&gt;MariaDB&lt;/strong&gt;: バージョン10.4以上&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;HTTPS&lt;/strong&gt;: サポート必須&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;ウェブサーバー&lt;/strong&gt;: Apache または Nginx（推奨）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="推奨要件"&gt;推奨要件&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;PHP&lt;/strong&gt;: バージョン8.0以上（最適なパフォーマンスのため）&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;MySQL&lt;/strong&gt;: バージョン8.0以上 または &lt;strong&gt;MariaDB&lt;/strong&gt;: バージョン10.6以上&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;RAM&lt;/strong&gt;: 最小512MB（大規模サイトには8GB推奨）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;日本のホスティングプロバイダーであるKUSANAGIチームは、PHP 8.xとの互換性について詳細な技術分析を提供しており、パフォーマンス向上のためのPHP 8.0以上の使用を強く推奨しています。&lt;/p&gt;&#10;&lt;h2 id="インストールとアップデート方法"&gt;インストールとアップデート方法&#10;&lt;/h2&gt;&lt;h3 id="自動更新推奨"&gt;自動更新（推奨）&#10;&lt;/h3&gt;&lt;ol&gt;&#10;&lt;li&gt;WordPressダッシュボードにログイン&lt;/li&gt;&#10;&lt;li&gt;「&lt;strong&gt;ダッシュボード」＞「更新&lt;/strong&gt;」に移動&lt;/li&gt;&#10;&lt;li&gt;「&lt;strong&gt;今すぐ更新&lt;/strong&gt;」ボタンをクリック&lt;/li&gt;&#10;&lt;li&gt;WordPressが自動的に6.8.2をダウンロード・インストール&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="手動更新"&gt;手動更新&#10;&lt;/h3&gt;&lt;ol&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://wordpress.org/download/release-archive/" target="_blank" rel="noopener"&#10; &gt;https://wordpress.org/download/release-archive/&lt;/a&gt; からWordPress 6.8.2をダウンロード&lt;/li&gt;&#10;&lt;li&gt;FTPまたはホスティングコントロールパネルでファイルをアップロード&lt;/li&gt;&#10;&lt;li&gt;標準的なWordPressアップグレード手順に従う&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="wp-cli使用"&gt;WP-CLI使用&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wp core update https://wordpress.org/wordpress-6.8.2.zip&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="既知の問題と注意点"&gt;既知の問題と注意点&#10;&lt;/h2&gt;&lt;h3 id="重要な互換性問題"&gt;重要な互換性問題&#10;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;マルチサイト環境での問題&lt;/strong&gt;：一部のユーザーでマルチサイトインストールでドメインマッピングに関する問題が報告されています。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;パスワードハッシュ化の変更&lt;/strong&gt;：日本の開発者コミュニティ（特にSWELLテーマ開発者）は、WordPress 6.8でのbcryptパスワードハッシュ化について警告しています。「6.8にアップデート後にダウングレードすると、bcrypt/MD5の非互換性によりパスワード認証が失敗する可能性がある」とされています。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;SEOプラグインとの競合&lt;/strong&gt;：Yoast SEOなど一部のSEOプラグインで投稿エディターのレイアウト問題が報告されています。&lt;/p&gt;&#10;&lt;h3 id="パフォーマンスへの影響"&gt;パフォーマンスへの影響&#10;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;メモリリーク修正&lt;/strong&gt;：do_blocks()関数でのメモリリークが修正され、サイトパフォーマンスが向上しました。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;キャッシュ改善&lt;/strong&gt;：TinyMCEキャッシュキーの更新により、エディターの読み込み速度が改善されています。&lt;/p&gt;&#10;&lt;h2 id="日本語コミュニティからの反応"&gt;日本語コミュニティからの反応&#10;&lt;/h2&gt;&lt;h3 id="翻訳と地域化の状況"&gt;翻訳と地域化の状況&#10;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;翻訳チームの活動&lt;/strong&gt;：日本のWordPress翻訳チームは積極的に活動しており、すべてのWordPress 6.8.2ドキュメントが日本語に翻訳されています。WordPress 6.5で導入された改良された翻訳システム（gettextからPHPベースの翻訳ファイルへの移行）により、パフォーマンスが向上しています。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;コミュニティエンゲージメント&lt;/strong&gt;：WordCamp Japan コミュニティはWordPress 6.8の変更について活発に議論しており、日本全国の25のWordPress Meetupグループがボランティアメンバーによって管理されています。&lt;/p&gt;&#10;&lt;h3 id="開発者とテーマ制作者の対応"&gt;開発者とテーマ制作者の対応&#10;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;主要な日本のプラグイン開発者&lt;/strong&gt;：不動産プラグインシリーズなどの主要な日本のプラグイン開発者がWordPress 6.8対応版をリリースしています。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;テーマ開発者の分析&lt;/strong&gt;：Vektor Inc.（Lightningテーマ開発者）やTCDテーマ開発者は、WordPress 6.8の変更点と日本のユーザーへの影響について包括的なガイドを提供しています。&lt;/p&gt;&#10;&lt;h2 id="前バージョンからの変更点"&gt;前バージョンからの変更点&#10;&lt;/h2&gt;&lt;h3 id="wordpress-681からの変更"&gt;WordPress 6.8.1からの変更&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;追加の20のコア修正&lt;/strong&gt;（6.8.1では15の修正）&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;15のブロックエディター改善&lt;/strong&gt;（6.8.1と同様の範囲）&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;同梱テーマ固有の修正&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;メディア処理の改善&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;開発環境の強化&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="wordpress-680からの主な違い"&gt;WordPress 6.8.0からの主な違い&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;新機能なし&lt;/strong&gt; - 純粋にメンテナンス重視&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;既存のWordPress 6.8機能の安定性向上&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;6.8.0リリース後に発見された問題の修正&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;ブロックエディターとコア機能のパフォーマンス最適化&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="今後の展望と推奨事項"&gt;今後の展望と推奨事項&#10;&lt;/h2&gt;&lt;h3 id="ウェブサイト所有者への推奨"&gt;ウェブサイト所有者への推奨&#10;&lt;/h3&gt;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;即座にアップデート&lt;/strong&gt;してバグ修正と改善の恩恵を受ける&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;カスタムテーマやプラグインで徹底的にテスト&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;アップデート前にサイトをバックアップ&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;プラグインのWordPress 6.8.2互換性を確認&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="開発者への推奨"&gt;開発者への推奨&#10;&lt;/h3&gt;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;ブロックエディターAPIの技術的変更を確認&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;カスタムブロックとテーマの互換性をテスト&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;影響を受けるWordPress関数を使用している場合はプラグインコードを更新&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;将来の開発で非推奨機能を考慮&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="まとめ"&gt;まとめ&#10;&lt;/h2&gt;&lt;p&gt;WordPress 6.8.2は、35の総修正（20のコア + 15のブロックエディター）により、WordPress 6.8の全体的な安定性を向上させる堅実なメンテナンスリリースです。新機能は導入されていませんが、ユーザーエクスペリエンスに影響を与える重要な問題を修正しており、すべてのWordPress 6.8ユーザーにとって価値のあるアップデートとなっています。&lt;/p&gt;&#10;&lt;p&gt;WordPress 4.1-4.6のセキュリティアップデート終了は、WordPressの進化における重要な節目を示しており、セキュリティとパフォーマンスの利点のためにより新しいバージョンを維持することの重要性を強調しています。&lt;/p&gt;&#10;&lt;p&gt;日本のWordPressコミュニティは引き続き活発で、翻訳・地域化の取り組みが強力に続いており、グローバルなWordPressエコシステムの変化にもかかわらず、技術的な分析とユーザーガイダンスを提供し続けています。&lt;/p&gt;&#10;</description></item><item><title>Vivaldiブラウザの誕生背景</title><link>https://ai.hack-le.com/vivaldi%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%81%AE%E8%AA%95%E7%94%9F%E8%83%8C%E6%99%AF/</link><pubDate>Mon, 12 May 2025 00:20:01 +0900</pubDate><guid>https://ai.hack-le.com/vivaldi%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%81%AE%E8%AA%95%E7%94%9F%E8%83%8C%E6%99%AF/</guid><description>&lt;p&gt;Vivaldiは、かつてOpera SoftwareのCEOを務めたJon von Tetzchner氏が、Operaの開発方針変更やユーザーコミュニティ（「My Opera」）の閉鎖に反発して立ち上げたブラウザです。2014年3月にOpera公式フォーラム「My Opera」が閉鎖されると、Tetzchner氏は同年1月に代替コミュニティサイト「Vivaldi.net」を立ち上げ、2015年1月27日には技術プレビュー版のVivaldiブラウザを公開、翌2016年4月にバージョン1.0の正式版をリリースしました。創設の動機について氏は「既存の主要ブラウザはユーザーの声を十分に反映しておらず、自分が欲しいブラウザは存在しなかった」と語っており、多機能かつカスタマイズ性の高いOpera（Prestoエンジン時代）で好評だった機能を、Chromiumベースでも復活させることを目指しました。特に旧Operaユーザーやハイテク志向のパワーユーザーに支持される“ユーザー第一主義”ブラウザとして位置づけられています。&lt;/p&gt;&#10;&lt;h2 id="技術的特徴"&gt;技術的特徴&#10;&lt;/h2&gt;&lt;p&gt;VivaldiはエンジンにChromium（Blink）を用いながら、&lt;strong&gt;独自UIレイヤー&lt;/strong&gt;をHTML/CSS/JavaScriptで構築している点が特徴です。UIのほとんどはWeb技術で実装されており、テーマや配色、タブの配置などを柔軟にカスタマイズできます。ただしこのUI部分はクローズドソース（約5%）で公開されています。Vivaldiには豊富な組み込み機能があります。例えば -&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;タブ管理機能&lt;/strong&gt;：タブをグループ化する「タブスタック」や画面分割「タイル表示」が可能で、使わないタブは休止（ヒベナート）してメモリ消費を抑制できる。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;マウスジェスチャー&lt;/strong&gt;：タブ移動やページ操作などをマウス動作だけで実行できる。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Webパネル&lt;/strong&gt;：サイドバーに任意のWebページを常駐表示する機能で、参照サイトやツールを常に表示できる。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;メモ／アノテーション&lt;/strong&gt;：Webページ上に手書きメモやスクリーンショットを追加し、閲覧履歴とともに管理可能。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;統合メール・フィードリーダー&lt;/strong&gt;：IMAP/POP対応のメールクライアント（Vivaldi Mail）とRSS/Atomフィードリーダーを標準搭載。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;カレンダー・翻訳&lt;/strong&gt;：組み込みカレンダーでイベント管理ができ、Webページ翻訳（Lingvanex）機能も内蔵。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;プライバシー機能&lt;/strong&gt;：広告ブロックやトラッカー防止機能を標準搭載。さらに2025年3月には&lt;strong&gt;Proton VPN&lt;/strong&gt;のデスクトップ版組み込みが発表され、追加設定なしにVPN接続が利用可能になりました（図）。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Vivaldiデスクトップ版には2025年3月にProton VPNがネイティブ統合され、追加インストール不要でVPN接続が可能となった。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;その他の機能&lt;/strong&gt;：ブックマークのショートカットを並べる「スピードダイヤル」、設定や履歴を検索できる「クイックコマンド」、Chrome/Firefox用拡張機能のほとんどが使用可能（UIはChromiumと異なるためChrome専用テーマは非対応）、透明UI（Chromeless）モードなど、多機能かつ高度にカスタマイズ可能な設計となっています。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="現在の市場シェア普及状況"&gt;現在の市場シェア・普及状況&#10;&lt;/h2&gt;&lt;p&gt;市場規模ではVivaldiの占有率は極めて小規模です。StatCounterなどの統計ではGoogle ChromeやSafari、Edgeに次ぐカテゴリ外に含まれ、グローバルデスクトップシェアは&lt;strong&gt;約0.2%&lt;/strong&gt; とされます（ちなみにChromeは約64%、Edge約13%）。またVivaldiはユーザーエージェントをChromiumの一般ビルドに偽装する設定にしており、実際の利用者がChromeにカウントされてしまうため、市場シェアの計測でも「その他」に分類される傾向があります。&lt;/p&gt;&#10;&lt;p&gt;公式発表では、2024年末時点で&lt;strong&gt;アクティブユーザー数は310万人&lt;/strong&gt;を超えており、Android版はGoogle Playで累計500万件以上インストールされています。利用者層としては機能を求める技術志向ユーザーが多く、旧Operaユーザーやカスタマイズ好きが中心です。統計上の傾向では、Vivaldi関連サイトへのアクセスの約59%が日本からであり、ユーザーの約72.7%は男性、年齢層では25–34歳が最も多い（約28.0%）と報告されています。日本やアジア圏での人気が高い点も特徴です。なおプラットフォーム別では、PC版が2015年、Android版が2019年、そして&lt;strong&gt;iOS版は2023年9月&lt;/strong&gt;にようやく正式リリースされました。&lt;/p&gt;&#10;&lt;h2 id="今後の展望"&gt;今後の展望&#10;&lt;/h2&gt;&lt;p&gt;Vivaldiは豊富な独自機能で差別化を図る一方、市場シェア拡大には大きな制約があります。業界では「多機能ぶんだけ初心者には敷居が高い」「競合大手との差を埋めるのは容易ではない」との見方が強く、実際初期レビューでも“ニッチなブラウザであり続ける”と指摘されています。Chrome/Safari/Edgeら独占状態の現在、Vivaldiが大衆的なシェアを獲得するには相当の時間と投資を要します。&lt;/p&gt;&#10;&lt;p&gt;それでもVivaldiは当面、&lt;strong&gt;コアユーザー層を大切にした独自戦略&lt;/strong&gt;で生き残りを目指します。高いカスタマイズ性やプライバシー重視機能、統合メールなど独自サービスが強みで、最近ではProton VPNの組込みでプライバシー強化に注力しています。またiOS版や車載版（Android Automotive向け）などモバイル・新プラットフォームへの展開で認知拡大を図っており、従来のPCブラウザに留まらない利用シーン拡大を狙っています。一方、開発リソースはNorway/アイスランド/米国に拠点を置く約50名規模の小所帯で、外部投資を受けず社員持株制で運営されているため、資金・人員面で限界もあります。収益モデルは検索エンジン提携による検索連携収入が中心であり、広告やユーザーデータ収益化を行わない方針です。このため大規模なマーケティングや機能開発投資は難しく、AI機能実装など今後の機能追加にも制約があると考えられます。&lt;/p&gt;&#10;&lt;p&gt;中長期的には、Vivaldiは&lt;strong&gt;ニッチ戦略&lt;/strong&gt;を堅持しつつ徐々に浸透を図ることになるでしょう。競合との差別化要素（高度なタブ管理、高度カスタマイズ、統合ツール群など）を維持しながら、プライバシー志向市場や技術志向ユーザーを取り込む狙いです。一方で、市場の大勢は変え難いため、シェア拡大は緩やかに留まる可能性が高いと見られています。今後の課題としては、限られた人員で製品開発を続ける一方、増え続けるユーザーニーズにどう対応するかが問われます。総じて、Vivaldiはコアな支持層を背景に堅調な成長を目指すものの、Chromeらと張り合う大規模ブラウザになるのは難しく、あくまで機能重視のニッチ市場戦略を続ける形となりそうです。&lt;/p&gt;&#10;</description></item><item><title>Firefoxの市場シェアの推移と盛衰</title><link>https://ai.hack-le.com/firefox%E3%81%AE%E5%B8%82%E5%A0%B4%E3%82%B7%E3%82%A7%E3%82%A2%E3%81%AE%E6%8E%A8%E7%A7%BB%E3%81%A8%E7%9B%9B%E8%A1%B0/</link><pubDate>Mon, 12 May 2025 00:09:53 +0900</pubDate><guid>https://ai.hack-le.com/firefox%E3%81%AE%E5%B8%82%E5%A0%B4%E3%82%B7%E3%82%A7%E3%82%A2%E3%81%AE%E6%8E%A8%E7%A7%BB%E3%81%A8%E7%9B%9B%E8%A1%B0/</guid><description>&lt;p&gt;Mozilla Firefoxは2004年に正式版が公開されたオープンソースのウェブブラウザです。Internet Explorer（以下、IE）が独占的だった市場に挑み、登場当初は高速な表示、タブブラウジングや拡張機能によるカスタマイズ性の高さなどが評価されました。一時は世界シェア約3割に達しIEの牙城を崩しましたが、2008年に登場したGoogle Chromeとの競争を経て次第に勢いを失い、2020年代には一桁台のシェアにまで落ち込んでいます。本レポートでは、Firefoxの2000年代前半から2025年までの市場シェアの推移を振り返り、その盛衰の背景を、競合ブラウザとの関係、技術革新、Mozillaの収益構造や提携、ユーザー層とブランドイメージの変化といった観点から時系列で分析します。&lt;/p&gt;&#10;&lt;h2 id="2000年代前半ie独占への挑戦と急成長"&gt;2000年代前半：IE独占への挑戦と急成長&#10;&lt;/h2&gt;&lt;p&gt;2000年代前半、ウェブブラウザ市場はMicrosoftのIEが支配的で、そのシェアは90%以上に及んでいました。しかしIE6は2001年のリリース以降長らく大きな更新がなく、セキュリティ面の不安や技術的陳腐化が指摘されていました。こうした中、Netscape由来のオープンソースプロジェクトであるMozillaは「Mozilla Application Suite」からブラウザ部分を独立させ、軽量化した新ブラウザを開発します。それが&lt;strong&gt;Firefox&lt;/strong&gt;であり、2002年にプレリリース版（コードネーム「Phoenix」）が公開、2004年11月に正式版1.0がリリースされました。&lt;/p&gt;&#10;&lt;p&gt;Firefoxは当初から技術コミュニティや上級ユーザーの支持を集め、IEにはない&lt;strong&gt;タブブラウズ&lt;/strong&gt;や豊富な&lt;strong&gt;拡張機能&lt;/strong&gt;によるカスタマイズ、そして悪名高いActiveXを避けた堅牢な&lt;strong&gt;セキュリティ&lt;/strong&gt;などが評価されました。リリースから9か月で6000万回以上ダウンロードされるなど爆発的なスタートを切り、シェアも着実に伸ばしていきます。2007年時点でFirefoxは世界シェア約10％台に達し、特に欧州では24％超と高い支持を得ていました。2008年にはついに&lt;strong&gt;世界シェア20％&lt;/strong&gt; を突破し、IEの独占体制を崩す大きな節目となりました。この頃にはIEのシェアも約70％前後まで低下しており（2004年は90％超）、Firefoxは名実ともにIEに次ぐ第二のブラウザとして定着します。また同時期、AppleのSafari（2003年登場、主にMacと2007年発売のiPhoneで普及）やOperaなど他のブラウザも存在しましたが、シェア面ではFirefoxがIE打倒の筆頭格でした。&lt;/p&gt;&#10;&lt;p&gt;技術面では、Firefoxはオープンウェブ標準の推進役ともなり、IEに実装の遅れていたCSSやSVGといった標準をいち早くサポートしました。拡張機能では広告ブロックや開発者向けツール（Firebugなど）が人気を博し、ユーザー主導の機能拡張文化が育まれました。また、Mozillaは非営利団体でありつつも経営面で&lt;strong&gt;検索エンジンからの収入&lt;/strong&gt;に支えられていました。Firefoxの検索デフォルトは当初よりGoogleで、GoogleからのロイヤルティがMozilla財団収入の大部分を占めていました（例えば2014年にはMozillaの総収入3億30百万ドルのうち3億23百万ドルをGoogleとの提携が占めました）。もっとも2000年代後半までは、GoogleはMozillaにとって支援者でしたが後に強力な競合相手ともなります。&lt;/p&gt;&#10;&lt;h2 id="20082011年chromeの台頭と逆転劇"&gt;2008〜2011年：Chromeの台頭と逆転劇&#10;&lt;/h2&gt;&lt;p&gt;2008年9月、検索大手のGoogleが満を持して独自ブラウザ&lt;strong&gt;Chrome&lt;/strong&gt;をリリースします。Chromeは高速JavaScriptエンジン「V8」やマルチプロセスアーキテクチャによる安定性を武器に、シンプルで軽快なユーザー体験を提供しました。さらにGoogleは自社の検索サイトや各種広告枠を通じてChromeを大々的に宣伝し、ユーザー獲得を推進します。その結果、Chromeは公開からわずか数年で急成長を遂げました。Firefoxも2008～2009年にかけてシェアを伸ばし&lt;strong&gt;2009年11月には32.2%のシェア&lt;/strong&gt;に達して一時的にピークを迎えました。しかしChromeは2009年時点で数％だったシェアを着実に奪取し、&lt;strong&gt;2011年11月にはFirefox約25.2%に対しChromeが25.7%と初めてFirefoxを逆転&lt;/strong&gt;しました。この時、依然トップのIEは約40%でしたが（残りはSafariなど）、ブラウザ市場の勢力図は大きく書き換わりつつありました。&lt;/p&gt;&#10;&lt;p&gt;Firefox陣営も手をこまねいていたわけではありません。2009年には高速化したFirefox 3.5をリリースし、一時は単一バージョンでIE7を超えるなど健闘しました。2011年には長らく開発が難航していたFirefox 4.0を公開し、UI刷新やHTML5対応強化、JavaScript高速化（JägerMonkeyエンジン導入）などテコ入れを図ります。またリリース後は従来の年1回程度の大規模アップデートから、Chromeに倣った&lt;strong&gt;高速リリースサイクル（約6週ごとに新版）&lt;/strong&gt; へと方針転換しました。これは技術革新のスピードについていくための戦略でしたが、頻繁なバージョン更新に戸惑うユーザーもいました。&lt;/p&gt;&#10;&lt;p&gt;他方で、&lt;strong&gt;ウェブ利用のモバイルシフト&lt;/strong&gt;という潮流もFirefoxには逆風となりました。2007年登場のiPhoneや、2008年以降普及したAndroidスマートフォンによりモバイル向けブラウザ利用が拡大します。AppleのSafariはiPhoneの標準ブラウザとしてシェアを伸ばし、Androidでも当初は標準ブラウザ（後にChrome for Android）が大量のユーザーを獲得しました。しかしFirefoxはモバイル分野で出遅れました。Mozillaはモバイル版「Firefox Mobile（開発名Fennec）」を2009年末に一部端末向けに投入、2011年にはAndroid版もリリースしましたが、動作の重さや端末メーカーとの提携不足もあり普及しませんでした。またAppleのポリシー上、iOS向けFirefoxはSafariエンジン（WebKit）のラッピングに留まり差別化が困難でした。スマホ黎明期にモバイル市場で存在感を示せなかったことは、後々までFirefoxの総合シェアに響くことになります。&lt;/p&gt;&#10;&lt;h2 id="20122016年モバイル時代の苦戦と組織的試練"&gt;2012〜2016年：モバイル時代の苦戦と組織的試練&#10;&lt;/h2&gt;&lt;p&gt;2010年代中盤までに、世界のブラウザ利用はPCからモバイルへ大きく移行しました。StatCounterの統計では2016年にモバイルのウェブ利用がPCを逆転しています。この流れの中で、モバイルで弱いFirefoxの相対シェアは低下を避けられませんでした。実際、ある統計では&lt;strong&gt;2016年にFirefoxのデスクトップシェアが7.7%まで落ち込み&lt;/strong&gt;、2000年代半ば以来の低水準となりました。Chromeは同時期に60％前後まで達し、圧倒的首位を占めています。一方、Microsoftは2015年にWindows 10とともに従来のIEに代わる新ブラウザ&lt;strong&gt;Edge&lt;/strong&gt;（EdgeHTMLエンジン）を投入しましたが、そのシェアは伸び悩み、デスクトップ市場でFirefoxと下位を競る状況でした（どちらも一桁台から10％程度のレンジ）。&lt;/p&gt;&#10;&lt;p&gt;Firefoxは苦境打開のため技術面でも組織面でも様々な手を打ちました。技術的課題の一つは&lt;strong&gt;マルチプロセス対応&lt;/strong&gt;の遅れでした。Chromeがタブごとに独立プロセスを割り当てる設計で安定性を高めていたのに対し、Firefoxは長らくプロセス分離を行わず、アドオンとの互換性を重視して単一プロセスで動作していました。その結果、タブが増えると応答が阻害されるなどパフォーマンス面で不利でした。Mozillaは「Electrolysis（e10s）」計画のもとプロセス分離に取り組み、2016年頃から段階的にFirefoxへ導入しました。これによりレンダリングエンジン「Gecko」のプロセスとUIプロセスが分離され、後にコンテンツタブのプロセス並列化も進められました。加えてJavaScriptエンジンを強化したり（2013年IonMonkey導入）、メモリ効率の改善なども行いましたが、依然として「Firefoxは重い」とのイメージが付きまとい、Chromeから流出したユーザーを呼び戻すには至りませんでした。&lt;/p&gt;&#10;&lt;p&gt;拡張機能エコシステムにも転機が訪れました。Firefoxの強みであった強力な拡張機能は、その高度な自由度ゆえにブラウザ本体の構造刷新を難しくしていました。Mozillaは2015年、従来のXUL/XPCOMベースの拡張を廃止し、Chromeに近いAPIを持つ新拡張方式「WebExtensions」への移行を発表します。これはセキュリティ向上や将来の機能追加には有効でしたが、一部の古参ユーザーからは「お気に入りのアドオンが使えなくなる」と反発を招きました。&lt;/p&gt;&#10;&lt;p&gt;この時期、Mozillaの収益面・戦略面でも動きがありました。2014年、Mozillaは米国版Firefoxのデフォルト検索エンジンを、長年提携してきたGoogleからYahoo!に切り替える決断をします。当時MozillaはGoogle Chromeという強力な競合の出現に直面しつつ、収入源の大半をGoogleに依存する状況をリスクと捉えたとも見られます。しかしYahoo!検索への変更はユーザーに歓迎されず、「検索品質より政治的判断を優先した」との批判も受けました。実際、多くのユーザーは手動でGoogle検索に戻したとも言われ、Firefoxの利用継続にマイナスに働いた可能性があります。このYahoo!との契約は5年予定でしたが、2017年にMozillaは契約上の権利を行使して&lt;strong&gt;打ち切り&lt;/strong&gt;、Googleを再びデフォルト検索に戻しました。後に明らかになったところでは、Yahoo!買収に伴う契約条項によりMozillaは年間3億7500万ドルの支払いを受けつつ契約終了を選べる立場にあり、それを行使したようです。いずれにせよ、収入源の再びのGoogle回帰はMozillaの経営のグラつきを示唆しました。Mozillaは他地域でも、中国ではBaidu、ロシアではYandexなど地域ごとの検索提携を行って収益源を多様化させてはいましたが、&lt;strong&gt;Firefoxの収益の約90%が検索連動広告料に依存&lt;/strong&gt;する構造自体は変わっていませんでした。&lt;/p&gt;&#10;&lt;p&gt;2014年には経営トップの交代劇も話題となりました。Mozilla CTOでFirefox開発に携わったブレンダン・アイク氏が一時CEOに就任しましたが、同氏の過去の政治献金がきっかけで内部外部から反発が起こり、就任からわずか11日で辞任する事態となりました。この騒動はMozillaのブランドイメージにも少なからず影響を与え、「自由で開かれたウェブ」を掲げる組織の理念と経営の難しさを露呈しました。ただしブラウザ市場シェアへの直接の影響は限定的であり、Firefox低迷の主因はあくまで製品競争力と市場環境の変化にありました。&lt;/p&gt;&#10;&lt;h2 id="20172019年firefox-quantumによる再起とプライバシー路線"&gt;2017〜2019年：Firefox Quantumによる再起とプライバシー路線&#10;&lt;/h2&gt;&lt;p&gt;2017年、Firefoxは大規模な刷新を伴うリリース「&lt;strong&gt;Firefox 57 (Quantum)&lt;/strong&gt;」を発表します。これはMozillaが数年をかけ進めてきた「Project Quantum」の成果を結集したもので、レンダリングエンジンの中核にRust言語で実装した新技術を導入し、並列処理による高速化を実現しました。例えばCSSのレイアウト計算にはServoプロジェクト由来の「Stylo」エンジンを採用し、マルチコアCPUをフル活用することでスタイル適用を高速化しました。また先述のマルチプロセス対応も完全に有効化され、さらにUIも「Photon」と呼ばれるモダンなデザインに刷新されています。これらによりMozillaは「従来比2倍の高速化、メモリ使用量30%減（対Chrome比）」といった飛躍的性能向上を謳い、かつての機敏さを取り戻すことを目指しました。&lt;/p&gt;&#10;&lt;p&gt;Firefox Quantumはユーザーやメディアから概ね好意的に受け止められました。実際にページ表示の体感速度が向上し、特に大量のタブを開いた際の動作がChromeより軽快との評価も得ました。米Wired誌は「2017年にふさわしいブラウザ」「見えないトラッカーを自動でブロックし、プライバシー重視で履歴も守ってくれる。Chromeより速く、賢い」とQuantumを賞賛しています。加えてPocketの統合（あとで読む機能）やスクリーンショット機能の強化など細かな使い勝手でも改善が見られました。一方で、このタイミングで旧式のアドオンは完全にサポート終了となり、愛用していた一部機能が使えなくなったユーザーもいましたが、全体としてFirefoxのユーザー体験は近代化されました。&lt;/p&gt;&#10;&lt;p&gt;MozillaはFirefox Quantumリリースに合わせてマーケティングとブランドイメージの立て直しも図りました。スローガンに「Firefoxはあなたのためのブラウザ（Firefox fights for you）」と掲げ、&lt;strong&gt;プライバシー重視&lt;/strong&gt;や&lt;strong&gt;非営利&lt;/strong&gt;である点を強調する戦略を明確にします。実際、2015年頃からMozillaは追跡ブロック機能（トラッキング保護）をプライベートブラウジングモードに搭載していましたが、2018～2019年にはこれを強化し、&lt;strong&gt;Enhanced Tracking Protection (ETP)&lt;/strong&gt; として通常ブラウジングでもデフォルト有効化しました。またFacebookなど特定ドメインのトラッカーを分離する「コンテナ」機能も提供し、ユーザーのデータが巨大全に握られないよう工夫しました。こうしたプライバシー機能は競合ブラウザにはないFirefoxの差別化要因となり、特にテクノロジーに詳しい層やプライバシー意識の高いユーザーから支持を集めました。&lt;/p&gt;&#10;&lt;p&gt;Quantum効果もあってか、&lt;strong&gt;2017年末には一時的にFirefoxシェアが持ち直した&lt;/strong&gt;とのデータもあります。NetApplicationsの統計では、2016年に7.7%まで落ち込んだFirefoxのデスクトップシェアが2017年10月には13%近くまで回復しました。しかしこれは長続きしませんでした。Chromeユーザーの大多数はエコシステム（Googleアカウント連携やChrome拡張の蓄積など）にロックインされており、わざわざFirefoxへ乗り換える動機は限定的でした。またWindowsやAndroidといったプラットフォームでのデフォルト地位を持たないFirefoxは、ユーザー獲得でどうしても不利です。結局、&lt;strong&gt;2018年以降Firefoxのシェアは再び緩やかな低下傾向に戻り&lt;/strong&gt;、2019年末時点ではデスクトップで8％前後まで下降しました。&lt;/p&gt;&#10;&lt;p&gt;とはいえMozillaはこの頃から明確に「プライバシー重視」の路線を打ち出したことで、Firefoxのブランドイメージはかつての「速い新興ブラウザ」から「ユーザーの権利を守る良心的なブラウザ」へと変化していきました。実際のユーザー層も少しずつ変化しています。ある統計によれば2023年時点でFirefoxユーザーの約&lt;strong&gt;59%が男性、41%が女性&lt;/strong&gt;で、年齢層では&lt;strong&gt;25～34歳が24.8%と最多&lt;/strong&gt;を占めます。比較的若い技術志向のユーザーに支持されており、その多くはFirefoxの&lt;strong&gt;オープンソース性&lt;/strong&gt;や&lt;strong&gt;高い拡張性&lt;/strong&gt;、そして何より&lt;strong&gt;プライバシー保護へのこだわり&lt;/strong&gt;に価値を見出しています。Firefoxはこうしたコアユーザーを支えに、市場全体では小さいながらも確固とした存在意義を維持する道を模索することになります。&lt;/p&gt;&#10;&lt;h2 id="2020年代市場再編と現在のfirefox"&gt;2020年代：市場再編と現在のFirefox&#10;&lt;/h2&gt;&lt;p&gt;2020年代に入ると、ブラウザ市場はさらに統合が進みました。2019年末、Microsoftは従来のEdgeHTMLエンジンを放棄し、GoogleのChromiumプロジェクトをベースとした新Edge（Blinkエンジン）への移行を発表します。&lt;strong&gt;2020年にはEdgeのChromium版が正式リリース&lt;/strong&gt;され、これにより主要ブラウザのレンダリングエンジンは実質Google系（Blink/Chromium）とApple系（WebKit）の2系統のみとなりました。Mozilla Firefoxの&lt;strong&gt;Geckoエンジンは「Big Tech」に属さない唯一の独立系エンジン&lt;/strong&gt;として残りました。MozillaはかつてIE独占に対抗するためGeckoを開発した経緯があり、ウェブ標準の多様性を守る観点からもFirefox/Geckoの存続意義は大きいとされています。しかし現実のシェアに目を向けると、Firefoxの戦いは厳しさを増しています。&lt;/p&gt;&#10;&lt;p&gt;まず&lt;strong&gt;デスクトップ市場&lt;/strong&gt;では、Windows 10/11にプリインストールされ既定ブラウザとなる新Edgeが一定のシェアを獲得し、2021年にはFirefoxを追い抜きました。StatCounterの統計によれば、2021年3月時点のデスクトップシェアはChrome約67%、Safari約10%、Edge約8.0%、Firefox約7.97%となっており、Firefoxは長年守ってきた「3位」の座をEdgeに明け渡しました。さらに&lt;strong&gt;モバイル市場&lt;/strong&gt;では、Android標準のChromeとiOS標準のSafariが支配的で、Firefoxの存在感はごくわずかです。2024年時点でFirefoxのモバイルシェアはわずか0.6%程度に過ぎないとの分析もあり、総合的に見てもFirefoxのシェアは数％台と推定されています。実際StatCounterによれば2025年2月時点でFirefoxはPC・モバイル含む全世界ブラウザシェアの約&lt;strong&gt;3％前後&lt;/strong&gt;しかなく、デスクトップのみでも&lt;strong&gt;6.36%（第4位）&lt;/strong&gt; に留まっています。一方Chromeは総合で約65%と圧倒的首位、SafariはiPhone効果で20%前後（総合2位）、Edgeや他のChromium派生ブラウザ（Opera、Braveなど）も少なからぬユーザーを擁します。&lt;/p&gt;&#10;&lt;p&gt;このように数字の上ではFirefoxの存在感は小さくなりましたが、Mozillaは製品の差別化と組織の存続に向けて手を打っています。製品面では引き続き&lt;strong&gt;プライバシー保護機能の強化&lt;/strong&gt;が図られました。例えば2021年にはCookieをサイトごとに分離してサードパーティによる追跡を根本的に防ぐ「&lt;strong&gt;総合的なCookie保護（Total Cookie Protection）&lt;/strong&gt;」を実装し、2022年以降これをデフォルト有効にしました。さらに暗号化通信の強制（HTTPS-Onlyモード）や、DNSクエリを暗号化するDNS over HTTPSの標準化など、ユーザーの痕跡が漏れにくい仕組みを積極的に取り入れています。こうした機能強化により、Firefoxは「プライバシーを最優先するユーザーにとっての主要な選択肢」というブランドイメージを確立しました。実際、「Firefoxユーザーの75%はプライバシー機能がFirefoxを使い続ける重要な理由」との調査もあります。また拡張機能の活用も依然盛んで、&lt;strong&gt;ユーザーの70%以上が何らかの拡張機能を導入&lt;/strong&gt;しており、他ブラウザにはない高度なカスタマイズ性も保持しています。&lt;/p&gt;&#10;&lt;p&gt;一方、Mozillaの&lt;strong&gt;収益構造&lt;/strong&gt;は相変わらず脆弱です。Firefoxの市場シェア低下により検索連動収入も縮小傾向にありますが、それでもMozilla全体の収入の大半はFirefox経由の検索エンジン提携によるものです。2022年時点でMozillaの年間収入は約5億ドル、そのうち&lt;strong&gt;90%近くが検索エンジンからのロイヤルティ&lt;/strong&gt;であり、中でもGoogleからの支払いが約4億ドルと最大を占めています。つまり現在でも&lt;strong&gt;Mozilla収入の約8割強はGoogle頼み&lt;/strong&gt;という状況です。このジレンマは2023年に表面化しました。米司法省によるGoogleの反トラスト訴訟に関連して、MozillaのCFOは「もし裁判所がGoogleによるデフォルト検索エンジン契約を禁じれば、Mozillaは事業継続が危うくなる」と証言しました。「収入源を一度に失えば大規模な人員削減が避けられず、開発縮小で製品力が低下しユーザー離れが加速する悪循環に陥りかねない。それはFirefoxをビジネスから退出させる可能性がある」と警鐘を鳴らしています。事実、Mozillaは2020年に250名（全従業員の約1/4）をレイオフしており、経営環境の厳しさがうかがえます。&lt;/p&gt;&#10;&lt;p&gt;もっとも、Mozilla幹部はFirefoxが消滅することの影響についても強調しています。前述の証言でCFOは「Geckoエンジンは&lt;strong&gt;大手テック企業に属さない唯一のブラウザエンジン&lt;/strong&gt;であり、Firefoxが消えればウェブは単一企業群により支配される恐れがある」と述べています。この指摘の通り、2025年現在エンジンレベルではChromium（Google主導）とWebKit（Apple主導）に二極化しており、Firefox/Geckoは多様性維持の要となっています。実際、欧米の技術コミュニティや競争当局からも「ブラウザ市場の単一化（モノカルチャー）への懸念」が表明されており、Firefoxにはシェア以上の存在意義が認められていると言えるでしょう。&lt;/p&gt;&#10;&lt;h2 id="おわりにfirefoxの果たす役割と展望"&gt;おわりに：Firefoxの果たす役割と展望&#10;&lt;/h2&gt;&lt;p&gt;以上、Firefoxの誕生から現在までの盛衰を振り返りました。2000年代、Firefoxは停滞するIEに風穴を開けウェブ標準とユーザー本位の機能を普及させる原動力となりました。2009年前後には世界シェアの3分の1を得て栄華を極めますが、その後はGoogle Chromeという新たな競合の前にシェアを奪われ続けました。2020年代の今日、Firefoxのシェアはわずか数％とかつての勢いは見る影もありません。しかしその存在は決して無意味ではありません。むしろ、商業的動機から距離を置き&lt;strong&gt;ユーザーのプライバシーとオープンなウェブを守る&lt;/strong&gt;というFirefoxの理念は、個人情報保護や独占阻止が重要課題となった現代において一層重要になっています。&lt;/p&gt;&#10;&lt;p&gt;Firefoxのユーザー層は少数ながら根強い支持を示しており、「速度や便利さより信念を重視する」いわばコアな愛好者によって支えられています。Mozillaもまた、Firefox以外の新規事業（VPNサービスやプライバシー重視のPocket提案記事など）を模索しつつ、ブラウザ本体の改良を続けています。今後の課題は、いかにして一般ユーザーにも魅力を感じてもらいシェア低下に歯止めをかけるかです。既定ブラウザの壁は厚いものの、近年ではプライバシー志向の高まりや規制当局の動きも追い風になり得ます。Firefox自身も速度・機能で競合に劣らない水準を維持しており、実用上のハンデは過去ほど大きくありません。あとは「なぜFirefoxなのか」をユーザーに訴求し続けることが重要でしょう。&lt;/p&gt;&#10;&lt;p&gt;結局のところ、Firefoxの盛衰はウェブブラウザ市場のダイナミズムそのものです。かつて独占状態だったIEを打ち破った革新者が、今度は自らより強力な競合に追われる立場となり、それでも理念を掲げて踏みとどまっている――その歴史はウェブの進化と表裏一体です。Firefoxが今後も存続し競争を続けることは、ユーザーに選択肢を提供し続ける上で不可欠であり、ひいてはオープンで健全なインターネットの維持につながると言えるでしょう。その意味で、たとえシェアは小さくともFirefoxの存在価値は今なお失われていないのです。&lt;/p&gt;&#10;</description></item><item><title>2005年〜2025年 Webブラウザ市場シェアの推移</title><link>https://ai.hack-le.com/2005%E5%B9%B4%E3%80%9C2025%E5%B9%B4-web%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E5%B8%82%E5%A0%B4%E3%82%B7%E3%82%A7%E3%82%A2%E3%81%AE%E6%8E%A8%E7%A7%BB/</link><pubDate>Sun, 11 May 2025 23:15:08 +0900</pubDate><guid>https://ai.hack-le.com/2005%E5%B9%B4%E3%80%9C2025%E5%B9%B4-web%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E5%B8%82%E5%A0%B4%E3%82%B7%E3%82%A7%E3%82%A2%E3%81%AE%E6%8E%A8%E7%A7%BB/</guid><description>&lt;p&gt;過去20年間でWebブラウザの勢力図は劇的に変化しました。2000年代半ばにはMicrosoftのInternet Explorer（IE）が世界市場をほぼ独占していましたが、その後Mozilla FirefoxやGoogle Chromeなどの新興ブラウザが台頭し、現在ではChromeが支配的な地位を占めています。本稿では2005年から2025年までのブラウザ市場シェアの推移を時系列で振り返り、主要ブラウザ（IE、Firefox、Chrome、Safari、Edge、Operaなど）のシェア変動と、その背景にある技術革新、OS戦略、セキュリティ・パフォーマンス要因、さらにはスマートフォンなどデバイス普及の影響について分析します。&lt;/p&gt;&#10;&lt;h2 id="20052009年-ie独占時代とfirefoxの挑戦"&gt;2005〜2009年: IE独占時代とFirefoxの挑戦&#10;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;IE圧倒的シェアとFirefox登場:&lt;/strong&gt; 2005年前後のブラウザ市場はIEが圧倒的支配者で、世界シェアは85〜90%に達していました。IE6（2001年リリース）以降長らく大規模アップデートが途絶えたこともあり、IEはセキュリティ問題や標準非準拠の欠点を抱えていました。この隙を突いてMozilla財団のFirefox（2004年正式版リリース）が急速に支持を集め、2005年末にはFirefoxがシェア約10%超を獲得しています。Firefoxはタブブラウジングや拡張機能、優れた標準準拠性など当時革新的な機能を備え、IEからの乗り換えを促しました。実際、IE7が2006年にタブ機能やフィッシング対策を搭載してリリースされたものの、それらは既にFirefoxやOperaでは一般的だった機能であり、IEは技術革新の面で後手に回っていたことが窺えます。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;他ブラウザの状況:&lt;/strong&gt; この時期、Operaも古参ブラウザとして存在感を示していました。Operaはページ表示の高速化や独自の圧縮プロキシ（Opera Mini）など先進的機能で根強いユーザーを持ちましたが、市場シェア自体はデスクトップでは数％以下と限定的でした。AppleのSafariは2003年にMac向けに登場しましたが、当時のMacの普及率が低かったためシェアは僅かでした。ただし2007年に初代iPhoneが発売されるとモバイル版Safariが登場し、少しずつモバイルブラウジング市場での存在感を高め始めます（もっとも2000年代末時点ではスマートフォンからのWeb利用はまだ全体の一部でした）。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;IE独占崩れの兆し:&lt;/strong&gt; こうした新興勢力の台頭により、IEの独占体制に陰りが見え始めます。Firefoxの成功を受けてIEも2006年以降IE7/IE8で機能改善を図りましたが、ユーザーの流出傾向は止まりませんでした。欧州では2009年に欧州委員会の是正措置としてWindows上での「ブラウザ選択画面」の表示（Browser Ballot）が義務付けられ、Windowsユーザーが代替ブラウザを選びやすくなる措置も取られました。このように2000年代後半には &lt;strong&gt;「IE一強」体制が崩れ、Firefoxを筆頭に他ブラウザがシェアを徐々に奪い始める時代&lt;/strong&gt;となったのです。&lt;/p&gt;&#10;&lt;h2 id="20102014年-chromeの台頭とieの没落"&gt;2010〜2014年: Chromeの台頭とIEの没落&#10;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Chromeの登場（2008年）:&lt;/strong&gt; ブラウザ市場に決定的な転機をもたらしたのが、2008年9月にリリースされたGoogle Chromeです。ChromeはSafariと同じWebKitレンダリングエンジンを使いつつ、独自の高速JavaScriptエンジンV8を搭載し圧倒的な動作速度をアピールしました。またタブ毎のプロセス分離による安定性やシンプルなUI、自動アップデートによるセキュリティ向上など技術革新が盛り込まれ、登場直後から注目を集めます。実際Chromeは公開1年後の2009年秋には約3.6%のシェアを獲得し、2010年には早くも二桁％に乗せるなど急速な成長を遂げました。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;IEのシェア急落:&lt;/strong&gt; 一方、IEのシェア低下はこの時期決定的となります。StatCounterの統計では2010年時点でIEはついに世界シェア50%を割り込むまでに低下しました。IEは過去の高シェアゆえにレガシー環境で使われ続けたものの、技術面で先行するChromeやFirefoxとの差が広がり、一般ユーザーの関心も離れていきました。IE9（2011年）やIE10（2012年）でHTML5対応や速度改善も図られましたが焼け石に水で、&lt;strong&gt;2012年5月にはStatCounterの集計でChromeがIEを初めて追い抜き世界トップシェアのブラウザとなりました&lt;/strong&gt;。長年トップだったIEが首位から陥落したことは、ブラウザ戦争における歴史的な節目となりました。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Firefoxの動向とChrome台頭の理由:&lt;/strong&gt; Firefoxは2010年前後にシェア約24%程度でピークに達しましたが、その後は緩やかに下降線をたどります。かつてIE独占に風穴を開けたFirefoxでしたが、Chromeの台頭により徐々にユーザーを奪われた形です。背景にはChromeの持つ高速性能と頻繁な機能アップデート（6週間ごとのリリースサイクル）、そしてGoogleの強力なプロモーション力がありました。Chromeは検索エンジンや各種Webサービスとの連携でユーザー囲い込みを図り、市場シェアを着実に伸ばしました。一方のFirefoxはオープンソースでコミュニティ主導の開発ゆえに商業的パワーに劣り、また一時期動作の重さも指摘されるなど、一般ユーザーへの訴求力でChromeに及ばなくなっていきました。この結果、2010年代前半には&lt;strong&gt;ブラウザ市場は「Chrome一強、IE・Firefox二位争い」という構図&lt;/strong&gt;に移行します。2014年頃にはデスクトップ市場でChromeがシェア50%近くに達し、FirefoxとIEは各20%前後で僅差の2位争いをする状況になっていました。かつて95%を誇ったIEがこの順位まで転落したのは象徴的です。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Safari・Operaの立ち位置:&lt;/strong&gt; Safariはこの時期もデスクトップでは5%前後の小勢力でしたが、Apple製品の人気上昇に伴い緩やかに存在感を増していました。特に2010年にはiPadが発売され、iPhoneと合わせてiOSデバイスからのWebアクセスが拡大します。ただ世界全体で見ると2014年時点でもWeb利用の主流はPCブラウザであり、モバイル（スマホ・タブレット）経由はまだ少数派でした。Operaは2013年に独自エンジンを捨ててChromium（Blinkエンジン）ベースへと転換しましたが、ユーザーベース拡大には繋がらずデスクトップシェアは数％以下のままでした。しかし新興国を中心にOpera Miniが低速回線でも使いやすい圧縮ブラウザとして一定の支持を集め、モバイル分野で独自の役割を果たしました。&lt;/p&gt;&#10;&lt;h2 id="20152019年-モバイル時代の到来とedgeの戦略転換"&gt;2015〜2019年: モバイル時代の到来とEdgeの戦略転換&#10;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;スマートフォン普及による地殻変動:&lt;/strong&gt; 2010年代中盤になると、スマートフォンの爆発的普及がブラウザ市場の勢力図を塗り替え始めます。2016年10月、ついに世界全体のWebアクセスに占めるモバイル（スマホ・タブレット）ブラウザの割合が51.3%となり、デスクトップ（48.7%）を逆転しました。このモバイルシフトにより、AppleのSafari（iPhone/iPad上の標準ブラウザ）とGoogle Chrome（Androidの標準ブラウザとして定着）のシェアが大きく伸長します。実際、モバイル利用の増加に伴ってSafariは世界ブラウザ市場全体で見たシェアを拡大させ、ChromeとSafariの二強体制が強まっていきました。反対に、従来PC上で使われていたIEやFirefoxは相対的に存在感が低下します。特にMicrosoftはスマートフォン分野で存在感を示せず（Windows Phoneのシェアはごく僅か）、モバイルブラウザ市場から取り残されました。このこともIE凋落に拍車をかけた要因です。FirefoxもAndroid版を提供しましたがシェア獲得には至らず、iOS版はエンジン制限（iOSではSafari(WebKit)以外のエンジン利用禁止）のため独自性を出せず、モバイル市場では苦戦しました。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Microsoft Edgeの投入（2015年）:&lt;/strong&gt; 2015年、MicrosoftはWindows 10と共に新ブラウザ「Microsoft Edge」をリリースし、長年のIEからの脱却を図りました。Edgeは新エンジン（EdgeHTML）で高速化・標準準拠を改善し、名称変更でIEの悪いイメージを一新しようという戦略でした。しかしリリース当初のEdgeはWindows 10専用で拡張機能も未成熟だったため、大勢には影響を与えられませんでした。多くのユーザーは引き続きChromeなど他ブラウザを利用し、Edgeのシェアは当初数％に留まりました。とはいえ、Edgeの投入はMicrosoft自体がIEの失敗を認め次世代ブラウザに舵を切ったことを意味し、ブラウザ戦略上の大きな転換点でした。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;市場シェアの集約:&lt;/strong&gt; 2017年前後までに、ブラウザ市場は主要プレーヤーがほぼ出揃い、そのシェアが大きく集約されました。2017年時点で世界シェアを見ると、Chromeが60%以上を占め、Safariがそれに次ぐ存在となる一方で、Firefox・IE・Operaといった他ブラウザはいずれも5%未満に低下しています。同年5月にはMozilla元CTOが「第二次ブラウザ戦争はChromeの勝利に終わった」と宣言するに至りました。事実、2010年代後半にはChrome（およびそのオープンソース版であるChromium）エンジンの事実上の一人勝ちとも言える状況で、Web開発の標準もChrome基準で進むようになります。競合各社もこの流れに対応せざるを得なくなりました。Operaは既にChromiumベースに転換済みでしたが、2018年末には遂にMicrosoftも独自路線を断念し、EdgeをChromium（Blinkエンジン）ベースに作り直す計画を発表します。新生「Chromium版Edge」は2020年初頭に公開され、以降Windows 10/11の標準ブラウザはChromiumエンジンとなりました。このように&lt;strong&gt;ブラウザエンジンの収斂&lt;/strong&gt;も2010年代後半の大きな動きであり、Geckoエンジンを守るFirefox以外はほぼChrome系エンジンに統一される流れとなっています。&lt;/p&gt;&#10;&lt;h2 id="20202025年-現代のブラウザ勢力図"&gt;2020〜2025年: 現代のブラウザ勢力図&#10;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Chrome支配と二番手Safari:&lt;/strong&gt; 2020年代に入ってからもChromeの独走体制は続いており、依然として世界シェアの約2/3をChromeが握っています。ChromeはWindows/MacといったPCだけでなくAndroidスマホでも事実上の標準ブラウザであり、クロスプラットフォームで圧倒的な存在感を示しています。その結果、Web開発者もまずChrome（Blink）で動作確認するのが当たり前になるなど、エコシステムもChrome中心に回っています。Safariは世界シェア約17%で2位グループに位置しています。この数字は主にiPhoneやiPadといったiOSデバイスでの利用によるものです。実際2020年代にはモバイル経由のWebアクセスが全体の60%以上を占めるまでになっており、iOS端末からのアクセスが多い地域ではSafariが非常に高いシェアを持っています。一方でSafariはWindows版提供停止もありMac/iOS以外では使われないため、プラットフォーム依存のシェアと言えます。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;EdgeとFirefox、その他の状況:&lt;/strong&gt; Microsoft Edge（Chromium版）は、Windowsへの標準搭載とChromium由来の高い互換性を武器に徐々にユーザー数を増やしつつありますが、そのシェアは2025年時点で約5%前後に留まっています。もっとも、旧IEユーザーの移行先として一定の役割を果たし、2022年6月にはInternet Explorerのサポートがついに正式終了して事実上姿を消しました。Firefoxは2020年代も数％程度のシェアを維持しており、熱心な支持層（プライバシー重視のユーザーや開発者コミュニティ）に支えられて細々と存続しています。しかし大勢に影響を与えるには至らず、市場シェアの面では今も縮小傾向にあります。その他、OperaやSamsung Internet、かつてアジアで人気を博したUC Browserなどもいずれも数％以下のニッチな存在になっています。総じて言えば、&lt;strong&gt;2020年代前半のブラウザ市場は「Chrome帝国」ともいえる支配的状況&lt;/strong&gt;であり、その中でSafariやEdgeが一定の地位を占め、FirefoxやOperaは細々と生き残っている構図です。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;技術・戦略面の総括:&lt;/strong&gt; この20年のシェア変動の背景にはそれぞれ明確な要因がありました。まず&lt;strong&gt;技術革新&lt;/strong&gt;の観点では、レンダリングエンジンやJavaScriptエンジンの性能差、Web標準対応度の違いがユーザー体験を左右し、ブラウザ乗り換えの大きな動機となりました。例えばChromeの高速V8エンジンやマルチプロセス設計は当初画期的で、多くのユーザーが「速いから」という理由でChromeに流れました。また&lt;strong&gt;セキュリティ&lt;/strong&gt;も重要です。IEはActiveXの脆弱性など度重なるセキュリティ問題で信頼を失い、Chromeはサンドボックス機構や自動更新で安全性を売りにしました。&lt;strong&gt;OS戦略&lt;/strong&gt;の面では、MicrosoftがWindowsにIE/Edgeをバンドルしたようにプラットフォームとの結び付きがシェアに直結しましたが、モバイル時代にはGoogleがAndroidにChromeを、AppleがiOSにSafariを組み込むことで覇権を握りました。逆に言えば、モバイルOS市場で敗れたMicrosoftはブラウザ市場でも苦戦を強いられたのです。&lt;strong&gt;ユーザーエクスペリエンスと性能&lt;/strong&gt;もシェアに影響しました。Firefoxの拡張機能エコシステムは熱心なユーザーを引き付けましたが、一般層にはシンプルで高速なChromeが受け入れられました。Operaは独自機能が評価されつつも大衆受けせずニッチに留まりました。&lt;/p&gt;&#10;&lt;p&gt;最後に、&lt;strong&gt;スマートフォン・タブレットの普及&lt;/strong&gt;がブラウザ市場に与えた影響は極めて大きいものがありました。2010年代前半まではPC中心だったインターネット利用が、後半にはモバイル中心へとシフトしたことで、ブラウザ市場の主役もPC向けブラウザからモバイル向けブラウザへと移りました。このモバイルシフトに適応できた企業（GoogleやApple）はシェアを伸ばし、適応が遅れた企業（MozillaやMicrosoft）は相対的に後退する結果となりました。以上のように、2005年から2025年にかけてのブラウザ市場は、技術トレンドとデバイス環境の変化に沿って&lt;strong&gt;IEからFirefoxへ、そしてChromeへの覇権交代&lt;/strong&gt;が進み、現在に至っています。各ブラウザの興亡は、技術革新への対応力とプラットフォーム戦略の巧拙が明暗を分けたと言えるでしょう。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;主な参考資料:&lt;/strong&gt; ブラウザシェア統計（StatCounter等）、ブラウザ戦争の解説、ガーディアン報道（2016年モバイル利用逆転）など。&lt;/p&gt;&#10;</description></item><item><title>WordPress REST APIで記事を投稿しカスタムフィールドを設定する方法</title><link>https://ai.hack-le.com/wordpress-rest-api-custom-fields/</link><pubDate>Tue, 07 Jan 2025 18:45:53 +0900</pubDate><guid>https://ai.hack-le.com/wordpress-rest-api-custom-fields/</guid><description>&lt;p&gt;WordPress REST APIを使用して記事を投稿すると同時に、カスタムフィールドを設定することができます。本記事では、Pythonを使用してREST API経由で記事を作成し、カスタムフィールドを設定または更新する手順を紹介します。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="準備"&gt;準備&#10;&lt;/h2&gt;&lt;p&gt;アプリパスワードを取得します。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://ai.hack-le.com/wordpress-app-password/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;WordPressでアプリパスワードを取得する操作手順&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/wordpress-app-password/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://ai.hack-le.com/images/uploads/2024/10/wordpress-app-password.webp" alt="WordPressでアプリパスワードを取得する操作手順" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;hr&gt;&#10;&lt;p&gt;&lt;code&gt;functions.php&lt;/code&gt;に以下のコードを追加し、カスタムフィールドをREST APIで操作可能にします。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;register_custom_meta_fields&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;register_post_meta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;post&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;custom_field_key_1&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;type&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;string&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;single&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;show_in_rest&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;));&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;register_post_meta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;post&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;custom_field_key_2&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;type&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;number&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;single&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;show_in_rest&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;));&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;add_action&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;init&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;register_custom_meta_fields&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="pythonで記事を投稿しカスタムフィールドを設定する"&gt;Pythonで記事を投稿しカスタムフィールドを設定する&#10;&lt;/h2&gt;&lt;p&gt;以下は、Pythonを使用してWordPressのREST APIで記事を作成し、カスタムフィールドを設定するコードです。&lt;/p&gt;&#10;&lt;h3 id="コード例"&gt;コード例&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;requests&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;requests.auth&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;HTTPBasicAuth&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# WordPressの設定&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;WORDPRESS_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://your-wordpress-site.com/wp-json/wp/v2/posts&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;USERNAME&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;your-username&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;APP_PASSWORD&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;your-app-password&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;custom_fields&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; WordPress REST APIを使用して記事を作成し、カスタムフィールドを設定&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Content-Type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;application/json&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;title&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;content&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;status&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;publish&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;meta&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;custom_fields&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;# カスタムフィールド&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;WORDPRESS_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;HTTPBasicAuth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;USERNAME&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;APP_PASSWORD&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;201&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;投稿が成功しました: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="c1"&gt;# 応答データを表示&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;投稿に失敗しました: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# サンプルデータ&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;title&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;サンプル投稿 1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;content&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;p&amp;gt;この投稿はREST APIで作成されました。&amp;lt;/p&amp;gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;custom_fields&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;custom_field_key_1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;サンプル値1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;custom_field_key_2&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;title&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;サンプル投稿 2&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;content&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;p&amp;gt;こちらもREST APIで作成されました。&amp;lt;/p&amp;gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;custom_fields&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;custom_field_key_1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;サンプル値2&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;custom_field_key_2&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 投稿をループして作成&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;post&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;create_post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;title&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;content&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;custom_fields&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#10;&lt;h3 id="詳細な解説"&gt;詳細な解説&#10;&lt;/h3&gt;&lt;h4 id="カスタムフィールドの設定"&gt;カスタムフィールドの設定&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;上記コードの &lt;code&gt;custom_fields&lt;/code&gt; は、REST APIの &lt;code&gt;meta&lt;/code&gt; に渡されます。&lt;/li&gt;&#10;&lt;li&gt;WordPressに登録されているカスタムフィールド（&lt;code&gt;functions.php&lt;/code&gt; で登録）だけが受け付けられます。&lt;/li&gt;&#10;&lt;li&gt;未登録のカスタムフィールドを送信するとエラーになります。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="既存記事のカスタムフィールドを更新する"&gt;既存記事のカスタムフィールドを更新する&#10;&lt;/h2&gt;&lt;p&gt;既存の記事のカスタムフィールドを更新するには、&lt;code&gt;PATCH&lt;/code&gt; メソッドを使用します。&lt;/p&gt;&#10;&lt;h3 id="コード例-1"&gt;コード例&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;update_post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;post_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;custom_fields&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; WordPress REST APIを使用して既存記事のカスタムフィールドを更新&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;WORDPRESS_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;post_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Content-Type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;application/json&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;meta&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;custom_fields&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;# 更新するカスタムフィールド&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;patch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;HTTPBasicAuth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;USERNAME&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;APP_PASSWORD&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;投稿 (ID: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;post_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;) が更新されました。&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;更新に失敗しました: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# サンプル更新データ&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;update_post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;123&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;custom_field_key_1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;更新された値&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;custom_field_key_2&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;})&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#10;&lt;h2 id="エラーハンドリング"&gt;エラーハンドリング&#10;&lt;/h2&gt;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;認証エラー&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;正しい認証情報（ユーザー名とアプリパスワード）が必要です。&lt;/li&gt;&#10;&lt;li&gt;エラー例: &lt;code&gt;{ &amp;quot;code&amp;quot;: &amp;quot;rest_cannot_create&amp;quot;, &amp;quot;message&amp;quot;: &amp;quot;Sorry, you are not allowed to create posts as this user.&amp;quot;, &amp;quot;data&amp;quot;: { &amp;quot;status&amp;quot;: 403 } }&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;ol start="2"&gt;&#10;&lt;li&gt;&lt;strong&gt;カスタムフィールド未登録エラー&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;カスタムフィールドが &lt;code&gt;register_post_meta&lt;/code&gt; で登録されていない場合はエラーになります。&lt;/li&gt;&#10;&lt;li&gt;エラー例: &lt;code&gt;{ &amp;quot;code&amp;quot;: &amp;quot;rest_invalid_param&amp;quot;, &amp;quot;message&amp;quot;: &amp;quot;Invalid parameter(s): meta&amp;quot;, &amp;quot;data&amp;quot;: { &amp;quot;status&amp;quot;: 400 } }&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="まとめ"&gt;まとめ&#10;&lt;/h2&gt;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;カスタムフィールドの登録&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;functions.php&lt;/code&gt; に &lt;code&gt;register_post_meta&lt;/code&gt; を記述してREST APIで操作可能にする。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;ol start="2"&gt;&#10;&lt;li&gt;&lt;strong&gt;記事の作成&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;POST&lt;/code&gt; メソッドで記事を作成し、同時にカスタムフィールドを設定。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;ol start="3"&gt;&#10;&lt;li&gt;&lt;strong&gt;記事の更新&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;PATCH&lt;/code&gt; メソッドでカスタムフィールドを更新可能。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;上記の方法で、REST APIを通じてWordPressの記事とカスタムフィールドを簡単に操作できます。&lt;/p&gt;&#10;</description></item><item><title>WordPress REST APIですべての記事を削除するPythonコード</title><link>https://ai.hack-le.com/wordpress-delete-all-posts/</link><pubDate>Tue, 07 Jan 2025 18:07:34 +0900</pubDate><guid>https://ai.hack-le.com/wordpress-delete-all-posts/</guid><description>&lt;p&gt;実行するとすべての記事が削除されますので、注意してください。&lt;/p&gt;&#10;&lt;h2 id="コード"&gt;コード&#10;&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;os&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;requests&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;requests.auth&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;HTTPBasicAuth&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# WordPressの設定&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;WORDPRESS_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://example.com/wp-json/wp/v2/posts&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;USERNAME&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;WORDPRESS_USERNAME&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;APP_PASSWORD&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;WORDPRESS_APP_PASSWORD&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fetch_posts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;per_page&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; すべての投稿を取得する&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;?per_page=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;per_page&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;amp;page=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Error fetching posts (page &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;): &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;break&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;posts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;extend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;per_page&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="c1"&gt;# 最後のページに到達&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;break&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;page&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;posts&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;delete_post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;post_id&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; 指定された投稿を削除する&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;post_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;投稿 (ID: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;post_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;) を削除しました。&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;投稿 (ID: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;post_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;) の削除に失敗しました:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;delete_all_posts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; すべての投稿を削除する&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fetch_posts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;削除する投稿はありません。&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;post&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;delete_post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;__main__&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 認証情報の設定&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;auth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;HTTPBasicAuth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;USERNAME&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;APP_PASSWORD&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# すべての投稿を削除&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;delete_all_posts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;WORDPRESS_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#10;&lt;h2 id="使い方"&gt;使い方&#10;&lt;/h2&gt;&lt;p&gt;スクリプトをファイルとして保存し、実行する。&lt;code&gt;requests&lt;/code&gt;ライブラリのインストールが事前に必要。&lt;/p&gt;&#10;&lt;p&gt;また、以下を環境変数として登録している（テストするだけならハードコーディングでもよい）&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;WORDPRESS_USERNAME&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;WORDPRESS_APP_PASSWORD&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;アプリパスワードについては以下の記事を参照。&lt;/p&gt;&#10;&lt;div class="blog-card-wrapper"&gt;&#10; &lt;a href="https://ai.hack-le.com/wordpress-app-password/" class="blog-card"&gt;&#10; &lt;div class="blog-card-content"&gt;&#10; &lt;div class="blog-card-label"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&#10; &lt;span&gt;あわせて読みたい&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-title"&gt;WordPressでアプリパスワードを取得する操作手順&lt;/div&gt;&#10; &lt;div class="blog-card-url"&gt;/wordpress-app-password/&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="blog-card-thumbnail"&gt;&#10; &lt;img src="https://ai.hack-le.com/images/uploads/2024/10/wordpress-app-password.webp" alt="WordPressでアプリパスワードを取得する操作手順" loading="lazy" /&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;</description></item><item><title>WordPressでChart.jsでチャート表示するモック</title><link>https://ai.hack-le.com/wp-chart/</link><pubDate>Tue, 07 Jan 2025 16:37:55 +0900</pubDate><guid>https://ai.hack-le.com/wp-chart/</guid><description>&lt;p&gt;以下に、外部APIからデータを取得し、WordPressに統合してチャートを表示する方法を詳しく説明します。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="手順"&gt;手順&#10;&lt;/h2&gt;&lt;h3 id="ステップ-1-chartjsのスクリプトを読み込む"&gt;ステップ 1: Chart.jsのスクリプトを読み込む&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;functions.php&lt;/code&gt; に以下を追加します：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;enqueue_chartjs_scripts&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;wp_enqueue_script&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;chartjs&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;https://cdn.jsdelivr.net/npm/chart.js&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;add_action&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;wp_enqueue_scripts&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;enqueue_chartjs_scripts&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#10;&lt;h3 id="ステップ-2-カスタムrest-apiエンドポイントを作成"&gt;ステップ 2: カスタムREST APIエンドポイントを作成&#10;&lt;/h3&gt;&lt;p&gt;PHPでREST APIエンドポイントを作成します。これにより、チャート用のデータを提供できます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;register_chart_data_endpoint&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;register_rest_route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;custom/v1&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/chart-data/(?P&amp;lt;id&amp;gt;\d+)&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;methods&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;GET&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;callback&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;get_chart_data&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;));&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;add_action&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;rest_api_init&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;register_chart_data_endpoint&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;get_chart_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$post_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// データ取得 (例: カスタムフィールドからJSONを取得)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$view_history&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;get_post_meta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$post_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;view_history&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// サンプルデータ (実際にはカスタムフィールドや外部APIから取得)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nv"&gt;$view_history&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$view_history&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;json_encode&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;2023-01-01&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;12000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;2023-01-02&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;13000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;2023-01-03&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;14000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;json_decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$view_history&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#10;&lt;h3 id="ステップ-3-記事内でグラフを表示"&gt;ステップ 3: 記事内でグラフを表示&#10;&lt;/h3&gt;&lt;p&gt;記事テンプレート（例: &lt;code&gt;single.php&lt;/code&gt;）やショートコードで、チャートを表示するHTMLとJavaScriptを追加します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;render_chart_shortcode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$atts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$atts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;shortcode_atts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;post_id&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;get_the_ID&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="c1"&gt;// 投稿IDを取得&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nv"&gt;$atts&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;ob_start&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; &amp;lt;canvas id=&amp;#34;lineChart&amp;#34; width=&amp;#34;400&amp;#34; height=&amp;#34;200&amp;#34;&amp;gt;&amp;lt;/canvas&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; &amp;lt;script&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; document.addEventListener(&amp;#39;DOMContentLoaded&amp;#39;, function () {&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; fetch(&amp;#39;&amp;lt;?php echo esc_url(rest_url(&amp;#34;custom/v1/chart-data/&amp;#34; . $atts[&amp;#34;post_id&amp;#34;])); ?&amp;gt;&amp;#39;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; .then(response =&amp;gt; response.json())&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; .then(data =&amp;gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; const labels = Object.keys(data); // 日付&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; const values = Object.values(data); // 再生数&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; const ctx = document.getElementById(&amp;#39;lineChart&amp;#39;).getContext(&amp;#39;2d&amp;#39;);&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; const chartData = {&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; labels: labels,&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; datasets: [{&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; label: &amp;#39;動画再生数&amp;#39;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; data: values,&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; borderColor: &amp;#39;rgba(75, 192, 192, 1)&amp;#39;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; borderWidth: 2,&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; fill: false,&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; }]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; };&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; new Chart(ctx, {&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; type: &amp;#39;line&amp;#39;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; data: chartData,&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; options: {&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; responsive: true,&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; plugins: {&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; legend: {&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; display: true,&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; position: &amp;#39;top&amp;#39;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; },&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; },&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; scales: {&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; x: {&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; title: {&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; display: true,&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; text: &amp;#39;日付&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; },&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; y: {&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; title: {&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; display: true,&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; text: &amp;#39;再生数&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; },&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; beginAtZero: true&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; });&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; })&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; .catch(error =&amp;gt; console.error(&amp;#39;データ取得エラー:&amp;#39;, error));&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; });&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; &amp;lt;/script&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; &amp;lt;?php&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt; return ob_get_clean();&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;add_shortcode(&amp;#39;render_chart&amp;#39;, &amp;#39;render_chart_shortcode&amp;#39;);&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#10;&lt;h2 id="実際の利用"&gt;実際の利用&#10;&lt;/h2&gt;&lt;p&gt;記事や固定ページ内で以下のショートコードを利用：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[render_chart post_id=&amp;#34;123&amp;#34;]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="完成した機能"&gt;完成した機能&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;記事内で時系列データを表示する折れ線グラフを実装。&lt;/li&gt;&#10;&lt;li&gt;REST APIでデータを動的に取得。&lt;/li&gt;&#10;&lt;li&gt;Chart.jsを利用してグラフをレンダリング。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</description></item><item><title>YouTubeチャンネルのRSSフィードURLを取得するPythonスクリプト</title><link>https://ai.hack-le.com/youtube-rss-url-python/</link><pubDate>Fri, 27 Dec 2024 13:57:23 +0900</pubDate><guid>https://ai.hack-le.com/youtube-rss-url-python/</guid><description>&lt;p&gt;この記事では、YouTubeチャンネルのメインチャンネルIDを取得し、それを利用してRSSフィードURLを生成するPythonコードを紹介します。スニペットをコア機能と応用例に分けて解説することで、目的に応じて簡単に再利用できる形を目指します。&lt;/p&gt;&#10;&lt;h2 id="必要なライブラリのインストール"&gt;必要なライブラリのインストール&#10;&lt;/h2&gt;&lt;p&gt;このスクリプトを動作させるには、以下のPythonライブラリが必要です。&lt;/p&gt;&#10;&lt;h3 id="インストールコマンド"&gt;インストールコマンド&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip install requests beautifulsoup4&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;requests&lt;/code&gt;: YouTubeページのHTMLを取得するために使用。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;beautifulsoup4&lt;/code&gt;: HTMLを解析して必要な情報を抽出するために使用。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="コア機能-メインチャンネルidの取得"&gt;コア機能: メインチャンネルIDの取得&#10;&lt;/h2&gt;&lt;p&gt;YouTubeチャンネルのURLからメインチャンネルIDとRSSフィードURLを取得する関数 &lt;code&gt;get_main_channel_info()&lt;/code&gt; を紹介します。この関数を使えば、単一のURLに対して簡単にチャンネル情報を取得できます。&lt;/p&gt;&#10;&lt;h3 id="コードスニペット"&gt;コードスニペット&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;requests&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;bs4&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BeautifulSoup&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;re&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_main_channel_info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;youtube_url&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# HTMLを取得&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;youtube_url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;raise_for_status&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;# ステータスコードのチェック&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;html_content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# BeautifulSoupで解析&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;soup&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BeautifulSoup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;html_content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;html.parser&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# チャンネル名を取得&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;channel_title_tag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;soup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;meta&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;property&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;og:title&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;channel_title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;channel_title_tag&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;content&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;channel_title_tag&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;不明なチャンネル&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# canonicalタグを探す&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;canonical_link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;soup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;link&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;canonical&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;canonical_link&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;href&amp;#39;&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;canonical_link&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;attrs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;canonical_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;canonical_link&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;href&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# channel_idを抽出 (URL内に含まれる場合)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;channel_id_match&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;channel/([^/?&amp;amp;]+)&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;canonical_url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;channel_id_match&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;channel_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;channel_id_match&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;rss_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;https://www.youtube.com/feeds/videos.xml?channel_id=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;channel_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;youtube_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;channel_title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;channel_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rss_url&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 必要な情報が見つからない場合&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;youtube_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;channel_title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;不明なID&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;RSSフィードなし&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;エラー: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;youtube_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;不明なチャンネル&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;エラー&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;エラー&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="使い方"&gt;使い方&#10;&lt;/h3&gt;&lt;p&gt;以下のように呼び出すことで、単一のYouTubeチャンネルURLから情報を取得できます。&lt;/p&gt;&#10;&lt;h4 id="サンプルコード"&gt;サンプルコード&#10;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://www.youtube.com/@GoogleDevelopers&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_main_channel_info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;URL:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;チャンネル名:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;メインチャンネルID:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;RSSフィードURL:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#10;&lt;h2 id="応用例-コマンドライン入力とcsv保存"&gt;応用例: コマンドライン入力とCSV保存&#10;&lt;/h2&gt;&lt;p&gt;複数のYouTubeチャンネルURLをコマンドライン引数で受け取り、情報をCSV形式で保存するプログラムに拡張します。&lt;/p&gt;&#10;&lt;h3 id="コードスニペット-1"&gt;コードスニペット&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;csv&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;sys&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;requests&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;bs4&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BeautifulSoup&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;re&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_main_channel_info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;youtube_url&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# HTMLを取得&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;youtube_url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;raise_for_status&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;# ステータスコードのチェック&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;html_content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# BeautifulSoupで解析&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;soup&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BeautifulSoup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;html_content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;html.parser&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# チャンネル名を取得&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;channel_title_tag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;soup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;meta&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;property&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;og:title&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;channel_title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;channel_title_tag&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;content&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;channel_title_tag&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;不明なチャンネル&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# canonicalタグを探す&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;canonical_link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;soup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;link&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;canonical&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;canonical_link&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;href&amp;#39;&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;canonical_link&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;attrs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;canonical_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;canonical_link&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;href&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# channel_idを抽出 (URL内に含まれる場合)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;channel_id_match&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;channel/([^/?&amp;amp;]+)&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;canonical_url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;channel_id_match&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;channel_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;channel_id_match&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;rss_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;https://www.youtube.com/feeds/videos.xml?channel_id=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;channel_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;youtube_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;channel_title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;channel_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rss_url&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 必要な情報が見つからない場合&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;youtube_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;channel_title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;不明なID&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;RSSフィードなし&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;エラー: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;youtube_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;不明なチャンネル&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;エラー&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;エラー&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;save_to_csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;output_filename&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;youtube_urls&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;output_filename&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;w&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;newline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;csv_file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;writer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;csv_file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# ヘッダー&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;writerow&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;URL&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;チャンネル名&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;メインチャンネルID&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;RSSフィードURL&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 各URLについて情報を取得して書き込み&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;youtube_urls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_main_channel_info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;writerow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# コマンドライン引数の処理&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;使い方: python script.py 出力ファイル名.csv URL1 [URL2 URL3 ...]&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 出力ファイル名とURLリストを取得&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;output_filename&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;youtube_urls&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 情報をCSVに保存&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;save_to_csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;output_filename&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;youtube_urls&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;チャンネル情報が &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;output_filename&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; に保存されました。&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;__main__&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="使い方-1"&gt;使い方&#10;&lt;/h3&gt;&lt;ol&gt;&#10;&lt;li&gt;このコードを &lt;code&gt;youtube_channel_info.py&lt;/code&gt; として保存します。&lt;/li&gt;&#10;&lt;li&gt;コマンドラインから以下のように実行します：&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;python youtube_channel_info.py 出力ファイル名.csv URL1 URL2 URL3 ...&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="例"&gt;例&#10;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;python youtube_channel_info.py channel_info.csv https://www.youtube.com/@GoogleDevelopers&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="実行結果"&gt;実行結果&#10;&lt;/h4&gt;&lt;p&gt;指定したCSVファイルに以下のようなデータが保存されます：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;URL&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;チャンネル名&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;メインチャンネルID&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;RSSフィードURL&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://www.youtube.com/@GoogleDevelopers" target="_blank" rel="noopener"&#10; &gt;https://www.youtube.com/@GoogleDevelopers&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Google Developers&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;UC_x5XG1OV2P6uZZ5FSM9Ttw&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://www.youtube.com/feeds/videos.xml?channel_id=UC_x5XG1OV2P6uZZ5FSM9Ttw" target="_blank" rel="noopener"&#10; &gt;https://www.youtube.com/feeds/videos.xml?channel_id=UC_x5XG1OV2P6uZZ5FSM9Ttw&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="応用例-rssフィードを読み込んで内容を出力する"&gt;応用例: RSSフィードを読み込んで内容を出力する&#10;&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;requests&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;bs4&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BeautifulSoup&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;re&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;feedparser&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;sys&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_main_channel_info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;youtube_url&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;YouTubeのURLからメインチャンネルIDを取得&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# HTMLを取得&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;youtube_url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;raise_for_status&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;# ステータスコードのチェック&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;html_content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# BeautifulSoupで解析&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;soup&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BeautifulSoup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;html_content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;html.parser&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# チャンネル名を取得&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;channel_title_tag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;soup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;meta&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;property&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;og:title&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;channel_title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;channel_title_tag&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;content&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;channel_title_tag&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;不明なチャンネル&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# canonicalタグを探す&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;canonical_link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;soup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;link&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;canonical&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;canonical_link&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;href&amp;#39;&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;canonical_link&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;attrs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;canonical_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;canonical_link&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;href&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# channel_idを抽出&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;channel_id_match&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;channel/([^/?&amp;amp;]+)&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;canonical_url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;channel_id_match&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;channel_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;channel_id_match&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;rss_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;https://www.youtube.com/feeds/videos.xml?channel_id=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;channel_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;channel_title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;channel_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rss_url&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 情報が見つからない場合&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;不明なチャンネル&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;不明なID&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;RSSフィードなし&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;エラー: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;不明なチャンネル&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;エラー&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;エラー&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fetch_and_display_rss_feed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rss_url&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;RSSフィードを取得して表示&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;feed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;feedparser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rss_url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;title&amp;#39;&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;feed&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;feed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;チャンネル名: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;feed&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;feed&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;RSSフィード情報を取得できませんでした。&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;entry&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;feed&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;タイトル: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;リンク: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;公開日時: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;published&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;-&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;エラー: RSSフィードの取得中に問題が発生しました。エラー: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;__main__&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# コマンドライン引数の処理&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;使い方: python script.py &amp;lt;YouTubeチャンネルのURL&amp;gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;youtube_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;channel_title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;channel_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rss_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_main_channel_info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;youtube_url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;チャンネル名: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;channel_title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;チャンネルID: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;channel_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;RSSフィードURL: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;rss_url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;rss_url&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;RSSフィードなし&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;fetch_and_display_rss_feed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rss_url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;使い方&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;python youtube_rss_fetcher.py https://www.youtube.com/@GoogleDevelopers&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="解説"&gt;解説&#10;&lt;/h2&gt;&lt;h3 id="コア機能-get_main_channel_info-の仕組み"&gt;コア機能: get_main_channel_info() の仕組み&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;HTMLの取得&lt;/strong&gt;: &lt;code&gt;requests&lt;/code&gt;ライブラリでYouTubeページのHTMLを取得。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;BeautifulSoupによる解析&lt;/strong&gt;: &lt;code&gt;&amp;lt;meta&amp;gt;&lt;/code&gt;タグからチャンネル名、&lt;code&gt;&amp;lt;link rel=&amp;quot;canonical&amp;quot;&amp;gt;&lt;/code&gt;タグから正しいチャンネルIDを抽出。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;正規表現&lt;/strong&gt;: &lt;code&gt;re.search&lt;/code&gt; を使い、URL内の &lt;code&gt;channel/&lt;/code&gt; に続くチャンネルIDを取得。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="応用例のポイント"&gt;応用例のポイント&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;コマンドライン引数を使用することで、複数のURLに対応。&lt;/li&gt;&#10;&lt;li&gt;CSV形式で保存することで、他のシステムやツールでの再利用性を向上。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="まとめ"&gt;まとめ&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;単一のYouTubeチャンネルの情報を取得する場合は、&lt;code&gt;get_main_channel_info()&lt;/code&gt; を直接呼び出して利用。&lt;/li&gt;&#10;&lt;li&gt;複数のURLを処理し、結果をCSV形式で保存する場合は、コマンドライン引数を利用した応用版コードを活用。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</description></item><item><title>[PHP] WordPress REST APIでアイキャッチ画像を設定する</title><link>https://ai.hack-le.com/wordpress-rest-api-featured-image-php/</link><pubDate>Wed, 09 Oct 2024 22:20:35 +0900</pubDate><guid>https://ai.hack-le.com/wordpress-rest-api-featured-image-php/</guid><description>&lt;p&gt;以下は、WordPress REST API + PHPを使って投稿にアイキャッチ画像（サムネイル）を設定する関数のスニペットです。この技術記事では、APIを通じて画像をアップロードし、投稿にアイキャッチ画像を設定する方法を説明します。&lt;/p&gt;&#10;&lt;h2 id="wordpress-rest-apiでアイキャッチ画像を設定する手順"&gt;WordPress REST APIでアイキャッチ画像を設定する手順&#10;&lt;/h2&gt;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;APIトークンの取得&lt;/strong&gt; WordPress REST APIにアクセスするためには、認証が必要です。以下のように、アプリケーションパスワードを使用して認証トークンを生成します。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// ベーシック認証のためのユーザー名とアプリケーションパスワード&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$username&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;your-username&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$application_password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;your-application-password&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// ベーシック認証用ヘッダーの作成&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;Authorization&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Basic &amp;#39;&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="nx"&gt;base64_encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$username&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;:&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$application_password&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;Content-Type&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;application/json&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;];&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;画像をアップロードする&lt;/strong&gt; 次に、アップロードしたい画像を&lt;code&gt;/wp-json/wp/v2/media&lt;/code&gt;エンドポイントにPOSTリクエストで送信します。以下は、PHPの&lt;code&gt;curl&lt;/code&gt;を使用してファイルをアップロードする例です。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$upload_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;https://example.com/wp-json/wp/v2/media&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// WordPressサイトのURL&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$image_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/path/to/your/image.jpg&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// ローカルの画像パス&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$image_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;file_get_contents&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$image_path&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// ファイルアップロード用のcURLリクエスト&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$ch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;curl_init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$upload_url&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;curl_setopt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$ch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;CURLOPT_POST&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;curl_setopt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$ch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;CURLOPT_RETURNTRANSFER&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;curl_setopt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$ch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;CURLOPT_HTTPHEADER&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;array_merge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;Content-Disposition: attachment; filename=&amp;#34;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="nx"&gt;basename&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$image_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;]));&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;curl_setopt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$ch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;CURLOPT_POSTFIELDS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$image_data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;curl_exec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$ch&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;curl_close&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$ch&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// レスポンスをデコードし、画像IDを取得&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$media&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;json_decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$media_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$media&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;投稿にアイキャッチ画像を設定する&lt;/strong&gt; 画像が正常にアップロードされたら、次にその画像を指定した投稿のアイキャッチ画像として設定します。&lt;code&gt;/wp-json/wp/v2/posts/{post_id}&lt;/code&gt;エンドポイントに&lt;code&gt;POST&lt;/code&gt;リクエストを送信し、&lt;code&gt;featured_media&lt;/code&gt;にアップロードされた画像のIDを指定します。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$post_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;123&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// アイキャッチ画像を設定する投稿のID&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$update_post_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;https://example.com/wp-json/wp/v2/posts/&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$post_id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$post_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;json_encode&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;featured_media&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$media_id&lt;/span&gt; &lt;span class="c1"&gt;// アップロードされた画像のIDを指定&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;]);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 投稿更新用のcURLリクエスト&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$ch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;curl_init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$update_post_url&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;curl_setopt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$ch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;CURLOPT_RETURNTRANSFER&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;curl_setopt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$ch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;CURLOPT_CUSTOMREQUEST&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;POST&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;curl_setopt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$ch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;CURLOPT_HTTPHEADER&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$headers&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;curl_setopt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$ch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;CURLOPT_POSTFIELDS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$post_data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;curl_exec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$ch&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;curl_close&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$ch&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// レスポンス確認&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$updated_post&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;json_decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="実際の使用例"&gt;実際の使用例&#10;&lt;/h3&gt;&lt;p&gt;このスニペットは、PHPを使用してWordPressのREST APIを呼び出し、アイキャッチ画像を投稿に設定するものです。画像アップロード後に取得したメディアIDを、投稿の&lt;code&gt;featured_media&lt;/code&gt;フィールドに設定して、投稿のアイキャッチ画像として反映されます。&lt;/p&gt;&#10;&lt;p&gt;上記のスニペットは、以下のような状況で役立ちます：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;画像をプログラム的に投稿に設定する必要がある場合&lt;/li&gt;&#10;&lt;li&gt;アイキャッチ画像を定期的に変更するバッチ処理やスクリプトを作成する場合&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;このスクリプトは非常に柔軟で、特定のWordPressサイトで認証と画像アップロード、アイキャッチ画像設定を自動化するために活用できます。&lt;/p&gt;&#10;</description></item><item><title>JavaScriptでのスタイルプロパティの直接割り当て方法</title><link>https://ai.hack-le.com/javascript-element-style/</link><pubDate>Wed, 09 Oct 2024 19:15:49 +0900</pubDate><guid>https://ai.hack-le.com/javascript-element-style/</guid><description>&lt;p&gt;Web開発では、要素のスタイルをJavaScriptから動的に変更する必要が生じることがよくあります。JavaScriptを使って要素のスタイルを変更する最も一般的な方法は、DOM API の &lt;code&gt;style&lt;/code&gt; プロパティを利用することです。の記事では、JavaScriptでスタイルを直接割り当てる際のポイントについて解説します。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="elementstyle-とは"&gt;&lt;code&gt;element.style&lt;/code&gt; とは？&#10;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;element.style&lt;/code&gt; は、HTML要素のインラインスタイルを設定・取得するためのプロパティです。CSSのプロパティをJavaScriptで変更する場合、&lt;code&gt;element.style&lt;/code&gt; に対して直接アクセスします。たとえば、&lt;code&gt;div&lt;/code&gt; 要素の背景色を赤にしたい場合、以下のように記述します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;div&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;backgroundColor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;red&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#10;&lt;h2 id="cssのプロパティ名との違い"&gt;CSSのプロパティ名との違い&#10;&lt;/h2&gt;&lt;p&gt;CSSプロパティ名とJavaScriptの &lt;code&gt;style&lt;/code&gt; プロパティで使うプロパティ名は少し異なります。CSSではハイフンで区切られるプロパティ名（例：&lt;code&gt;background-color&lt;/code&gt;）が、JavaScriptではキャメルケース（例：&lt;code&gt;backgroundColor&lt;/code&gt;）に変換されます。これは、JavaScriptのプロパティ名がキャメルケースを使う規則に従っているためです。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;例:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;CSS: &lt;code&gt;background-color&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;JavaScript: &lt;code&gt;backgroundColor&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;div&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;backgroundColor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;blue&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#10;&lt;h2 id="スタイルの直接割り当てと安全性"&gt;スタイルの直接割り当てと安全性&#10;&lt;/h2&gt;&lt;p&gt;次のコードは、要素に複数のスタイルを一度に設定しようとしている例です。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;container&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;div#container&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;text-align: center; background-color: lightgrey;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このコードは一見正しそうに見えますが、&lt;code&gt;element.style&lt;/code&gt; に文字列を代入すると、既存のスタイルがすべて上書きされる可能性があります。また、このように複数のプロパティをまとめて設定するのは推奨されません。&lt;/p&gt;&#10;&lt;h3 id="推奨される方法"&gt;推奨される方法：&#10;&lt;/h3&gt;&lt;p&gt;スタイルプロパティごとに個別に設定することがベストプラクティスです。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;container&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;div#container&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textAlign&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;center&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;backgroundColor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;lightgrey&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この方法なら、他のスタイルが上書きされることなく、新しいスタイルを追加できます。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h3 id="数値プロパティの扱い"&gt;数値プロパティの扱い&#10;&lt;/h3&gt;&lt;p&gt;CSSプロパティには数値を持つものが多くあります。たとえば &lt;code&gt;width&lt;/code&gt; や &lt;code&gt;height&lt;/code&gt; はピクセル単位で指定することが多いですが、数値を直接指定すると正しく動作しません。単位を必ず付与する必要があります。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;img&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;img&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;width&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;150px&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// 正しい設定&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;単位を忘れると、ブラウザはデフォルトの単位を適用しないため、思ったような結果が得られません。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h3 id="複数のスタイルを設定する場合"&gt;複数のスタイルを設定する場合&#10;&lt;/h3&gt;&lt;p&gt;複数のスタイルを一度に設定したい場合、個別に設定する方法もありますが、&lt;code&gt;Object.assign()&lt;/code&gt; を使うと一度にまとめて設定できて便利です。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;img&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;img&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;assign&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;width&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;150px&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;borderRadius&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;50%&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;border&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;1px solid black&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;});&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これにより、既存のスタイルを保持しながら新しいスタイルをまとめて追加できます。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="classlist-を使ったスタイル変更"&gt;&lt;code&gt;classList&lt;/code&gt; を使ったスタイル変更&#10;&lt;/h2&gt;&lt;p&gt;大量のスタイル変更が必要な場合や、条件に応じてスタイルを切り替えたい場合、&lt;code&gt;element.style&lt;/code&gt; ではなく &lt;code&gt;classList&lt;/code&gt; を使用することをおすすめします。&lt;code&gt;classList&lt;/code&gt; を使うと、あらかじめ定義されたクラスを追加・削除することで、より効率的にスタイルを管理できます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;container&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;div#container&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;centered-container&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// CSS ファイル&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// .centered-container {&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// text-align: center;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// background-color: lightgrey;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// }&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#10;&lt;h2 id="結論"&gt;結論&#10;&lt;/h2&gt;&lt;p&gt;JavaScriptを使ってスタイルを直接変更する際には、以下の点に注意しましょう。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;CSSプロパティ名はキャメルケースに変換する。&lt;/li&gt;&#10;&lt;li&gt;スタイルプロパティごとに個別に設定し、&lt;code&gt;element.style&lt;/code&gt; 全体に文字列を代入しない。&lt;/li&gt;&#10;&lt;li&gt;数値プロパティには必ず単位を付ける。&lt;/li&gt;&#10;&lt;li&gt;複数のスタイルを設定する際は &lt;code&gt;Object.assign()&lt;/code&gt; を利用すると効率的。&lt;/li&gt;&#10;&lt;li&gt;多くのスタイル変更が必要な場合は &lt;code&gt;classList&lt;/code&gt; を活用して、CSSクラスでスタイルを管理する。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;これらのポイントを守れば、スタイルの変更が正しく適用され、コードも読みやすく保てるでしょう。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="参考資料"&gt;参考資料&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://developer.mozilla.org/ja/docs/Web/API/HTMLElement/style" target="_blank" rel="noopener"&#10; &gt;MDN Web Docs: HTMLElement.style&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</description></item><item><title>JavaScriptで取得した要素の属性 attributes を更新する方法</title><link>https://ai.hack-le.com/javascript-attributes/</link><pubDate>Wed, 09 Oct 2024 18:21:22 +0900</pubDate><guid>https://ai.hack-le.com/javascript-attributes/</guid><description>&lt;p&gt;JavaScriptでは、DOM要素の属性（&lt;code&gt;attributes&lt;/code&gt;）を簡単に取得・更新することができます。&lt;code&gt;attributes&lt;/code&gt; は、要素の &lt;code&gt;id&lt;/code&gt;、&lt;code&gt;class&lt;/code&gt;、&lt;code&gt;src&lt;/code&gt; などの様々なプロパティを指し、これらを動的に変更することで、ページの挙動や外観をリアルタイムに操作できます。この記事では、属性の取得と更新方法について解説します。&lt;/p&gt;&#10;&lt;h2 id="属性の取得方法"&gt;属性の取得方法&#10;&lt;/h2&gt;&lt;p&gt;要素の属性を取得するには、JavaScriptの &lt;code&gt;getAttribute()&lt;/code&gt; メソッドを使用します。このメソッドは、指定した属性の値を取得します。&lt;/p&gt;&#10;&lt;h3 id="基本的な構文"&gt;基本的な構文&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;attributeName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="例属性を取得する"&gt;例：属性を取得する&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;img&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;exampleImage&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;image.jpg&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;alt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;サンプル画像&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;imageElement&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;exampleImage&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;srcValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;imageElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;src&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;srcValue&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// &amp;#34;image.jpg&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このように、&lt;code&gt;getAttribute()&lt;/code&gt; を使うことで、指定した要素の属性の値を取得できます。&lt;/p&gt;&#10;&lt;h2 id="属性の更新方法"&gt;属性の更新方法&#10;&lt;/h2&gt;&lt;p&gt;要素の属性を更新するには、&lt;code&gt;setAttribute()&lt;/code&gt; メソッドを使用します。これにより、既存の属性を変更したり、新しい属性を追加することができます。&lt;/p&gt;&#10;&lt;h3 id="基本的な構文-1"&gt;基本的な構文&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;attributeName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="例属性を更新する"&gt;例：属性を更新する&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;img&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;exampleImage&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;image.jpg&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;alt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;サンプル画像&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;imageElement&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;exampleImage&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 画像のsrcを変更&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;imageElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;src&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;newImage.png&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;imageElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;src&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// &amp;#34;newImage.png&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上記の例では、画像の &lt;code&gt;src&lt;/code&gt; 属性を新しい画像ファイルに変更しています。&lt;/p&gt;&#10;&lt;h2 id="属性の削除"&gt;属性の削除&#10;&lt;/h2&gt;&lt;p&gt;不要になった属性を削除したい場合は、&lt;code&gt;removeAttribute()&lt;/code&gt; メソッドを使います。これにより、指定した属性を完全に削除することができます。&lt;/p&gt;&#10;&lt;h3 id="基本的な構文-2"&gt;基本的な構文&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;removeAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;attributeName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="例属性を削除する"&gt;例：属性を削除する&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;img&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;exampleImage&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;image.jpg&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;alt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;サンプル画像&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;imageElement&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;exampleImage&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// alt属性を削除&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;imageElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;removeAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;alt&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;imageElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;alt&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// null&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;removeAttribute()&lt;/code&gt; を使用することで、指定した属性が完全に削除され、&lt;code&gt;getAttribute()&lt;/code&gt; で取得しようとしても &lt;code&gt;null&lt;/code&gt; が返されます。&lt;/p&gt;&#10;&lt;h2 id="クラス属性の操作"&gt;クラス属性の操作&#10;&lt;/h2&gt;&lt;p&gt;特に &lt;code&gt;class&lt;/code&gt; 属性は頻繁に操作されるため、&lt;code&gt;classList&lt;/code&gt; プロパティを使用してより簡単に操作できます。これにより、クラスの追加、削除、切り替え（toggle）などが可能です。&lt;/p&gt;&#10;&lt;h3 id="クラスを追加する"&gt;クラスを追加する&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;element&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;example&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;new-class&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="クラスを削除する"&gt;クラスを削除する&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;old-class&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="クラスを切り替えるtoggle"&gt;クラスを切り替える（toggle）&#10;&lt;/h3&gt;&lt;p&gt;クラスの有無によって、追加または削除を自動的に切り替えることができます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;toggle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;active&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="データ属性の操作"&gt;データ属性の操作&#10;&lt;/h2&gt;&lt;p&gt;HTML5で導入された &lt;code&gt;data-*&lt;/code&gt; 属性は、カスタムデータを要素に保持させるために使用します。これも、&lt;code&gt;getAttribute()&lt;/code&gt; や &lt;code&gt;setAttribute()&lt;/code&gt; で操作できますが、&lt;code&gt;dataset&lt;/code&gt; プロパティを使うことでより簡単に扱えます。&lt;/p&gt;&#10;&lt;h3 id="例データ属性の取得と設定"&gt;例：データ属性の取得と設定&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;example&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;data-user-id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;123&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;data-role&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;admin&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;ユーザー情報&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;element&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;example&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// データ属性を取得&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;userId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// &amp;#34;123&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// データ属性を更新&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;role&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;user&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;role&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// &amp;#34;user&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="応用例フォームの入力フィールドを動的に操作"&gt;応用例：フォームの入力フィールドを動的に操作&#10;&lt;/h2&gt;&lt;p&gt;以下の例では、フォーム内の入力フィールドの &lt;code&gt;required&lt;/code&gt; 属性を動的に追加・削除するシンプルな例を紹介します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;label&lt;/span&gt; &lt;span class="na"&gt;for&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;email&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Email:&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;label&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;email&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;email&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;button&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;onclick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;toggleRequired()&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;必須切り替え&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;toggleRequired&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;emailInput&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;email&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;emailInput&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hasAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;required&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;emailInput&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;removeAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;required&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;emailInput&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;required&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;required&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ボタンをクリックすることで、&lt;code&gt;required&lt;/code&gt; 属性が追加されたり、削除されたりします。&lt;code&gt;hasAttribute()&lt;/code&gt; を使うことで、属性が既に存在するかどうかを確認し、条件に応じて処理を切り替えています。&lt;/p&gt;&#10;&lt;h2 id="結論"&gt;結論&#10;&lt;/h2&gt;&lt;p&gt;JavaScriptを使って、HTML要素の属性を取得・更新・削除する方法を理解することで、動的なWebページの操作が可能になります。&lt;code&gt;setAttribute()&lt;/code&gt; や &lt;code&gt;getAttribute()&lt;/code&gt; を使用した基本的な操作に加え、&lt;code&gt;classList&lt;/code&gt; や &lt;code&gt;dataset&lt;/code&gt; を活用することで、効率的にDOMを操作できるようになります。これらのメソッドを適切に使い分けることで、より柔軟でインタラクティブなユーザー体験を実現できるでしょう。&lt;/p&gt;&#10;</description></item><item><title>JavaScriptの innerText とその使い方</title><link>https://ai.hack-le.com/javascript%E3%81%AE-innertext-%E3%81%A8%E3%81%9D%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9/</link><pubDate>Wed, 09 Oct 2024 18:08:16 +0900</pubDate><guid>https://ai.hack-le.com/javascript%E3%81%AE-innertext-%E3%81%A8%E3%81%9D%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9/</guid><description>&lt;p&gt;&lt;code&gt;innerText&lt;/code&gt; は、JavaScriptでDOM要素のテキストを操作する際に使われるプロパティです。&lt;code&gt;innerHTML&lt;/code&gt; とよく似ていますが、テキストのみを扱いたい場合には &lt;code&gt;innerText&lt;/code&gt; を使用するのが適しています。この記事では、&lt;code&gt;innerText&lt;/code&gt; の使い方と注意点を説明します。&lt;/p&gt;&#10;&lt;h2 id="innertext-とは"&gt;&lt;code&gt;innerText&lt;/code&gt; とは？&#10;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;innerText&lt;/code&gt; は、HTML要素の&lt;strong&gt;表示されているテキスト&lt;/strong&gt;を取得したり、設定するためのプロパティです。&lt;code&gt;innerText&lt;/code&gt; を使うと、タグやHTML構造を無視して、純粋にテキストだけを扱うことができます。&lt;/p&gt;&#10;&lt;h3 id="基本的な使い方"&gt;基本的な使い方&#10;&lt;/h3&gt;&lt;h4 id="テキストの取得"&gt;テキストの取得&#10;&lt;/h4&gt;&lt;p&gt;&lt;code&gt;innerText&lt;/code&gt; プロパティを使用すると、指定した要素内に含まれているテキストを取得することができます。&lt;/p&gt;&#10;&lt;h4 id="例要素内のテキストを取得"&gt;例：要素内のテキストを取得&#10;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;example&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;こんにちは、世界！&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;let element = document.getElementById(&amp;#39;example&amp;#39;);&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;console.log(element.innerText); // &amp;#34;こんにちは、世界！&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="テキストの設定"&gt;テキストの設定&#10;&lt;/h4&gt;&lt;p&gt;&lt;code&gt;innerText&lt;/code&gt; を使って、要素内のテキストを変更することもできます。&lt;/p&gt;&#10;&lt;h4 id="例要素内のテキストを変更"&gt;例：要素内のテキストを変更&#10;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;example&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;こんにちは、世界！&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;element&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;example&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;新しいテキストです！&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerText&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// &amp;#34;新しいテキストです！&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="innertext-と-innerhtml-の違い"&gt;&lt;code&gt;innerText&lt;/code&gt; と &lt;code&gt;innerHTML&lt;/code&gt; の違い&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;innerText&lt;/code&gt; は要素内のテキストのみを扱いますが、&lt;code&gt;innerHTML&lt;/code&gt; は要素内のHTML全体（タグを含む）を操作します。例えば、HTML構造を維持したい場合やタグを扱う必要がある場合には、&lt;code&gt;innerHTML&lt;/code&gt; を使用します。&lt;/p&gt;&#10;&lt;h4 id="例innertext-と-innerhtml-の違い"&gt;例：&lt;code&gt;innerText&lt;/code&gt; と &lt;code&gt;innerHTML&lt;/code&gt; の違い&#10;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;example&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;strong&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;太字のテキスト&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;strong&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;element&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;example&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// innerTextはテキストのみ取得&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerText&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// &amp;#34;太字のテキスト&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// innerHTMLはHTML構造も含めて取得&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// &amp;#34;&amp;lt;strong&amp;gt;太字のテキスト&amp;lt;/strong&amp;gt;&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="innertext-の注意点"&gt;&lt;code&gt;innerText&lt;/code&gt; の注意点&#10;&lt;/h3&gt;&lt;h4 id="見えない要素の扱い"&gt;見えない要素の扱い&#10;&lt;/h4&gt;&lt;p&gt;&lt;code&gt;innerText&lt;/code&gt; は、CSSで &lt;code&gt;display: none;&lt;/code&gt; や &lt;code&gt;visibility: hidden;&lt;/code&gt; が設定されている要素のテキストを無視します。つまり、表示されているテキストだけが取得対象となります。&lt;/p&gt;&#10;&lt;h4 id="改行や空白の扱い"&gt;改行や空白の扱い&#10;&lt;/h4&gt;&lt;p&gt;&lt;code&gt;innerText&lt;/code&gt; は、要素内のテキストを取得する際に、ブラウザに表示されている通りに改行や空白を維持します。一方、&lt;code&gt;innerHTML&lt;/code&gt; ではHTML内の改行や空白がそのまま扱われるため、異なる結果になることがあります。&lt;/p&gt;&#10;&lt;h4 id="例改行の扱い"&gt;例：改行の扱い&#10;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;example&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 1行目&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;br&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 2行目&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;element&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;example&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerText&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// &amp;#34;1行目\n2行目&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// &amp;#34;1行目&amp;lt;br&amp;gt;2行目&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="応用例"&gt;応用例&#10;&lt;/h3&gt;&lt;h4 id="フォーム入力内容の確認"&gt;フォーム入力内容の確認&#10;&lt;/h4&gt;&lt;p&gt;&lt;code&gt;innerText&lt;/code&gt; を使うと、ユーザーが入力したテキストを画面に表示する場合などに便利です。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;text&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;inputText&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;テキストを入力してください&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;onclick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;showText()&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;表示&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;displayText&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;showText&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;input&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;inputText&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;display&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;displayText&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;display&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上記の例では、ボタンをクリックすると入力されたテキストが &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt; 要素内に表示されます。&lt;/p&gt;&#10;&lt;h2 id="結論"&gt;結論&#10;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;innerText&lt;/code&gt; は、HTML要素内のテキストを簡単に取得・変更できる便利なプロパティです。テキストのみを操作したい場合に使い、HTML構造を扱う際には &lt;code&gt;innerHTML&lt;/code&gt; を選ぶと良いでしょう。表示されているテキストだけを取り扱う場合や、改行や空白をそのまま保持したい場合に特に有効です。&lt;/p&gt;&#10;</description></item><item><title>JavaScriptの querySelector とその使い方</title><link>https://ai.hack-le.com/javascript-queryselector/</link><pubDate>Wed, 09 Oct 2024 17:38:17 +0900</pubDate><guid>https://ai.hack-le.com/javascript-queryselector/</guid><description>&lt;p&gt;JavaScriptの &lt;code&gt;querySelector&lt;/code&gt; は、CSSセレクタを使ってHTML要素を取得できる非常に便利なメソッドです。DOM操作の際に頻繁に使われるため、しっかりと理解しておくと、開発効率が向上します。この記事では、基本的な使い方から応用までをまとめて紹介します。&lt;/p&gt;&#10;&lt;h2 id="queryselector-の基本"&gt;&lt;code&gt;querySelector&lt;/code&gt; の基本&#10;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;querySelector&lt;/code&gt; は、HTMLドキュメント内で指定したCSSセレクタに一致する最初の要素を返します。これは、CSSセレクタを使ってDOMの特定の要素を簡単に取得できる便利なメソッドです。&lt;/p&gt;&#10;&lt;h3 id="基本的な構文"&gt;基本的な構文：&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;element&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="引数-selector"&gt;引数 &lt;code&gt;selector&lt;/code&gt;&#10;&lt;/h4&gt;&lt;p&gt;&lt;code&gt;querySelector&lt;/code&gt; の引数として指定する &lt;code&gt;selector&lt;/code&gt; は、CSSセレクタと同じ形式で記述します。例えば、クラス名、ID、タグ名などを指定できます。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;クラスを選択する場合：&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;element&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;.classname&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;IDを選択する場合：&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;element&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;#idname&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;タグ名を選択する場合：&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;element&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;div&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="例特定の要素を取得する"&gt;例：特定の要素を取得する&#10;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;container&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt; &lt;span class="kr"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;text&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;最初の段落&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;/p&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt; &lt;span class="kr"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;text&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="nx"&gt;番目の段落&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;/p&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;/div&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// IDが &amp;#39;container&amp;#39; の要素を取得&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;container&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;#container&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// クラスが &amp;#39;text&amp;#39; の最初の段落要素を取得&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;firstParagraph&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;.text&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;firstParagraph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// &amp;#34;最初の段落&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このように、 &lt;code&gt;querySelector&lt;/code&gt; はCSSのセレクタと同じ形式で指定するため、CSSの知識があれば簡単に理解できます。&lt;/p&gt;&#10;&lt;h2 id="応用複数のセレクタを使用する"&gt;応用：複数のセレクタを使用する&#10;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;querySelector&lt;/code&gt; は、複数のCSSセレクタをカンマで区切って指定することもできます。この場合、いずれかのセレクタに一致する最初の要素が返されます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;element&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;p.text, .highlight, #unique&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上記の例では、最初に一致した段落、ハイライトされた要素、またはIDが &lt;code&gt;unique&lt;/code&gt; の要素が取得されます。&lt;/p&gt;&#10;&lt;h2 id="要素が存在しない場合の処理"&gt;要素が存在しない場合の処理&#10;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;querySelector&lt;/code&gt; が一致する要素を見つけられない場合、&lt;code&gt;null&lt;/code&gt; が返されます。そのため、要素が存在するかどうかを確認するために、&lt;code&gt;null&lt;/code&gt; チェックを行う必要があります。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;element&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;.not-exist&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;要素が存在します。&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;要素が存在しません。&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="queryselectorall-との違い"&gt;&lt;code&gt;querySelectorAll&lt;/code&gt; との違い&#10;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;querySelector&lt;/code&gt; は最初に一致した1つの要素のみを返しますが、複数の要素を取得したい場合は &lt;code&gt;querySelectorAll&lt;/code&gt; を使います。&lt;code&gt;querySelectorAll&lt;/code&gt; は、指定したセレクタに一致するすべての要素を返し、返り値は &lt;code&gt;NodeList&lt;/code&gt; という配列のようなオブジェクトです。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;allParagraphs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelectorAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;p.text&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;allParagraphs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;paragraph&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;paragraph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;});&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="結論"&gt;結論&#10;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;querySelector&lt;/code&gt; は、シンプルでパワフルなDOM要素選択メソッドです。CSSセレクタと同じ構文を使うため、CSSの知識があればスムーズに利用できます。さらに、複数の要素を取得したい場合は、 &lt;code&gt;querySelectorAll&lt;/code&gt; を活用することで、効率的にDOM操作を行うことができます。&lt;/p&gt;&#10;</description></item><item><title>JavaScript: スプレッド構文によるオブジェクトのコピー、マージ、上書きなど</title><link>https://ai.hack-le.com/javascript-spread-object/</link><pubDate>Sun, 06 Oct 2024 17:55:24 +0900</pubDate><guid>https://ai.hack-le.com/javascript-spread-object/</guid><description>&lt;p&gt;以下に、JavaScriptのスプレッド構文（Spread Operator）を使ったオブジェクト操作についての技術記事を記述します。備忘録として使えるように、基本的な使い方から応用までカバーしています。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="javascriptのスプレッド構文を使ったオブジェクト操作"&gt;JavaScriptのスプレッド構文を使ったオブジェクト操作&#10;&lt;/h2&gt;&lt;h3 id="スプレッド構文とは"&gt;スプレッド構文とは？&#10;&lt;/h3&gt;&lt;p&gt;スプレッド構文（&lt;code&gt;...&lt;/code&gt;）は、ES6（ECMAScript 2015）で導入された機能で、配列やオブジェクトを展開（スプレッド）して、新しい配列やオブジェクトを生成することができます。主に「展開」「コピー」「マージ」の操作を効率的に行うことができるため、使い勝手の良い構文です。&lt;/p&gt;&#10;&lt;p&gt;この記事では、スプレッド構文を使ったオブジェクトの操作に焦点を当てます。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h3 id="基本構文"&gt;基本構文&#10;&lt;/h3&gt;&lt;p&gt;オブジェクトのスプレッド構文は、オブジェクトのキーと値のペアを新しいオブジェクトに展開する際に使用します。以下はその基本的な例です。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;original&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Alice&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// スプレッド構文で新しいオブジェクトを作成&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;copy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;original&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// { name: &amp;#39;Alice&amp;#39;, age: 25 }&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;original&lt;/code&gt; オブジェクトをスプレッド構文で展開し、新しいオブジェクト &lt;code&gt;copy&lt;/code&gt; を生成しています。この操作は浅いコピー（shallow copy）であり、ネストされたオブジェクトは参照渡しされます。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h3 id="オブジェクトのマージ"&gt;オブジェクトのマージ&#10;&lt;/h3&gt;&lt;p&gt;スプレッド構文は、複数のオブジェクトを1つにマージする際にも便利です。スプレッド構文で展開する順番によって、プロパティが上書きされることがあります。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Alice&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;details&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;city&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;New York&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// オブジェクトのマージ&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;merged&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;details&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;merged&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// { name: &amp;#39;Alice&amp;#39;, age: 30, city: &amp;#39;New York&amp;#39; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この例では、&lt;code&gt;user&lt;/code&gt; と &lt;code&gt;details&lt;/code&gt; オブジェクトがマージされています。マージの際に &lt;code&gt;age&lt;/code&gt; プロパティは &lt;code&gt;details&lt;/code&gt; オブジェクトの値で上書きされ、&lt;code&gt;merged&lt;/code&gt; オブジェクトには &lt;code&gt;age: 30&lt;/code&gt; として格納されます。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;上書きのルール&lt;/strong&gt;:&lt;br&gt;&#10;スプレッド構文でマージする際、同じキーを持つプロパティがあった場合は、右側にあるオブジェクトのプロパティで上書きされます。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h3 id="新しいプロパティの追加"&gt;新しいプロパティの追加&#10;&lt;/h3&gt;&lt;p&gt;オブジェクトのスプレッド構文は、新しいプロパティを追加する際にも使えます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;original&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Alice&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 新しいプロパティを追加&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;updated&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;original&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;city&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;New York&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;updated&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// { name: &amp;#39;Alice&amp;#39;, age: 25, city: &amp;#39;New York&amp;#39; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このように、&lt;code&gt;original&lt;/code&gt; オブジェクトに &lt;code&gt;city&lt;/code&gt; プロパティを追加して、新しいオブジェクト &lt;code&gt;updated&lt;/code&gt; を生成しています。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h3 id="ネストされたオブジェクトのコピー"&gt;ネストされたオブジェクトのコピー&#10;&lt;/h3&gt;&lt;p&gt;スプレッド構文は浅いコピー（shallow copy）であるため、ネストされたオブジェクトがある場合は注意が必要です。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;original&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Alice&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;city&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;New York&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;zip&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;10001&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 浅いコピー&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;copy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;original&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// ネストされたオブジェクトを変更&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;city&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;San Francisco&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;original&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;city&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// &amp;#39;San Francisco&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この例では、&lt;code&gt;original&lt;/code&gt; と &lt;code&gt;copy&lt;/code&gt; は異なるオブジェクトですが、&lt;code&gt;address&lt;/code&gt; プロパティは参照渡しされているため、&lt;code&gt;copy&lt;/code&gt; の &lt;code&gt;address.city&lt;/code&gt; を変更すると、&lt;code&gt;original&lt;/code&gt; の &lt;code&gt;address.city&lt;/code&gt; も変更されます。ネストされたオブジェクトを完全にコピーしたい場合は、ディープコピー（deep copy）を行う必要があります。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;ディープコピーの例&lt;/strong&gt;:&lt;br&gt;&#10;ディープコピーは&lt;code&gt;JSON.parse&lt;/code&gt;/&lt;code&gt;JSON.stringify&lt;/code&gt;を使う方法や&lt;code&gt;lodash&lt;/code&gt;の&lt;code&gt;cloneDeep&lt;/code&gt;メソッドを使うなどの方法があります。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// JSON.parse/JSON.stringifyを使ったディープコピー&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;deepCopy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;original&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// deepCopyを変更してもoriginalには影響しない&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;deepCopy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;city&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;San Francisco&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;original&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;city&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// &amp;#39;New York&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#10;&lt;h3 id="スプレッド構文の応用例"&gt;スプレッド構文の応用例&#10;&lt;/h3&gt;&lt;h4 id="条件付きプロパティの追加"&gt;条件付きプロパティの追加&#10;&lt;/h4&gt;&lt;p&gt;プロパティを条件に基づいてオブジェクトに追加したい場合、スプレッド構文と条件式を組み合わせることで実現できます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;baseObject&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Alice&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isMember&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// isMemberがtrueの場合のみ、roleプロパティを追加&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;updatedObject&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;baseObject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;...(&lt;/span&gt;&lt;span class="nx"&gt;isMember&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;role&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Member&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;updatedObject&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// { name: &amp;#39;Alice&amp;#39;, age: 25, role: &amp;#39;Member&amp;#39; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この例では、&lt;code&gt;isMember&lt;/code&gt; が &lt;code&gt;true&lt;/code&gt; のときだけ &lt;code&gt;role&lt;/code&gt; プロパティが追加されます。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h3 id="まとめ"&gt;まとめ&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;スプレッド構文でのコピー&lt;/strong&gt;: オブジェクトを展開して浅いコピーを作成できる。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;オブジェクトのマージ&lt;/strong&gt;: 複数のオブジェクトを簡単に1つにまとめることができる。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;新しいプロパティの追加&lt;/strong&gt;: スプレッド構文を使って新しいプロパティを追加しながらオブジェクトを作成できる。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;ネストされたオブジェクトの注意点&lt;/strong&gt;: 浅いコピーであるため、ネストされたオブジェクトは参照渡しになる。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;条件付きプロパティの追加&lt;/strong&gt;: 条件に基づいてプロパティを追加することも可能。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;スプレッド構文を使うと、オブジェクトの操作が簡潔に書けるため、JavaScriptのコードをより読みやすく保ちやすくなります。オブジェクトのマージ、プロパティの追加、コピーなどの操作を効率化する際には、ぜひ活用してみてください。&lt;/p&gt;&#10;</description></item><item><title>CSSのremとemの違いと使い分けのポイント</title><link>https://ai.hack-le.com/css-rem-em/</link><pubDate>Sun, 15 Sep 2024 15:49:32 +0900</pubDate><guid>https://ai.hack-le.com/css-rem-em/</guid><description>&lt;p&gt;CSS のレイアウト設計で使われる相対的な単位として、&lt;code&gt;rem&lt;/code&gt; と &lt;code&gt;em&lt;/code&gt; があります。これらは要素のフォントサイズや幅、高さなどを相対的に指定するための便利なツールですが、どちらを使うべきか迷うことがよくあります。本記事では、&lt;code&gt;rem&lt;/code&gt; と &lt;code&gt;em&lt;/code&gt; の違いと、それぞれの使い分けについて解説します。&lt;/p&gt;&#10;&lt;h2 id="emとは"&gt;&lt;code&gt;em&lt;/code&gt;とは？&#10;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;em&lt;/code&gt; は、&lt;strong&gt;親要素のフォントサイズ&lt;/strong&gt;を基準とした相対単位です。親要素のフォントサイズが変更されると、それに従って &lt;code&gt;em&lt;/code&gt; で指定された要素のサイズも変わります。&lt;/p&gt;&#10;&lt;h3 id="例"&gt;例:&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.parent {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; font-size: 16px;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.child {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; font-size: 1.5em; /* 親の 16px × 1.5 = 24px */&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この場合、&lt;code&gt;.child&lt;/code&gt; のフォントサイズは親要素のフォントサイズが基準となるため、24px になります。&lt;code&gt;em&lt;/code&gt; の特徴は、ネストされた要素が親要素の影響を受ける点にあります。&lt;/p&gt;&#10;&lt;h2 id="remとは"&gt;&lt;code&gt;rem&lt;/code&gt;とは？&#10;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;rem&lt;/code&gt; は、&lt;strong&gt;ルート要素（&lt;code&gt;html&lt;/code&gt;）のフォントサイズ&lt;/strong&gt;を基準とした相対単位です。通常、ブラウザのデフォルトのフォントサイズは &lt;code&gt;16px&lt;/code&gt; なので、特に指定がなければ &lt;code&gt;1rem&lt;/code&gt; は &lt;code&gt;16px&lt;/code&gt; に相当します。&lt;/p&gt;&#10;&lt;h3 id="例-1"&gt;例:&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;html {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; font-size: 16px;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.child {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; font-size: 1.5rem; /* 16px × 1.5 = 24px */&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;rem&lt;/code&gt; の大きな利点は、親要素に依存せず、一貫したサイズを保てる点です。これにより、ページ全体のデザインやフォントサイズを統一したい場合に役立ちます。&lt;/p&gt;&#10;&lt;h2 id="em-と-rem-の違い"&gt;&lt;code&gt;em&lt;/code&gt; と &lt;code&gt;rem&lt;/code&gt; の違い&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;&lt;code&gt;em&lt;/code&gt;&lt;/strong&gt; : 親要素のフォントサイズを基準にしているため、親要素が異なればサイズも変わります。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;&lt;code&gt;rem&lt;/code&gt;&lt;/strong&gt; : 常にルート要素（&lt;code&gt;html&lt;/code&gt;）のフォントサイズを基準にしているため、ページ全体で一貫したサイズが得られます。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="違いの例"&gt;違いの例&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;html {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; font-size: 16px;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.parent {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; font-size: 20px;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.child-em {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; font-size: 2em; /* 20px × 2 = 40px */&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.child-rem {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; font-size: 2rem; /* 16px × 2 = 32px */&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この例では、&lt;code&gt;child-em&lt;/code&gt; は &lt;code&gt;40px&lt;/code&gt; になり、&lt;code&gt;child-rem&lt;/code&gt; は &lt;code&gt;32px&lt;/code&gt; になります。&lt;code&gt;em&lt;/code&gt; は親要素の影響を受けるため、サイズが異なります。&lt;/p&gt;&#10;&lt;h2 id="使い分けのポイント"&gt;使い分けのポイント&#10;&lt;/h2&gt;&lt;h3 id="1-一貫したサイズを保ちたい場合は-rem-を使う"&gt;1. 一貫したサイズを保ちたい場合は &lt;code&gt;rem&lt;/code&gt; を使う&#10;&lt;/h3&gt;&lt;p&gt;レスポンシブデザインや、サイト全体で統一されたフォントサイズを維持したい場合は、&lt;code&gt;rem&lt;/code&gt; を使うのが推奨されます。ルート要素のフォントサイズを基準にしているため、ページ全体のバランスが崩れにくいです。&lt;/p&gt;&#10;&lt;h3 id="2-コンテキストに応じて柔軟にサイズを変えたい場合は-em-を使う"&gt;2. コンテキストに応じて柔軟にサイズを変えたい場合は &lt;code&gt;em&lt;/code&gt; を使う&#10;&lt;/h3&gt;&lt;p&gt;特定の親要素内で相対的にサイズを変えたい場合は、&lt;code&gt;em&lt;/code&gt; が便利です。例えば、カードコンポーネントやボタンのサイズが親要素に応じて拡大・縮小されるようなデザインを実現するのに役立ちます。&lt;/p&gt;&#10;&lt;h3 id="3-入れ子が深くなるときは-em-の注意が必要"&gt;3. 入れ子が深くなるときは &lt;code&gt;em&lt;/code&gt; の注意が必要&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;em&lt;/code&gt; は親要素のサイズに依存するため、要素が入れ子になりすぎると、意図せずサイズが大きくなったり小さくなったりすることがあります。そのため、入れ子が深いデザインには &lt;code&gt;rem&lt;/code&gt; の方が扱いやすいことが多いです。&lt;/p&gt;&#10;&lt;h2 id="結論推奨されるのはどっち"&gt;結論：推奨されるのはどっち？&#10;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;一貫性を重視する場合は &lt;code&gt;rem&lt;/code&gt; を推奨&lt;/strong&gt; します。特にフォントサイズや幅、高さを全体的に管理したい場合には、&lt;code&gt;rem&lt;/code&gt; が適しており、予期しないサイズの変更を避けられます。一方で、特定のコンポーネントごとに柔軟にサイズを変更したい場合には &lt;code&gt;em&lt;/code&gt; を使うのが良いでしょう。&lt;/p&gt;&#10;</description></item><item><title>HTML 要素に対して奇数回目と偶数回目で異なるスタイルを適用する方法</title><link>https://ai.hack-le.com/css-nth-child/</link><pubDate>Fri, 13 Sep 2024 17:08:43 +0900</pubDate><guid>https://ai.hack-le.com/css-nth-child/</guid><description>&lt;p&gt;HTML では、同じクラスを持つ複数の要素に対して、それぞれの要素の表示順に応じたスタイルを適用したい場合があります。たとえば、奇数番目の要素と偶数番目の要素に異なるスタイルを適用する場合、CSS の疑似クラスを使うことで簡単に実現できます。本記事では、その具体的な方法を紹介します。&lt;/p&gt;&#10;&lt;h2 id="疑似クラス-nth-child-の基本"&gt;疑似クラス &lt;code&gt;:nth-child()&lt;/code&gt; の基本&#10;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;nth-child()&lt;/code&gt; は、要素の表示順に応じてスタイルを適用するための強力な疑似クラスです。&lt;code&gt;nth-child()&lt;/code&gt; の引数には数字やキーワードを指定でき、要素の順序に基づいて異なるスタイルを簡単に適用することができます。&lt;/p&gt;&#10;&lt;h3 id="nth-childodd-と-nth-childeven"&gt;&lt;code&gt;nth-child(odd)&lt;/code&gt; と &lt;code&gt;nth-child(even)&lt;/code&gt;&#10;&lt;/h3&gt;&lt;p&gt;最も基本的な使用方法として、奇数番目の要素と偶数番目の要素に対してスタイルを適用する方法があります。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;nth-child(odd)&lt;/code&gt; は奇数番目の要素にスタイルを適用します。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;nth-child(even)&lt;/code&gt; は偶数番目の要素にスタイルを適用します。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;これにより、例えばリストや段落などの繰り返し要素に、交互に異なる背景色をつけることができます。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="実装例"&gt;実装例&#10;&lt;/h2&gt;&lt;p&gt;以下は、複数の &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; 要素に対して、奇数回目と偶数回目の要素に異なる背景色を適用する例です。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;html&lt;/span&gt; &lt;span class="na"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ja&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;head&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;meta&lt;/span&gt; &lt;span class="na"&gt;charset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;UTF-8&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;meta&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;viewport&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;width=device-width, initial-scale=1.0&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;title&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;奇数と偶数のスタイル適用&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;title&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;style&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c"&gt;/* 奇数番目の要素に適用 */&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;example&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;nth-child&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;odd&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;lightblue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c"&gt;/* 偶数番目の要素に適用 */&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;example&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;nth-child&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;even&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;lightgreen&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c"&gt;/* 各要素のサイズとマージンを指定 */&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;example&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;style&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;head&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;example&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;1つ目の要素&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;example&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;2つ目の要素&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;example&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;3つ目の要素&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;example&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;4つ目の要素&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;example&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;5つ目の要素&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;example&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;6つ目の要素&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;html&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;解説&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;.example:nth-child(odd)&lt;/code&gt;：奇数番目の要素に &lt;code&gt;lightblue&lt;/code&gt; の背景色を適用しています。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;.example:nth-child(even)&lt;/code&gt;：偶数番目の要素に &lt;code&gt;lightgreen&lt;/code&gt; の背景色を適用しています。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;nth-child()&lt;/code&gt; は親要素の中での順序に基づくため、同じクラスを持つ要素であれば、順番通りにスタイルが適用されます。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="より柔軟な-nth-child-の使い方"&gt;より柔軟な &lt;code&gt;nth-child()&lt;/code&gt; の使い方&#10;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;nth-child()&lt;/code&gt; の引数は、奇数や偶数だけでなく、特定のパターンにも対応しています。たとえば、「3番目ごと」や「2つおき」など、柔軟に指定することができます。&lt;/p&gt;&#10;&lt;h3 id="nth-childn-の使用"&gt;&lt;code&gt;nth-child(n)&lt;/code&gt; の使用&#10;&lt;/h3&gt;&lt;p&gt;以下は、3つおきにスタイルを適用する例です。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.example:nth-child(3n) {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; background-color: pink;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このように、&lt;code&gt;3n&lt;/code&gt; を指定すると、3の倍数の順番の要素にスタイルを適用できます。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="疑似クラスの注意点"&gt;疑似クラスの注意点&#10;&lt;/h2&gt;&lt;h3 id="親要素との関係"&gt;親要素との関係&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;nth-child()&lt;/code&gt; は、要素の&lt;strong&gt;親要素&lt;/strong&gt;内での順番に基づいてスタイルを適用します。そのため、親要素が異なる場合や、他の兄弟要素がある場合は意図しない結果になることがあります。たとえば、次のように他のクラスの要素が間に入ると、その影響を受けます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;div class=&amp;#34;container&amp;#34;&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;lt;div class=&amp;#34;example&amp;#34;&amp;gt;1つ目&amp;lt;/div&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;lt;div&amp;gt;他の要素&amp;lt;/div&amp;gt; &amp;lt;!-- この要素が順序に影響 --&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;lt;div class=&amp;#34;example&amp;#34;&amp;gt;2つ目&amp;lt;/div&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;/div&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この場合、&lt;code&gt;2つ目&lt;/code&gt; の要素は &lt;code&gt;.example:nth-child(even)&lt;/code&gt; のスタイルが適用されることはなく、&lt;code&gt;odd&lt;/code&gt; 扱いになります。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="まとめ"&gt;まとめ&#10;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;nth-child()&lt;/code&gt; を使うことで、HTML の要素に対して奇数番目・偶数番目に異なるスタイルを適用することができます。特にリストや複数の要素が繰り返し表示される場面で、交互に背景色を変えるなどのスタイリングに非常に便利です。また、&lt;code&gt;nth-child()&lt;/code&gt; の柔軟な指定方法を活用すれば、さらに複雑なパターンにも対応できるため、Web デザインをより洗練されたものにすることができます。&lt;/p&gt;&#10;</description></item><item><title>CSSの基礎: フレックスボックスでのレイアウト</title><link>https://ai.hack-le.com/css-flex/</link><pubDate>Fri, 29 Mar 2024 23:48:00 +0900</pubDate><guid>https://ai.hack-le.com/css-flex/</guid><description>&lt;p&gt;自分がCSS勉強するためにChatGPTにアウトライン作らせて書かせたものの一部です。&lt;/p&gt;&#10;&lt;h2 id="フレックスボックスでのレイアウトの概要"&gt;フレックスボックスでのレイアウトの概要&#10;&lt;/h2&gt;&lt;p&gt;フレックスボックス（Flexible Box）レイアウトは、CSS3で導入された強力なレイアウトモデルであり、コンテナ内のアイテム間のスペース分配と強力なアライメント機能を提供します。フレックスボックスを使用することで、さまざまな画面サイズや表示デバイスに対応するレスポンシブなデザインを簡単に実現できます。このセクションでは、フレックスボックスの基本的な使用方法の概要を説明します。&lt;/p&gt;&#10;&lt;h3 id="フレックスコンテナの設定"&gt;フレックスコンテナの設定&#10;&lt;/h3&gt;&lt;p&gt;フレックスボックスレイアウトを使用するには、まずフレックスコンテナを定義します。これは、フレックスアイテム（子要素）を含む親要素です。フレックスコンテナにするためには、その要素の&lt;code&gt;display&lt;/code&gt;プロパティを&lt;code&gt;flex&lt;/code&gt;に設定します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;flex-container&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="主軸と交差軸"&gt;主軸と交差軸&#10;&lt;/h3&gt;&lt;p&gt;フレックスボックスでは、主軸（main axis）と交差軸（cross axis）という二つの軸を考慮します。デフォルトでは、主軸は水平（左から右）、交差軸は垂直（上から下）です。&lt;code&gt;flex-direction&lt;/code&gt;プロパティを使用して、主軸の方向を変更することができます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;flex-container&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;flex-direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;row&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* row | row-reverse | column | column-reverse */&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="フレックスアイテムの配置"&gt;フレックスアイテムの配置&#10;&lt;/h3&gt;&lt;p&gt;フレックスコンテナ内のアイテム（子要素）は、&lt;code&gt;justify-content&lt;/code&gt;、&lt;code&gt;align-items&lt;/code&gt;、&lt;code&gt;align-self&lt;/code&gt;などのプロパティを使って配置を調整できます。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;&lt;code&gt;justify-content&lt;/code&gt;&lt;/strong&gt; : 主軸に沿ったアイテムの配置を制御します（例: &lt;code&gt;flex-start&lt;/code&gt;、&lt;code&gt;center&lt;/code&gt;、&lt;code&gt;space-between&lt;/code&gt;）。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;&lt;code&gt;align-items&lt;/code&gt;&lt;/strong&gt; : 交差軸に沿ったアイテムの配置を制御します（例: &lt;code&gt;flex-start&lt;/code&gt;、&lt;code&gt;center&lt;/code&gt;、&lt;code&gt;baseline&lt;/code&gt;）。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;&lt;code&gt;align-self&lt;/code&gt;&lt;/strong&gt; : 個別のアイテムに対して交差軸の位置を制御します（&lt;code&gt;auto&lt;/code&gt;、&lt;code&gt;flex-start&lt;/code&gt;、&lt;code&gt;center&lt;/code&gt;など）。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="フレックスアイテムの柔軟性"&gt;フレックスアイテムの柔軟性&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;flex&lt;/code&gt;プロパティは、フレックスアイテムがフレックスコンテナ内でどのように伸縮するかを定義します。これにより、アイテムのサイズをフレキシブルに調整できます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;flex-item&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* アイテムがコンテナの利用可能なスペースを等しく分割して占める */&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="フレックスボックスのレイアウト例"&gt;フレックスボックスのレイアウト例&#10;&lt;/h3&gt;&lt;p&gt;以下は、フレックスボックスを使用したナビゲーションバーの簡単な例です。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;flex-container&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;flex-item&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;ホーム&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;flex-item&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;ニュース&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;flex-item&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;お問い合わせ&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;flex-container&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;justify-content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;space-around&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;align-items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;flex-item&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;flex-grow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;text-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この例では、フレックスアイテムがコンテナの利用可能なスペースを均等に分割し、&lt;code&gt;justify-content&lt;/code&gt;プロパティでアイテム間のスペースを均等に配置し、&lt;code&gt;align-items&lt;/code&gt;で垂直方向の中央揃えを行っています。&lt;/p&gt;&#10;&lt;p&gt;次のセクションより、各見出しの詳細について解説します。&lt;/p&gt;&#10;&lt;h2 id="主軸と交差軸-1"&gt;主軸と交差軸&#10;&lt;/h2&gt;&lt;p&gt;フレックスボックスレイアウトの理解において、主軸（Main Axis）と交差軸（Cross Axis）の概念は中心的な役割を果たします。これらの軸は、フレックスコンテナ内でフレックスアイテムがどのように配置されるか、そしてどのように伸縮するかを決定する基礎となります。&lt;/p&gt;&#10;&lt;h3 id="主軸main-axis"&gt;主軸（Main Axis）&#10;&lt;/h3&gt;&lt;p&gt;主軸は、フレックスアイテムが配置されるメインの方向を指します。デフォルトでは、主軸は水平方向（左から右）ですが、フレックスコンテナの&lt;code&gt;flex-direction&lt;/code&gt;プロパティによって、これを変更することができます。&lt;code&gt;flex-direction&lt;/code&gt;の値には以下のものがあります：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;row&lt;/code&gt;（デフォルト）: 主軸が水平方向で、アイテムがテキストの方向に沿って（通常は左から右へ）配置されます。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;row-reverse&lt;/code&gt;: 主軸が水平方向で、アイテムがテキストの逆方向に沿って（右から左へ）配置されます。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;column&lt;/code&gt;: 主軸が垂直方向で、アイテムが上から下へ配置されます。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;column-reverse&lt;/code&gt;: 主軸が垂直方向で、アイテムが下から上へ配置されます。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;主軸に沿ったアイテムの配置は、&lt;code&gt;justify-content&lt;/code&gt;プロパティを使用して細かく調整することが可能です。&lt;/p&gt;&#10;&lt;h3 id="交差軸cross-axis"&gt;交差軸（Cross Axis）&#10;&lt;/h3&gt;&lt;p&gt;交差軸は、主軸に直交する方向を指します。例えば、もし主軸が水平（左から右）であれば、交差軸は垂直（上から下）になります。交差軸は、主軸に対するアイテムの配置やサイズ調整に影響を与えます。&lt;/p&gt;&#10;&lt;p&gt;交差軸に沿ったアイテムの配置やサイズは、&lt;code&gt;align-items&lt;/code&gt;（コンテナ内のすべてのアイテムに適用）、&lt;code&gt;align-self&lt;/code&gt;（個々のアイテムに適用）、そして&lt;code&gt;align-content&lt;/code&gt;（複数行のアイテムがある場合の行間のスペース配分）プロパティを通じて制御されます。&lt;/p&gt;&#10;&lt;h3 id="例flex-directionによる主軸と交差軸の変更"&gt;例：&lt;code&gt;flex-direction&lt;/code&gt;による主軸と交差軸の変更&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;flex-container&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;flex-direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;column&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;align-items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;justify-content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;space-around&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この例では、&lt;code&gt;flex-direction: column;&lt;/code&gt;により、主軸が垂直方向に設定されています。これにより、フレックスアイテムは上から下に配置され、交差軸は水平方向になります。&lt;code&gt;align-items: center;&lt;/code&gt;は交差軸（この場合は水平）に沿ってアイテムを中央に配置し、&lt;code&gt;justify-content: space-around;&lt;/code&gt;は主軸（この場合は垂直）に沿ってアイテム間に均等なスペースを配分します。&lt;/p&gt;&#10;&lt;p&gt;主軸と交差軸の概念を理解することは、フレックスボックスを使ったレイアウト設計の基礎となります。これにより、レスポンシブで柔軟なWebデザインを実現することが可能になります。&lt;/p&gt;&#10;&lt;h2 id="フレックスアイテムの配置-1"&gt;フレックスアイテムの配置&#10;&lt;/h2&gt;&lt;p&gt;フレックスボックスモデルでは、フレックスコンテナ内のアイテムの配置を細かく制御できます。このセクションでは、主軸（Main Axis）と交差軸（Cross Axis）に沿ったフレックスアイテムの配置に焦点を当て、それぞれのプロパティの使用方法と効果について詳しく説明します。&lt;/p&gt;&#10;&lt;h3 id="主軸に沿った配置justify-content"&gt;主軸に沿った配置：&lt;code&gt;justify-content&lt;/code&gt;&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;justify-content&lt;/code&gt;プロパティは、フレックスアイテムを主軸に沿ってどのように配置するかを定義します。このプロパティは、アイテム間のスペース分配や、アイテムのグループをコンテナ内で揃える方法を指定するために使用されます。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;flex-start&lt;/code&gt;: アイテムをコンテナの開始端に揃えます。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;flex-end&lt;/code&gt;: アイテムをコンテナの終了端に揃えます。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;center&lt;/code&gt;: アイテムをコンテナの中央に揃えます。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;space-between&lt;/code&gt;: 最初のアイテムを開始端に、最後のアイテムを終了端に配置し、残りのアイテム間に均等なスペースを配分します。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;space-around&lt;/code&gt;: アイテムの周囲に均等なスペースを配分します。各アイテムの両端のスペースは、アイテム間のスペースの半分になります。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;space-evenly&lt;/code&gt;: アイテム間だけでなく、コンテナの端とアイテムの間にも均等なスペースを配分します。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="交差軸に沿った配置align-itemsとalign-self"&gt;交差軸に沿った配置：&lt;code&gt;align-items&lt;/code&gt;と&lt;code&gt;align-self&lt;/code&gt;&#10;&lt;/h3&gt;&lt;h4 id="align-items"&gt;&lt;code&gt;align-items&lt;/code&gt;&#10;&lt;/h4&gt;&lt;p&gt;&lt;code&gt;align-items&lt;/code&gt;プロパティは、フレックスアイテムを交差軸に沿ってどのように配置するかを定義します。これにより、コンテナ内のすべてのアイテムの垂直方向（デフォルトの主軸が水平の場合）の位置を制御できます。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;flex-start&lt;/code&gt;: アイテムをコンテナの交差軸開始端に揃えます。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;flex-end&lt;/code&gt;: アイテムをコンテナの交差軸終了端に揃えます。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;center&lt;/code&gt;: アイテムを交差軸の中央に揃えます。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;baseline&lt;/code&gt;: アイテムをテキストのベースラインに揃えます。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;stretch&lt;/code&gt;（デフォルト）: アイテムをコンテナの高さに合わせて伸ばします（アイテムの高さが指定されていない場合）。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="align-self"&gt;&lt;code&gt;align-self&lt;/code&gt;&#10;&lt;/h4&gt;&lt;p&gt;&lt;code&gt;align-self&lt;/code&gt;プロパティは、個々のフレックスアイテムに対して&lt;code&gt;align-items&lt;/code&gt;プロパティの値を上書きします。これにより、特定のアイテムだけ異なる方法で交差軸に沿って配置することが可能になります。&lt;code&gt;align-self&lt;/code&gt;は&lt;code&gt;align-items&lt;/code&gt;と同じ値を受け取りますが、特定のアイテムに適用される点が異なります。&lt;/p&gt;&#10;&lt;h3 id="複数行のフレックスアイテムの配置align-content"&gt;複数行のフレックスアイテムの配置：&lt;code&gt;align-content&lt;/code&gt;&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;align-content&lt;/code&gt;プロパティは、フレックスコンテナに複数行のフレックスアイテムがある場合に、それらの行を交差軸に沿ってどのように配置するかを制御します。このプロパティは、コンテナが追加の空間を持っていて、フレックスアイテムが複数行に渡る場合にのみ影響します。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;flex-start&lt;/code&gt;: 行をコンテナの交差軸開始端に揃えます。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;flex-end&lt;/code&gt;: 行をコンテナの交差軸終了端に揃えます。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;center&lt;/code&gt;: 行をコンテナの交差軸中央に揃えます。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;space-between&lt;/code&gt;: 最初の行を交差軸開始端に、最後の行を終了端に配置し、残りの行間に均等なスペースを配分します。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;space-around&lt;/code&gt;: 行の周囲に均等なスペースを配分します。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;stretch&lt;/code&gt;: 行をコンテナの残りの高さに合わせて伸ばします。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;フレックスボックスのアイテム配置機能は、複雑なレイアウトを柔軟に、簡単に実現するための強力なツールです。これらのプロパティを適切に利用することで、さまざまな画面サイズに適応するレスポンシブなデザインを作成することができます。&lt;/p&gt;&#10;&lt;h2 id="フレックスアイテムの柔軟性-1"&gt;フレックスアイテムの柔軟性&#10;&lt;/h2&gt;&lt;p&gt;フレックスボックスレイアウトにおける「柔軟性」は、フレックスアイテムのサイズを動的に調整する能力を指します。この柔軟性により、フレックスアイテムはコンテナ内の利用可能なスペースに応じて、伸縮することができます。主に&lt;code&gt;flex-grow&lt;/code&gt;、&lt;code&gt;flex-shrink&lt;/code&gt;、&lt;code&gt;flex-basis&lt;/code&gt;の3つのプロパティを組み合わせて、アイテムの伸縮を制御します。&lt;/p&gt;&#10;&lt;h3 id="flex-grow"&gt;&lt;code&gt;flex-grow&lt;/code&gt;&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;flex-grow&lt;/code&gt;プロパティは、フレックスアイテムがフレックスコンテナ内の余剰スペースをどの程度占めるかを定義します。値は非負の数で、デフォルトは&lt;code&gt;0&lt;/code&gt;です。この値が大きいほど、他のアイテムに比べてより多くの余剰スペースを占めるようになります。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;flex-item&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;flex-grow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* 余剰スペースを他のアイテムと等しく分割して占める */&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="flex-shrink"&gt;&lt;code&gt;flex-shrink&lt;/code&gt;&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;flex-shrink&lt;/code&gt;プロパティは、フレックスコンテナ内のスペースが不足している場合に、フレックスアイテムがどの程度縮小するかを定義します。値は非負の数で、デフォルトは&lt;code&gt;1&lt;/code&gt;です。この値が大きいほど、他のアイテムに比べてより強く縮小します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;flex-item&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;flex-shrink&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* スペース不足時に他のアイテムよりも強く縮小する */&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="flex-basis"&gt;&lt;code&gt;flex-basis&lt;/code&gt;&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;flex-basis&lt;/code&gt;プロパティは、フレックスアイテムの初期サイズを定義します。この値は、アイテムが伸縮する前の基本となる幅（主軸が水平の場合）または高さ（主軸が垂直の場合）を指定します。値には具体的な寸法（例えば&lt;code&gt;200px&lt;/code&gt;）や&lt;code&gt;auto&lt;/code&gt;（コンテンツのサイズに基づく）を設定できます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;flex-item&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;flex-basis&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* アイテムの初期サイズを150pxに設定 */&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="flex-のショートハンド"&gt;&lt;code&gt;flex&lt;/code&gt; のショートハンド&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;flex-grow&lt;/code&gt;、&lt;code&gt;flex-shrink&lt;/code&gt;、&lt;code&gt;flex-basis&lt;/code&gt;の3つのプロパティは、&lt;code&gt;flex&lt;/code&gt;プロパティを使用して簡潔に記述することができます。これは、フレックスアイテムの柔軟性を一括で指定する便利な方法です。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;flex-item&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* flex-grow: 1, flex-shrink: 2, flex-basis: 150px */&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この例では、フレックスアイテムは余剰スペースがあれば伸び、スペースが不足していれば縮小し、その初期サイズは&lt;code&gt;150px&lt;/code&gt;と定義されています。デフォルト値&lt;code&gt;flex: 0 1 auto;&lt;/code&gt;は、アイテムが伸びず、必要に応じて縮小し、コンテンツのサイズに基づく初期サイズを持つことを意味します。&lt;/p&gt;&#10;&lt;p&gt;フレックスアイテムの柔軟性を適切に設定することで、さまざまな画面サイズや表示条件に対応する、動的でレスポンシブなレイアウトを簡単に実現できます。&lt;/p&gt;&#10;</description></item><item><title>HTML: Webページの構造/コンテナ/セクショニング</title><link>https://ai.hack-le.com/html-web-container/</link><pubDate>Fri, 29 Mar 2024 20:11:21 +0900</pubDate><guid>https://ai.hack-le.com/html-web-container/</guid><description>&lt;p&gt;自分がHTML/CSSの復習するためにChatGPTにアウトライン書かせて記事化したものの一部です。&lt;/p&gt;&#10;&lt;h2 id="レイアウトの基本ブロックレベル要素とインライン要素"&gt;レイアウトの基本（ブロックレベル要素とインライン要素）&#10;&lt;/h2&gt;&lt;p&gt;Webページのレイアウトを理解する上で、ブロックレベル要素とインライン要素の違いを把握することは非常に重要です。これらの要素は、HTML文書内でどのように配置され、振る舞うかに大きな影響を与えます。このセクションでは、ブロックレベル要素とインライン要素の基本的な特徴と使い方について解説します。&lt;/p&gt;&#10;&lt;h3 id="ブロックレベル要素"&gt;ブロックレベル要素&#10;&lt;/h3&gt;&lt;p&gt;ブロックレベル要素は、新しい行から始まり、利用可能な全幅を占める傾向があります。これらの要素は、主に構造を定義するために使用され、セクショニング、ヘッダー、パラグラフなどのコンテンツを含むことができます。ブロックレベル要素の例には、&lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;header&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;footer&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;section&amp;gt;&lt;/code&gt; などがあります。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;div&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; これはブロックレベル要素です。この要素は新しい行から始まり、幅いっぱいに広がります。&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;/div&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ブロックレベル要素は、マージンやパディングを通じて周囲の要素との間隔を調整することができます。また、&lt;code&gt;width&lt;/code&gt; と &lt;code&gt;height&lt;/code&gt; プロパティを使用して、そのサイズを明示的に指定することが可能です。&lt;/p&gt;&#10;&lt;h3 id="インライン要素"&gt;インライン要素&#10;&lt;/h3&gt;&lt;p&gt;インライン要素は、ブロックレベル要素内に含まれることが多く、新しい行を始めることなく、コンテンツの流れに沿って配置されます。これらの要素は、テキストや画像などの小さなコンテンツのグループに適しており、テキスト内で使用される&lt;code&gt;&amp;lt;span&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; などが該当します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;p&amp;gt;これは&amp;lt;span style=&amp;#34;color: red;&amp;#34;&amp;gt;インライン要素&amp;lt;/span&amp;gt;の例です。&amp;lt;/p&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;インライン要素に対しては、&lt;code&gt;width&lt;/code&gt; や &lt;code&gt;height&lt;/code&gt; プロパティが効果を持ちません。ただし、&lt;code&gt;margin&lt;/code&gt; の左右の値（&lt;code&gt;margin-left&lt;/code&gt;, &lt;code&gt;margin-right&lt;/code&gt;）や、&lt;code&gt;padding&lt;/code&gt; の値は適用されますが、上下の値（&lt;code&gt;margin-top&lt;/code&gt;, &lt;code&gt;margin-bottom&lt;/code&gt;, &lt;code&gt;padding-top&lt;/code&gt;, &lt;code&gt;padding-bottom&lt;/code&gt;）はブロックレベル要素と同じようには扱われません。&lt;/p&gt;&#10;&lt;h3 id="ブロックレベルとインラインの混在"&gt;ブロックレベルとインラインの混在&#10;&lt;/h3&gt;&lt;p&gt;ブロックレベル要素とインライン要素は、HTML文書で混在して使用されることがあります。インライン要素をブロックレベル要素の中に配置することで、テキストや画像などのコンテンツを適切に配置し、スタイリングすることができます。&lt;/p&gt;&#10;&lt;h2 id="コンテナ"&gt;コンテナ&#10;&lt;/h2&gt;&lt;p&gt;Webデザインにおいて、ページの内容を整理し、構造的に意味のある方法で情報を提示することは非常に重要です。この目的のために、「コンテナ」と「セクショニング」の概念が役立ちます。これらの手法を適切に使用することで、コンテンツを論理的にグループ化し、ユーザーにとってナビゲートしやすいページを作成することができます。&lt;/p&gt;&#10;&lt;p&gt;コンテナは、Webページ上の他の要素を包含（または包装）するために使用される要素です。これは、特定のセクションやコンテンツのグループを視覚的に区別するため、またはスタイリングの目的で使用されます。最も一般的に使用されるコンテナは&lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;タグです。&lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;はセマンティックな意味を持たないため、ページの構造を損なうことなく、スタイリングやレイアウトのための「箱」として機能します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;div class=&amp;#34;container&amp;#34;&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;lt;p&amp;gt;これはコンテナ内のテキストです。&amp;lt;/p&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;/div&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="セクショニング"&gt;セクショニング&#10;&lt;/h2&gt;&lt;p&gt;セクショニングはWebページのコンテンツを論理的に整理し、それぞれの部分が持つ意味を明確にするための重要なプロセスです。HTML5では、セクショニングを効果的に行うためのいくつかの要素が導入されており、これらを使用することで、コンテンツをよりアクセシブルで検索エンジンに優しいものにすることができます。&lt;/p&gt;&#10;&lt;h3 id="header-ヘッダーのセクショニング"&gt;&lt;code&gt;&amp;lt;header&amp;gt;&lt;/code&gt;: ヘッダーのセクショニング&#10;&lt;/h3&gt;&lt;p&gt;ヘッダーは、ページまたはセクションの導入部分に使用され、通常、サイトのロゴ、ナビゲーションリンク、検索フォームなどを含みます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;header&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;サイトのタイトル&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;nav&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;ul&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;#home&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;ホーム&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;#about&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;私たちについて&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;#contact&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;お問い合わせ&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;ul&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;nav&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;header&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="footer-フッターのセクショニング"&gt;&lt;code&gt;&amp;lt;footer&amp;gt;&lt;/code&gt;: フッターのセクショニング&#10;&lt;/h3&gt;&lt;p&gt;フッターは、ページの末尾に配置され、著作権情報、連絡先情報、サイトマップへのリンクなどを含むことが多いです。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;footer&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;© 2024 サイト名. All rights reserved.&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;footer&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="section-汎用セクションのセクショニング"&gt;&lt;code&gt;&amp;lt;section&amp;gt;&lt;/code&gt;: 汎用セクションのセクショニング&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;&amp;lt;section&amp;gt;&lt;/code&gt;は、関連するコンテンツをグループ化し、それに意味を付与するために使用されます。それぞれの&lt;code&gt;&amp;lt;section&amp;gt;&lt;/code&gt;は独自の見出しを持つことが推奨されます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;section&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;サービスの紹介&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;私たちの提供するサービスについての説明。&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;section&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="article-独立したコンテンツのセクショニング"&gt;&lt;code&gt;&amp;lt;article&amp;gt;&lt;/code&gt;: 独立したコンテンツのセクショニング&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;&amp;lt;article&amp;gt;&lt;/code&gt;は、再利用可能で独立したコンテンツのブロックを定義します。ブログの投稿やニュース記事などがこれに該当します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;article&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;記事のタイトル&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;記事の本文...&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;article&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="nav-ナビゲーションのセクショニング"&gt;&lt;code&gt;&amp;lt;nav&amp;gt;&lt;/code&gt;: ナビゲーションのセクショニング&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;&amp;lt;nav&amp;gt;&lt;/code&gt;は、ページ内のナビゲーションリンクのグループを示します。サイトの主要なナビゲーションやページ内リンクの集合に使用されます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;nav&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;ul&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;#section1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;セクション1&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;#section2&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;セクション2&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;ul&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;nav&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="aside-補足情報のセクショニング"&gt;&lt;code&gt;&amp;lt;aside&amp;gt;&lt;/code&gt;: 補足情報のセクショニング&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;&amp;lt;aside&amp;gt;&lt;/code&gt;は、メインコンテンツから少し離れた位置で、補足情報を提供します。サイドバーのコンテンツに適しています。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;aside&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;関連記事&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;ul&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;#&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;関連記事1&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;#&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;関連記事2&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;ul&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;aside&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これらのセクショニング要素を使用することで、Webページのコンテンツを論理的に区分けし、その構造を明確にすることができます。正しく使用することで、ページのアクセシビリティとSEOが向上し、ユーザーにとってもナビゲートしやすいページとなります。&lt;/p&gt;&#10;</description></item><item><title>HTML/CSSの基本</title><link>https://ai.hack-le.com/html-css/</link><pubDate>Fri, 29 Mar 2024 19:14:15 +0900</pubDate><guid>https://ai.hack-le.com/html-css/</guid><description>&lt;p&gt;自分がHTML/CSSの復習するためにChatGPTにアウトライン書かせて記事化したものの一部です。&lt;/p&gt;&#10;&lt;h2 id="html文書の構造"&gt;HTML文書の構造&#10;&lt;/h2&gt;&lt;p&gt;HTML（HyperText Markup Language）は、Webページの構造を定義するために使用されるマークアップ言語です。&lt;/p&gt;&#10;&lt;h3 id="基本的なhtml文書の構成"&gt;基本的なHTML文書の構成&#10;&lt;/h3&gt;&lt;p&gt;全てのHTML文書は、基本的な構成要素から成り立っています。これらの要素を正しく理解し、適切に使用することが、効果的なWebページを構築する鍵となります。&lt;/p&gt;&#10;&lt;p&gt;HTML文書は、&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/code&gt;宣言から始まり、&lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt;タグで全体が囲まれます。&lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt;タグの内部には、&lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;セクションと&lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt;セクションが含まれます。以下はその基本的な骨格です：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;html&lt;/span&gt; &lt;span class="na"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ja&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;head&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;meta&lt;/span&gt; &lt;span class="na"&gt;charset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;UTF-8&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;title&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;ページのタイトル&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;title&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;head&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c"&gt;&amp;lt;!-- ここにコンテンツが入ります --&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;html&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="文書宣言とhtml要素"&gt;文書宣言とHTML要素&#10;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;html&lt;/span&gt; &lt;span class="na"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ja&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/code&gt;: この宣言は文書がHTML5を使用していることをブラウザに伝えます。HTML文書の最初に記述し、HTML5の標準に従うことを示します。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt;: HTML文書のルート（または最上位）要素です。&lt;code&gt;lang&lt;/code&gt;属性を用いて文書の主言語を指定します。この例では、&amp;ldquo;ja&amp;quot;が日本語を意味します。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="ヘッドセクション"&gt;ヘッドセクション&#10;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;head&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;meta&lt;/span&gt; &lt;span class="na"&gt;charset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;UTF-8&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;title&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;ページのタイトル&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;title&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;head&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;: 文書のメタデータ、スクリプト、スタイルシートへのリンクなど、ページの見た目に直接影響しない情報を含みます。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;&amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;/code&gt;: 文書の文字エンコーディングをUTF-8として指定します。これにより、世界中のあらゆる文字が正しく表示されるようになります。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt;: ブラウザのタブに表示されるページのタイトルを指定します。SEO（検索エンジン最適化）においても重要な役割を果たします。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="ボディセクション"&gt;ボディセクション&#10;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c"&gt;&amp;lt;!-- ここにページのコンテンツが入ります --&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt;: ページのコンテンツを含むメイン部分です。テキスト、画像、動画、リンクなど、ユーザーに表示される要素がここに配置されます。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="まとめ"&gt;まとめ&#10;&lt;/h3&gt;&lt;p&gt;HTML文書は、ブラウザがWebページを正しくレンダリングするための指示を提供するために、非常に構造化された形式で書かれています。&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/code&gt;宣言から始まり、&lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt;、&lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;、そして&lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt;という要素によって構成されています。この基本的な構造を理解し、適切に使用することは、効果的なWebデザインと開発の基礎となります。&lt;/p&gt;&#10;&lt;h2 id="基本的なタグとその使い方"&gt;基本的なタグとその使い方&#10;&lt;/h2&gt;&lt;p&gt;HTML文書を構築する際には、さまざまなタグを使用してコンテンツの構造を定義します。このセクションでは、HTML文書において頻繁に使用される基本的なタグとその使い方について詳しく見ていきます。これらのタグを理解し、適切に使用することで、読みやすくアクセスしやすいWebページを作成することができます。&lt;/p&gt;&#10;&lt;h3 id="見出しタグ-h1h6"&gt;見出しタグ (&lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt;〜&lt;code&gt;&amp;lt;h6&amp;gt;&lt;/code&gt;)&#10;&lt;/h3&gt;&lt;p&gt;見出しタグは、文書の見出しやセクションのタイトルを示すために使用されます。&lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt;から&lt;code&gt;&amp;lt;h6&amp;gt;&lt;/code&gt;までの6レベルがあり、&lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt;が最も重要な見出しを示し、&lt;code&gt;&amp;lt;h6&amp;gt;&lt;/code&gt;に向かうにつれて重要度が下がります。一般的に、&lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt;はページの主題を示すために1ページに1回だけ使用し、他の見出しタグはサブセクションの見出しとして使用します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;メインの見出し&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;サブ見出し&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h3&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;さらに小さい見出し&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h3&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="段落タグ-p"&gt;段落タグ (&lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt;)&#10;&lt;/h3&gt;&lt;p&gt;段落タグ&lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt;は、テキストの段落を定義するために使用されます。このタグは、テキストを視覚的に区切り、読みやすくするために重要です。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;これは段落です。ここにテキストコンテンツが入ります。&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="リンクタグ-a"&gt;リンクタグ (&lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt;)&#10;&lt;/h3&gt;&lt;p&gt;リンクタグ&lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt;は、ハイパーリンクを作成するために使用されます。&lt;code&gt;href&lt;/code&gt;属性には、リンク先のURLを指定します。リンクを使用することで、ユーザーはクリックするだけで他のページやサイトに簡単に移動できます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://example.com&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Example.comへのリンク&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="リストタグ-ul-ol-li"&gt;リストタグ (&lt;code&gt;&amp;lt;ul&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;ol&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt;)&#10;&lt;/h3&gt;&lt;p&gt;リストは情報を整理し、リスト形式で表示するのに役立ちます。順不同リストには&lt;code&gt;&amp;lt;ul&amp;gt;&lt;/code&gt;を、順序付きリストには&lt;code&gt;&amp;lt;ol&amp;gt;&lt;/code&gt;を使用し、リストアイテムは&lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt;タグでマークアップします。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;ul&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;リストアイテム1&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;リストアイテム2&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;ul&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;ol&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;最初のアイテム&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;二番目のアイテム&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;ol&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="画像タグ-img"&gt;画像タグ (&lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt;)&#10;&lt;/h3&gt;&lt;p&gt;画像タグ&lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt;は、Webページに画像を埋め込むために使用されます。&lt;code&gt;src&lt;/code&gt;属性には画像のURLを指定し、&lt;code&gt;alt&lt;/code&gt;属性には画像の代替テキストを提供します。代替テキストは、画像が表示されない場合や視覚障害者のユーザーが使用するスクリーンリーダーによって読み上げられます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;img&lt;/span&gt; &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;image.jpg&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;alt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;説明テキスト&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="まとめ-1"&gt;まとめ&#10;&lt;/h3&gt;&lt;p&gt;このセクションでは、HTML文書における基本的なタグとその使い方について紹介しました。見出し、段落、リンク、リスト、画像のタグは、Webページを構築する際の基礎となります。これらのタグを適切に使用することで、情報を効果的に整理し、ユーザーにとってアクセスしやすいコンテンツを作成することができます。&lt;/p&gt;&#10;&lt;h2 id="cssの基本"&gt;CSSの基本&#10;&lt;/h2&gt;&lt;p&gt;CSS（Cascading Style Sheets）は、Webページの見た目とフォーマットを指定するために使用される言語です。HTMLがページの構造を定義するのに対し、CSSはその外見を装飾します。&lt;/p&gt;&#10;&lt;h3 id="cssの適用"&gt;CSSの適用&#10;&lt;/h3&gt;&lt;p&gt;CSSをHTML文書に適用する方法は、スタイルをWebページに組み込むための基本的な技術です。主に3つの方法があります：インラインスタイル、内部スタイルシート、そして外部スタイルシート。各方法は特定の用途に適しており、その使用はプロジェクトの要件や開発者の好みによって異なります。重要な観点は以下です。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;再利用性&lt;/strong&gt;: 外部スタイルシートを使用することで、スタイルを再利用し、コンシステントなデザインを保つことができます。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;保守性&lt;/strong&gt;: スタイルを別のファイルに分離することで、コードの保守性が向上します。CSSファイルを更新するだけで、サイト全体の見た目を変更できます。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;パフォーマンス&lt;/strong&gt;: 外部スタイルシートはブラウザにキャッシュされるため、ページの読み込み時間を短縮することができます。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;CSSをHTML文書に適用するこれらの方法を適切に使い分けることで、効率的かつ効果的にWebページをスタイリングすることができます。&lt;/p&gt;&#10;&lt;h4 id="インラインスタイル"&gt;インラインスタイル&#10;&lt;/h4&gt;&lt;p&gt;インラインスタイルは、HTML要素に直接CSSスタイルを適用する方法です。&lt;code&gt;style&lt;/code&gt;属性を使用して、個々の要素にスタイルルールを指定します。この方法は、小規模な変更には便利ですが、スタイルの再利用ができないため、大規模なWebサイトでは推奨されません。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;p style=&amp;#34;color: blue; font-size: 16px;&amp;#34;&amp;gt;これはインラインスタイルを使用したテキストです。&amp;lt;/p&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="内部スタイルシート"&gt;内部スタイルシート&#10;&lt;/h4&gt;&lt;p&gt;内部スタイルシートは、HTML文書内の&lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt;タグを用いて定義されます。通常、&lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;セクション内に配置され、そのHTML文書内でのみ適用されます。ページ固有のスタイルを定義するのに適していますが、複数のページにわたってスタイルを共有する場合は効率的ではありません。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;head&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;style&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;body&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;#f0f0f0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;red&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;style&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;head&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="外部スタイルシート"&gt;外部スタイルシート&#10;&lt;/h4&gt;&lt;p&gt;外部スタイルシートは、スタイル情報を別のファイルに保存し、HTML文書からリンクする方法です。&lt;code&gt;.css&lt;/code&gt;拡張子を持つCSSファイルにスタイルルールを記述し、&lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt;タグを用いてHTML文書の&lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;セクション内でそのファイルを参照します。この方法は再利用性とメンテナンスのしやすさから、最も一般的に推奨される方法です。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;head&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;link&lt;/span&gt; &lt;span class="na"&gt;rel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;stylesheet&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;styles.css&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;head&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;styles.css&lt;/code&gt;ファイル:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;body {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; background-color: #f0f0f0;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;p {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; color: green;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="セレクタ"&gt;セレクタ&#10;&lt;/h3&gt;&lt;p&gt;セレクタは、スタイルを適用するHTML要素を指定します。セレクタには様々な種類があり、特定の要素、要素のクラス、ID、またはそれらの組み合わせを指定することができます。&lt;/p&gt;&#10;&lt;h4 id="要素セレクタ"&gt;要素セレクタ&#10;&lt;/h4&gt;&lt;p&gt;要素セレクタは、特定のHTML要素にスタイルを直接適用します。例えば、すべての&lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt;タグにスタイルを適用したい場合、次のように記述します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;p {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; color: blue;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; font-size: 16px;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="クラスセレクタ"&gt;クラスセレクタ&#10;&lt;/h4&gt;&lt;p&gt;クラスセレクタは、特定のクラス属性を持つ要素にスタイルを適用します。ピリオド（&lt;code&gt;.&lt;/code&gt;）に続けてクラス名を指定します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.intro {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; font-weight: bold;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="idセレクタ"&gt;IDセレクタ&#10;&lt;/h4&gt;&lt;p&gt;IDセレクタは、特定のID属性を持つ要素にスタイルを適用します。ハッシュ記号（&lt;code&gt;#&lt;/code&gt;）に続けてID名を指定します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;#header {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; background-color: gray;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="プロパティと値"&gt;プロパティと値&#10;&lt;/h3&gt;&lt;p&gt;プロパティは、スタイルの種類を指定します（例: 色、フォントサイズ、マージンなど）。値はそのプロパティに設定する具体的な設定値です。プロパティと値はセミコロンで区切られ、プロパティと値の組み合わせはカーリーブレース（&lt;code&gt;{}&lt;/code&gt;）で囲みます。&lt;/p&gt;&#10;&lt;h4 id="例テキストの色とフォントサイズを設定"&gt;例：テキストの色とフォントサイズを設定&#10;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;p {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; color: red; /* プロパティ: color, 値: red */&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; font-size: 14px; /* プロパティ: font-size, 値: 14px */&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="スタイリングの基本"&gt;スタイリングの基本&#10;&lt;/h2&gt;&lt;p&gt;CSSを用いたスタイリングは、Webページに視覚的魅力を加える重要なプロセスです。色、フォント、レイアウトなど、さまざまな側面を調整することで、ユーザーにとって魅力的かつ読みやすいページを作成することができます。このセクションでは、スタイリングの基本に焦点を当て、効果的なWebデザインのための主要なCSSプロパティについて解説します。&lt;/p&gt;&#10;&lt;h3 id="色の指定-colorbackground-color"&gt;色の指定 color/background-color&#10;&lt;/h3&gt;&lt;p&gt;Webページの色彩は、ブランドのイメージを伝え、ユーザーの注意を引き、情報の階層を明確にする役割を果たします。CSSでは、テキストの色、背景色、境界線の色などを指定することができます。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;テキストの色&lt;/strong&gt;: &lt;code&gt;color&lt;/code&gt; プロパティを使用して、テキストの色を指定します。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;背景色&lt;/strong&gt;: &lt;code&gt;background-color&lt;/code&gt; プロパティを用いて、要素の背景色を設定します。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;body {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; color: #333; /* テキストの色をダークグレーに設定 */&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; background-color: #f8f8f8; /* 背景色をライトグレーに設定 */&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="フォントとテキストスタイル-font-familyfont-sizetext-align"&gt;フォントとテキストスタイル font-family/font-size/text-align&#10;&lt;/h3&gt;&lt;p&gt;読みやすさはユーザーエクスペリエンスの重要な要素です。CSSを用いてフォントの種類、サイズ、行間、テキストの揃え方を指定することで、テキストコンテンツの視覚的な魅力と読みやすさを向上させることができます。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;フォントファミリー&lt;/strong&gt;: &lt;code&gt;font-family&lt;/code&gt; プロパティを使用して、テキストに使用するフォントを指定します。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;フォントサイズ&lt;/strong&gt;: &lt;code&gt;font-size&lt;/code&gt; プロパティで、テキストのサイズを指定します。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;テキストアラインメント&lt;/strong&gt;: &lt;code&gt;text-align&lt;/code&gt; プロパティを用いて、テキストの揃え方（左、中央、右）を指定します。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;p {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; font-family: &amp;#34;Helvetica Neue&amp;#34;, Helvetica, Arial, sans-serif;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; font-size: 16px;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; text-align: justify;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="ボックスモデル-marginborderpadding"&gt;ボックスモデル margin/border/padding&#10;&lt;/h3&gt;&lt;p&gt;CSSのボックスモデルは、Webページ上の各要素がどのようにレイアウトされるかを定義する重要な概念です。各要素は、マージン、ボーダー、パディング、そしてコンテンツ自体の4つの部分から成り立っています。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;マージン&lt;/strong&gt;: &lt;code&gt;margin&lt;/code&gt; プロパティを用いて、要素の外側の空間を指定します。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;ボーダー&lt;/strong&gt;: &lt;code&gt;border&lt;/code&gt; プロパティで、要素の境界線のスタイル、幅、色を設定します。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;パディング&lt;/strong&gt;: &lt;code&gt;padding&lt;/code&gt; プロパティによって、要素の内側の空間（コンテンツとボーダーの間）を指定します。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.box {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; margin: 20px;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; border: 2px solid #000;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; padding: 10px;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>JavaScript: ライブラリを使わず擬似的なUUIDを生成する</title><link>https://ai.hack-le.com/javascript-uuid/</link><pubDate>Wed, 14 Feb 2024 00:13:46 +0900</pubDate><guid>https://ai.hack-le.com/javascript-uuid/</guid><description>&lt;p&gt;この記事では、&lt;strong&gt;ライブラリを一切使用せずにJavaScriptで擬似UUIDを生成する&lt;/strong&gt;方法を紹介します。このアプローチは、UUIDの公式な仕様に完全に準拠しているわけではありませんが、多くのシナリオで十分なランダム性とユニークさを提供します。開発の早い段階で簡単に実装でき、外部ライブラリへの依存なしに一意の識別子を得ることができます。&lt;/p&gt;&#10;&lt;h2 id="uuidとは"&gt;UUIDとは？&#10;&lt;/h2&gt;&lt;p&gt;UUID（Universally Unique Identifier）は、ソフトウェア開発において広く利用されるユニークな識別子です。128ビットの長さを持ち、十六進数で表現されるこの識別子は、その生成プロセスにより、実用上ユニーク（重複することがない）であると考えられています。UUIDは、データベースの主キー、オブジェクトの識別、トランザクションの追跡など、さまざまな用途で利用されます。&lt;/p&gt;&#10;&lt;h3 id="uuidのバリエーション"&gt;UUIDのバリエーション&#10;&lt;/h3&gt;&lt;p&gt;UUIDにはいくつかのバージョンがあり、それぞれ異なる生成方法を使用します。最も一般的に使用されるのはバージョン4（v4）で、完全にランダムまたは疑似ランダムな方法で生成されます。他にも、時刻ベース（v1）、DCEセキュリティ（v2）、名前ベースのMD5ハッシュ（v3）、名前ベースのSHA-1ハッシュ（v5）などがあります。&lt;/p&gt;&#10;&lt;h3 id="uuidの必要性"&gt;UUIDの必要性&#10;&lt;/h3&gt;&lt;p&gt;UUIDの主な魅力は、そのユニーク性にあります。巨大なID空間とランダム性（または疑似ランダム性）により、任意のUUIDが他のUUIDと重複する確率は極めて低くなります。これにより、異なるシステムやコンポーネント間でデータを一意に識別し、管理することが可能になります。また、UUIDは事前に生成して配布することができるため、オフラインでの作業や分散システムでの利用にも適しています。&lt;/p&gt;&#10;&lt;h3 id="uuidの利点"&gt;UUIDの利点&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;ユニーク性&lt;/strong&gt;: 重複のリスクが非常に低いため、データの一意性を保証します。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;汎用性&lt;/strong&gt;: さまざまな用途で使用でき、システムやアプリケーション間でのデータの共有や識別に役立ちます。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;予測不可能性&lt;/strong&gt;: ランダムな生成プロセスにより、IDの生成パターンを予測することが困難です。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;実装の簡易性&lt;/strong&gt;: 多くのプログラミング言語やフレームワークでサポートされており、簡単に生成と利用が可能です。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;UUIDは、デジタルプロダクトの設計や開発において、一意の識別子が必要とされるほぼすべての場面で役立つ強力なツールです。次のセクションでは、外部のライブラリやツールに頼らずに、JavaScriptを使用してUUIDを生成する方法に焦点を当てます。&lt;/p&gt;&#10;&lt;h2 id="ライブラリを使わないuuid生成の動機"&gt;ライブラリを使わないUUID生成の動機&#10;&lt;/h2&gt;&lt;p&gt;UUIDの生成にライブラリを使用するのが一般的であり、多くの場合、これが最も簡単で効率的な方法です。しかし、特定のシナリオや条件では、純粋なJavaScriptを使ったアプローチが好まれることがあります。ここでは、ライブラリを使用しないでUUIDを生成する主な理由をいくつか紹介します。&lt;/p&gt;&#10;&lt;h3 id="外部依存性の最小化"&gt;外部依存性の最小化&#10;&lt;/h3&gt;&lt;p&gt;依存性の少ないコードは、保守が容易であり、将来的な互換性の問題を避けることができます。外部ライブラリをプロジェクトに追加すると、そのライブラリが更新された場合に生じる潜在的な問題に対処する必要が出てきます。純粋なJavaScriptでUUIDを生成することで、これらの潜在的な問題を回避し、プロジェクトの複雑さを減らすことができます。&lt;/p&gt;&#10;&lt;h3 id="ローコードプラットフォームでの使用"&gt;ローコードプラットフォームでの使用&#10;&lt;/h3&gt;&lt;p&gt;ローコード開発プラットフォームや、外部ライブラリの導入が難しい環境では、標準的なJavaScript機能だけを使用したUUID生成が特に有用です。これにより、開発者は外部依存性を気にすることなく、アプリケーション内で一意の識別子を生成できます。&lt;/p&gt;&#10;&lt;h3 id="プロトタイプの迅速な開発"&gt;プロトタイプの迅速な開発&#10;&lt;/h3&gt;&lt;p&gt;新しいアイデアやコンセプトを試す初期段階では、開発速度が重要です。外部ライブラリを調査して導入する時間を省き、既存のJavaScript機能を活用して素早くプロトタイプを作成することが、迅速なイテレーションとフィードバックの取得に繋がります。&lt;/p&gt;&#10;&lt;h3 id="内部ツールやダッシュボード"&gt;内部ツールやダッシュボード&#10;&lt;/h3&gt;&lt;p&gt;社内で使用されるツールやダッシュボードでは、一意の識別子が必要ですが、その生成に外部ライブラリの導入を避けたい場合があります。純粋なJavaScriptで生成された擬似UUIDは、このようなシナリオで簡単に導入できるソリューションを提供します。&lt;/p&gt;&#10;&lt;h2 id="javascriptでの擬似uuid生成方法"&gt;JavaScriptでの擬似UUID生成方法&#10;&lt;/h2&gt;&lt;p&gt;外部ライブラリやツールに頼ることなく、JavaScriptのみを使用して擬似UUIDを生成する方法は、プロトタイピングや特定の開発環境で非常に役立ちます。ここでは、シンプルながら効果的な擬似UUID生成アルゴリズムを紹介します。&lt;/p&gt;&#10;&lt;h3 id="基本的なアプローチ"&gt;基本的なアプローチ&#10;&lt;/h3&gt;&lt;p&gt;擬似UUIDを生成する最も基本的な方法は、ランダムな数値と現在の時刻を組み合わせることです。これにより、一定のランダム性とユニーク性を確保しつつ、簡単に実装できます。&lt;/p&gt;&#10;&lt;h3 id="ステップバイステップ実装"&gt;ステップバイステップ実装&#10;&lt;/h3&gt;&lt;p&gt;以下は、純粋なJavaScriptを使用して擬似UUIDを生成する方法の一例です。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;generatePseudoUUID&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;getTime&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// 現在の時刻をミリ秒単位で取得&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;uuid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/[xy]/g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;x&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="mh"&gt;0x3&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="mh"&gt;0x8&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nx"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;});&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;uuid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このコードは、特定のフォーマットの文字列内でランダムな数値を生成し、それをUUID形式に似せた文字列に置換しています。&lt;code&gt;Math.random()&lt;/code&gt;はランダムな数値を提供し、日時情報は生成される各UUIDに独自性を加えます。&lt;/p&gt;&#10;&lt;h3 id="コード解説"&gt;コード解説&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;Date().getTime()&lt;/code&gt;は、生成時刻のミリ秒単位のタイムスタンプを提供し、生成されるUUIDの一部として機能します。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;Math.random()&lt;/code&gt;は0から1未満のランダムな数値を生成し、これを16倍して、0から15の範囲の数値を生成します。&lt;/li&gt;&#10;&lt;li&gt;UUIDフォーマットの文字列テンプレート内の&lt;code&gt;x&lt;/code&gt;と&lt;code&gt;y&lt;/code&gt;は、ランダムまたは特定の規則に基づいて置換されます。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;x&lt;/code&gt;の位置は完全にランダムな値に置換されます。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;y&lt;/code&gt;の位置は、8, 9, A, またはBのいずれかに置換されることで、UUID v4の仕様に準じます。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="注意点"&gt;注意点&#10;&lt;/h3&gt;&lt;p&gt;この方法で生成されるUUIDは、厳密にはUUID v4の仕様に準じたものではありませんが、プロトタイピングや内部用途には十分なユニーク性を提供します。しかし、セキュリティが重要な用途では、暗号学的に安全なランダム値を生成する方法を検討する必要があります。&lt;/p&gt;&#10;&lt;p&gt;次は、「生成されるUUIDの限界と注意点」セクションを提案します。このセクションでは、純粋なJavaScriptで生成される擬似UUIDの特性と、使用する際に考慮すべき限界や注意点を説明します。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="生成されるuuidの限界と注意点"&gt;生成されるUUIDの限界と注意点&#10;&lt;/h2&gt;&lt;p&gt;純粋なJavaScriptを使用して擬似UUIDを生成する方法は、特定の状況やプロトタイピングには適していますが、実際のアプリケーションで使用する前に、その限界と潜在的な問題を理解することが重要です。&lt;/p&gt;&#10;&lt;h3 id="暗号学的な安全性の欠如"&gt;暗号学的な安全性の欠如&#10;&lt;/h3&gt;&lt;p&gt;前述の方法で使用される&lt;code&gt;Math.random()&lt;/code&gt;は、暗号学的に安全な乱数生成器ではありません。これは、生成される数値が予測可能なパターンを持つ可能性があることを意味し、セキュリティを要する用途には適していません。セキュリティが重要な場合は、より安全な乱数生成手段を検討する必要があります。&lt;/p&gt;&#10;&lt;h3 id="ユニーク性の保証の限界"&gt;ユニーク性の保証の限界&#10;&lt;/h3&gt;&lt;p&gt;この方法で生成されるUUIDは、高いユニーク性を提供するように設計されていますが、真のUUIDと比較すると、衝突（同一の値が生成されること）のリスクはわずかに高くなります。特に、大量のUUIDを短時間に生成する場合や、分散システムで広範に使用する場合は、その限界を考慮する必要があります。&lt;/p&gt;&#10;&lt;h3 id="予測可能性と再現性"&gt;予測可能性と再現性&#10;&lt;/h3&gt;&lt;p&gt;擬似UUIDは、&lt;code&gt;Date.now()&lt;/code&gt;と&lt;code&gt;Math.random()&lt;/code&gt;の組み合わせに基づいていますが、これらの値はある程度予測可能であり、完全にランダムではないため、特定のシナリオでは再現性が問題となる可能性があります。例えば、テスト環境では、一定の条件下で同じUUIDが再生成されることを避けたい場合があります。&lt;/p&gt;&#10;&lt;h3 id="使用する際のベストプラクティス"&gt;使用する際のベストプラクティス&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;セキュリティが重要な用途&lt;/strong&gt;: 暗号学的に安全な乱数生成器を使用するか、公式のUUID生成ライブラリを採用してください。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;大規模なアプリケーション&lt;/strong&gt;: UUIDの衝突リスクを最小限に抑えるために、より確立されたUUID生成方法を検討してください。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;プロトタイピングと開発初期段階&lt;/strong&gt;: この方法は、迅速な開発やプロトタイピングには適していますが、製品化する前にセキュリティとユニーク性の要件を再評価してください。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="まとめ"&gt;まとめ&#10;&lt;/h3&gt;&lt;p&gt;JavaScriptで生成される擬似UUIDは、多くの場合に便利で迅速な解決策を提供しますが、その使用には注意が必要です。生成されるUUIDの特性を理解し、アプリケーションの要件に基づいて適切な生成方法を選択することが、成功への鍵となります。&lt;/p&gt;&#10;&lt;h2 id="結論"&gt;結論&#10;&lt;/h2&gt;&lt;p&gt;この記事では、ライブラリや外部ツールを使用せずに、純粋なJavaScriptのみを用いて擬似UUIDを生成する方法について探求しました。このアプローチは、プロトタイピングや特定の開発環境において、外部依存性を最小限に抑えつつ一意の識別子を迅速に生成する必要がある場合に特に有効です。&lt;/p&gt;&#10;&lt;h3 id="主なポイントの再確認"&gt;主なポイントの再確認&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;外部依存性の最小化&lt;/strong&gt;: 純粋なJavaScriptでの擬似UUID生成は、外部ライブラリへの依存なしに実装できるため、プロジェクトの複雑さを減少させます。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;プロトタイピングと迅速な開発&lt;/strong&gt;: 開発の初期段階で迅速にプロトタイプを作成し、アイデアを検証する際に役立ちます。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;限界と注意点の理解&lt;/strong&gt;: 暗号学的な安全性や絶対的なユニーク性を保証するものではないため、使用する際にはその限界を理解し、適切な場面で使用することが重要です。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="使用する際の推奨事項"&gt;使用する際の推奨事項&#10;&lt;/h3&gt;&lt;p&gt;擬似UUIDの生成方法は、あくまで特定のシナリオや要件に応じた選択肢の一つです。セキュリティが重要なアプリケーションや、衝突のリスクを最小限に抑える必要がある場合は、より堅牢なUUID生成ライブラリの使用を検討してください。また、開発プロセスを通じて、プロジェクトのニーズに最も適した技術選択を行うことが重要です。&lt;/p&gt;&#10;&lt;h3 id="最後に"&gt;最後に&#10;&lt;/h3&gt;&lt;p&gt;純粋なJavaScriptでの擬似UUID生成方法は、JavaScriptの柔軟性と力強さを示す一例です。開発者として、利用可能なツールと技術を理解し、それらを創造的に適用することで、効率的かつ効果的なソリューションを生み出すことができます。この記事が、あなたのJavaScript開発の旅において有用な洞察を提供し、新たなアイデアの実現に役立つことを願っています。&lt;/p&gt;&#10;</description></item><item><title>JavaScriptでの配列ソート – 数値、文字列、オブジェクト</title><link>https://ai.hack-le.com/javascript-sort/</link><pubDate>Tue, 30 Jan 2024 19:01:36 +0900</pubDate><guid>https://ai.hack-le.com/javascript-sort/</guid><description>&lt;p&gt;データの並べ替えは、ソフトウェア開発における基本的でありながら重要なタスクの一つです。特に、Webアプリケーションやデータ処理システムでは、ユーザーが求める情報を素早く、効率的に提示するために、適切な順序でデータを表示することが不可欠です。JavaScriptにおいて、このようなソート操作は &lt;code&gt;Array.prototype.sort&lt;/code&gt; メソッドを用いて実現されます。このメソッドはその柔軟性から、様々なデータ型や複雑なデータ構造に対応可能です。&lt;/p&gt;&#10;&lt;p&gt;しかし、&lt;code&gt;sort&lt;/code&gt; メソッドの使用方法は初学者にとっては少し複雑に感じられるかもしれません。特に、異なるデータ型（数値や文字列）に基づいてソートを行う際の挙動の違いや、カスタムの比較関数の作成は、混乱の原因となり得ます。この記事では、JavaScriptでの配列ソートの基礎から、数値および文字列を基にしたソート方法までを、分かりやすく説明します。具体的なコード例を通じて、初心者でも簡単に理解できるように構成しています。&lt;/p&gt;&#10;&lt;p&gt;この記事を読むことで、読者の皆さんはJavaScriptの &lt;code&gt;sort&lt;/code&gt; メソッドの使い方を習得し、さらには実際の開発環境でのデータソートの応用についての理解を深めることができるでしょう。&lt;/p&gt;&#10;&lt;h2 id="javascriptの-sort-メソッドの基礎"&gt;JavaScriptの &lt;code&gt;sort&lt;/code&gt; メソッドの基礎&#10;&lt;/h2&gt;&lt;p&gt;JavaScriptの &lt;code&gt;Array.prototype.sort&lt;/code&gt; メソッドは、配列内の要素をソートするために広く使用されます。このメソッドは配列の元の順序を変更し、ソートされた配列を返します。デフォルトでは、&lt;code&gt;sort&lt;/code&gt; メソッドは要素を文字列に変換し、それらをUnicodeのポイント順にソートします。これは数値配列を扱う際には直感的でない結果をもたらすことがあります。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;33&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 出力: [2, 4，10, 33] とはならず、[10, 2, 33, 4] のように文字列の順番でソートされる&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この挙動を制御するためには、&lt;code&gt;sort&lt;/code&gt; メソッドに比較関数を提供する必要があります。この比較関数は2つの引数を取り、これらを比較してソート順を決定します。関数は次のような戻り値を持つべきです：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;0 より小さい値: 第一引数を第二引数より前に配置します。&lt;/li&gt;&#10;&lt;li&gt;0: 両引数の順序を変更しません。&lt;/li&gt;&#10;&lt;li&gt;0 より大きい値: 第二引数を第一引数より前に配置します。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;数値配列のソートには通常、単純な減算を使用します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;});&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 出力: [2, 4, 10, 33]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このセクションでは、&lt;code&gt;sort&lt;/code&gt; メソッドの基本的な使い方と、カスタム比較関数を使って配列をソートする方法について説明しました。次のセクションでは、これを数値と文字列のデータに具体的に適用する方法を詳しく見ていきます。&lt;/p&gt;&#10;&lt;h2 id="数値に基づく配列のソート"&gt;数値に基づく配列のソート&#10;&lt;/h2&gt;&lt;p&gt;JavaScriptにおける数値ソートは、配列の要素が数値の場合に特に重要です。前述の通り、&lt;code&gt;sort&lt;/code&gt; メソッドはデフォルトでは要素を文字列として扱い、それに基づいてソートを行います。しかし、数値データを扱う場合、このデフォルトの挙動は望ましい結果を得られません。数値の配列を適切にソートするには、カスタム比較関数を使用する必要があります。&lt;/p&gt;&#10;&lt;h3 id="昇順ソート"&gt;昇順ソート&#10;&lt;/h3&gt;&lt;p&gt;数値配列を昇順にソートするには、比較関数で単純な減算を用いるのが一般的です。これにより、小さい値から大きい値へと順序が決定されます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;33&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;});&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 出力: [2, 4, 10, 33]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="降順ソート"&gt;降順ソート&#10;&lt;/h3&gt;&lt;p&gt;一方、数値配列を降順にソートする場合は、比較関数で引数の順序を逆にします。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;});&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 出力: [33, 10, 4, 2]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この比較関数は、数値間の大小関係を適切に評価し、その結果に基づいて配列の要素を並べ替えます。昇順ソートでは、比較関数が負の値を返すとき（つまり、&lt;code&gt;a&lt;/code&gt; が &lt;code&gt;b&lt;/code&gt; より小さいとき）、&lt;code&gt;a&lt;/code&gt; を &lt;code&gt;b&lt;/code&gt; の前に配置します。降順ソートでは、この逆が適用されます。&lt;/p&gt;&#10;&lt;h2 id="文字列に基づく配列のソート"&gt;文字列に基づく配列のソート&#10;&lt;/h2&gt;&lt;p&gt;文字列データを含む配列のソートは、特にユーザーフレンドリーなインターフェースを提供する際に重要です。JavaScriptでは、文字列の比較に &lt;code&gt;localeCompare&lt;/code&gt; メソッドを使用するのが一般的です。このメソッドは、異なるロケールや文字の大小を考慮して、文字列を比較します。&lt;/p&gt;&#10;&lt;h3 id="昇順ソート-1"&gt;昇順ソート&#10;&lt;/h3&gt;&lt;p&gt;文字列の配列をアルファベット順（昇順）にソートするには、&lt;code&gt;localeCompare&lt;/code&gt; メソッドを比較関数に組み込むことができます。以下は、文字列配列を昇順にソートする簡単な例です。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;names&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Charlie&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Alice&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Bob&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;names&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;localeCompare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;});&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;names&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 出力: [&amp;#39;Alice&amp;#39;, &amp;#39;Bob&amp;#39;, &amp;#39;Charlie&amp;#39;]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="降順ソート-1"&gt;降順ソート&#10;&lt;/h3&gt;&lt;p&gt;文字列配列を逆アルファベット順（降順）にソートする場合、比較関数の引数の順序を逆にします。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;names&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;localeCompare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;});&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;names&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 出力: [&amp;#39;Charlie&amp;#39;, &amp;#39;Bob&amp;#39;, &amp;#39;Alice&amp;#39;]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ソートの応用と注意点"&gt;ソートの応用と注意点&#10;&lt;/h2&gt;&lt;p&gt;JavaScriptにおける &lt;code&gt;sort&lt;/code&gt; メソッドは非常に強力で、様々な応用が可能です。ただし、効果的に使用するにはいくつかの注意点を理解しておく必要があります。&lt;/p&gt;&#10;&lt;h3 id="オブジェクトを含む複合データ構造のソート"&gt;オブジェクトを含む複合データ構造のソート&#10;&lt;/h3&gt;&lt;p&gt;複雑なオブジェクトやマップを含む配列をソートする場合、カスタム比較関数を使用して特定のプロパティに基づいてソートすることができます。例えば、各オブジェクトが &lt;code&gt;age&lt;/code&gt; プロパティを持っている場合、以下のようにして年齢に基づいてソートすることが可能です。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;people&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Alice&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Bob&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Charlie&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;];&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;people&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;});&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="注意点"&gt;注意点&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;安定性&lt;/strong&gt;: &lt;code&gt;sort&lt;/code&gt; メソッドは、多くのブラウザで安定なソートを提供しますが、全てのJavaScriptエンジンで安定性が保証されているわけではありません。これは、等しい要素の相対的な順序が保持されるかどうかに影響します。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;パフォーマンス&lt;/strong&gt;: 大規模なデータセットをソートする場合、パフォーマンスに影響が出る可能性があります。特に、カスタム比較関数が複雑な場合、ソートの実行時間が長くなることがあります。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;エラー処理とデバッグ&lt;/strong&gt;: ソート操作中にエラーが発生することがあります。特に、未定義の値や互換性のないデータ型を含む配列をソートしようとすると問題が生じることがあります。比較関数内で適切な型チェックを行い、エラー処理を追加することをお勧めします。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;JavaScriptの &lt;code&gt;sort&lt;/code&gt; メソッドは、データを整理し、アプリケーションのユーザーインターフェイスを向上させるための強力なツールです。ただし、その使用方法や挙動を正しく理解し、特に大きなデータセットや複雑なオブジェクトを扱う際には注意が必要です。これらのガイドラインとヒントを活用して、より効率的で信頼性の高いソート操作を実現しましょう。&lt;/p&gt;&#10;&lt;h2 id="結論"&gt;結論&#10;&lt;/h2&gt;&lt;p&gt;この記事では、JavaScriptにおける &lt;code&gt;Array.prototype.sort&lt;/code&gt; メソッドの使用法、特に数値と文字列を基にしたソート方法に焦点を当ててきました。正しく理解し使用することで、&lt;code&gt;sort&lt;/code&gt; メソッドはデータを整理し、ユーザーフレンドリーなインターフェースの提供に大いに役立つことがわかります。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;数値データのソートでは、単純な算術比較を使用し、昇順や降順に効果的にソートすることができます。&lt;/li&gt;&#10;&lt;li&gt;文字列データの場合、&lt;code&gt;localeCompare&lt;/code&gt; メソッドを使用して、異なるロケールや特殊文字を考慮したソートが可能です。&lt;/li&gt;&#10;&lt;li&gt;さらに、複雑なデータ構造のソートや、大規模なデータセットの取り扱いにおいては、安定性やパフォーマンスに留意する必要があります。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;ソートは、データをユーザーに提示する方法を改善し、より良いユーザーエクスペリエンスを提供するための強力なツールです。この記事を通じて、JavaScriptにおける &lt;code&gt;sort&lt;/code&gt; メソッドの基本から応用までを理解し、日々の開発業務に活用していただければ幸いです。&lt;/p&gt;&#10;</description></item><item><title>WordPressで使用されていない画像を削除する方法：Media Cleanerプラグインの使い方</title><link>https://ai.hack-le.com/wordpress-media-cleaner/</link><pubDate>Tue, 31 Oct 2023 02:59:51 +0900</pubDate><guid>https://ai.hack-le.com/wordpress-media-cleaner/</guid><description>&lt;p&gt;WordPressのサイト運営をしていると、不要な画像やメディアファイルが増えてくることがあります。そんな時に役立つのが「Media Cleaner」というプラグインです。この記事では、Media Cleanerのインストールから使用方法までを詳しく解説します。&lt;/p&gt;&#10;&lt;h4 id="1-media-cleanerとは"&gt;1. Media Cleanerとは？&#10;&lt;/h4&gt;&lt;p&gt;Media Cleanerは、WordPressのメディアライブラリやuploadsディレクトリから使用されていないメディアファイルを検出し、削除するためのプラグインです。記事、ページ、カスタムポストタイプ、ウィジェットなど、さまざまな場所でのメディアの使用状況をチェックします。&lt;/p&gt;&#10;&lt;h4 id="2-インストールと有効化"&gt;2. インストールと有効化&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;WordPressのダッシュボードから「プラグイン」&amp;gt;「新規追加」に移動。&lt;/li&gt;&#10;&lt;li&gt;「Media Cleaner」を検索し、インストール後に有効化。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="3-基本設定の方法"&gt;3. 基本設定の方法&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;ダッシュボードの左側のメニューから「メディア」&amp;gt;「Cleaner」を選択。&lt;/li&gt;&#10;&lt;li&gt;「設定」タブに移動し、スキャンの範囲やチェックの対象を設定。例えば、メディアライブラリだけでなく、テーマやウィジェットの中もチェックするかどうかを選べます。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="4-使用されていないメディアの検出"&gt;4. 使用されていないメディアの検出&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;「ダッシュボード」タブに戻り、スキャンを開始。&lt;/li&gt;&#10;&lt;li&gt;スキャンが完了すると、使用されていないと検出されたメディアファイルのリストが表示。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="5-不要なメディアの削除方法"&gt;5. 不要なメディアの削除方法&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;表示されたリストを確認し、誤検出がないか手動でチェック。&lt;/li&gt;&#10;&lt;li&gt;使用されていないと確認されたメディアを選択し、「削除」ボタンをクリック。&lt;/li&gt;&#10;&lt;li&gt;必要に応じて、ゴミ箱から完全に削除するか、元に戻すことができます。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="6-まとめ"&gt;6. まとめ&#10;&lt;/h4&gt;&lt;p&gt;Media Cleanerを使用することで、不要なメディアファイルを効率的に整理し、サイトの容量を節約することができます。ただし、操作には注意が必要です。特に、使用前には必ずサイトのバックアップを取ることを忘れずに！&lt;/p&gt;&#10;</description></item><item><title>JavaScriptで配列から特定の条件に合致する要素を見つける方法</title><link>https://ai.hack-le.com/javascript-find/</link><pubDate>Mon, 07 Aug 2023 17:36:24 +0900</pubDate><guid>https://ai.hack-le.com/javascript-find/</guid><description>&lt;p&gt;JavaScriptでいつもどうやるんだっけって調べるやつ。ChatGPT-4にまとめさせた。&lt;/p&gt;&#10;&lt;h2 id="イントロ"&gt;イントロ&#10;&lt;/h2&gt;&lt;p&gt;配列から特定の条件に合致する要素を見つけることは、開発者が頻繁に遭遇する問題です。この記事では、その問題を解決するための4つの異なる方法を詳しく解説し、それぞれのメリットとデメリットを比較します。&lt;/p&gt;&#10;&lt;h2 id="findメソッドの使用"&gt;findメソッドの使用&#10;&lt;/h2&gt;&lt;h3 id="コード例"&gt;コード例&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;firstEvenNumber&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;number&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;number&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;firstEvenNumber&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 2&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="メリット"&gt;メリット&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;簡潔で読みやすい&lt;/li&gt;&#10;&lt;li&gt;意図が明確&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="デメリット"&gt;デメリット&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;一部の古いブラウザではサポートされていない可能性がある&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="forループの使用"&gt;&lt;code&gt;for&lt;/code&gt;ループの使用&#10;&lt;/h2&gt;&lt;h3 id="コード例-1"&gt;コード例&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;firstEvenNumber&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;firstEvenNumber&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;firstEvenNumber&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 2&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="メリット-1"&gt;メリット&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;基本的な方法で、ほとんどすべての環境で動作する&lt;/li&gt;&#10;&lt;li&gt;詳細な制御が可能&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="デメリット-1"&gt;デメリット&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;冗長で可読性が低下することがある&lt;/li&gt;&#10;&lt;li&gt;手動でのエラーが発生しやすい&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="someメソッドの使用"&gt;&lt;code&gt;some&lt;/code&gt;メソッドの使用&#10;&lt;/h2&gt;&lt;h3 id="コード例-2"&gt;コード例&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;firstEvenNumber&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;number&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;number&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;firstEvenNumber&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;});&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;firstEvenNumber&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 2&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="メリット-2"&gt;メリット&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;一致する要素を効率的に見つけることができる&lt;/li&gt;&#10;&lt;li&gt;標準的な配列メソッド&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="デメリット-2"&gt;デメリット&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;コードが少しトリッキーになる可能性がある&lt;/li&gt;&#10;&lt;li&gt;本来の用途とは異なる使い方になるため、意図が分かりづらい可能性がある&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="filterメソッドの使用"&gt;&lt;code&gt;filter&lt;/code&gt;メソッドの使用&#10;&lt;/h2&gt;&lt;h3 id="コード例-3"&gt;コード例&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;evenNumbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;number&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;number&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;evenNumbers&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// [2, 4, 6]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="メリット-3"&gt;メリット&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;複数の一致する要素を効果的に取得できる&lt;/li&gt;&#10;&lt;li&gt;コードが簡潔で意図が明確&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="デメリット-3"&gt;デメリット&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;一つだけを取得するのには非効率的&lt;/li&gt;&#10;&lt;li&gt;最初の一致する要素だけが必要な場合、追加の処理が必要になる&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="比較のまとめ"&gt;比較のまとめ&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;&lt;code&gt;find&lt;/code&gt;&lt;/strong&gt; : 最初に一致する要素を見つける場合に最も直感的。最新のブラウザでよくサポートされている。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;&lt;code&gt;for&lt;/code&gt;ループ&lt;/strong&gt;: 最も柔軟で、ほとんどの環境で動作するが、コードが冗長になる可能性がある。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;&lt;code&gt;some&lt;/code&gt;&lt;/strong&gt; : 一致する要素を見つけたいが、コードが少しトリッキーになる可能性がある。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;&lt;code&gt;filter&lt;/code&gt;&lt;/strong&gt; : 複数の一致する要素を取得するのに適しているが、一つだけを取得するのには最適ではない。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;code&gt;filter&lt;/code&gt;メソッドは、条件に合致する全ての要素を集めたい場合に使用すると効果的ですが、最初に合致する要素だけが欲しい場合には&lt;code&gt;find&lt;/code&gt;がより適切で効率的です。一方、特定の制御が必要な場合や非常に古いブラウザ環境をサポートする必要がある場合、&lt;code&gt;for&lt;/code&gt;ループの使用を検討することもあります。&lt;/p&gt;&#10;&lt;p&gt;JavaScriptで配列から特定の条件に合致する要素を見つける方法は多岐に渡ります。最適な方法を選ぶためには、使用状況、コードの可読性と保守性、互換性などを考慮する必要があります。この記事を参考に、プロジェクトに最適な方法を選んでください。&lt;/p&gt;&#10;&lt;h2 id="寸評"&gt;寸評&#10;&lt;/h2&gt;&lt;p&gt;よくまとまっている。こういうちょっとしたまとめ記事を書かせるには実に優秀だ。&lt;/p&gt;&#10;</description></item><item><title>WordPressでのシンタックスハイライトの導入</title><link>https://ai.hack-le.com/wordpress-syntax-highlighter/</link><pubDate>Thu, 27 Jul 2023 09:00:00 +0900</pubDate><guid>https://ai.hack-le.com/wordpress-syntax-highlighter/</guid><description>&lt;p&gt;このサイトにはプログラムのコードが多いので、さっさと入れるべきだったのだが、面倒臭くてしていなかった。これまでシンタックスハイライトはjsのライブラリを導入していたが、今となってはそんなことは面倒臭いので、プラグインを入れようと思っていた。しかしシンタックスハイライトのプラグインはたくさんあるので、どれがよいかわからず、手を付けられていなかった。&lt;/p&gt;&#10;&lt;p&gt;ChatGPT-4に聞けばいいんだと今更ながら気づき、色々聞いて導入した。まぁとりあえず動いている。以下、記事にまとめさせた。&lt;/p&gt;&#10;&lt;h2 id="イントロ"&gt;イントロ&#10;&lt;/h2&gt;&lt;p&gt;今回は、WordPressにシンタックスハイライトを導入する方法について説明します。シンタックスハイライトは、コードの読みやすさを向上させるための強力なツールです。&lt;/p&gt;&#10;&lt;p&gt;WordPressでコードのシンタックスハイライトを実装するには、主に以下の2つの方法があります。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;プラグインを使用する&lt;/li&gt;&#10;&lt;li&gt;CodeMirrorなどのライブラリを自分で導入する&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="プラグインを使用する"&gt;プラグインを使用する&#10;&lt;/h3&gt;&lt;p&gt;これは最も簡単で、特別な技術的スキルが必要ない方法です。プラグインをインストールし有効化するだけで、シンタックスハイライトが利用できるようになります。&lt;/p&gt;&#10;&lt;p&gt;以下にいくつかの一般的なプラグインを挙げておきます。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Prism.js: 非常に軽量で、多くのプログラミング言語をサポートしています。WordPress用のPrism.jsプラグインは、「WP PrismJS」などがあります。&lt;/li&gt;&#10;&lt;li&gt;SyntaxHighlighter Evolved: 古くからあるプラグインで、多くの言語に対応しています。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="codemirrorなどのライブラリを自分で導入する"&gt;CodeMirrorなどのライブラリを自分で導入する&#10;&lt;/h3&gt;&lt;p&gt;もしより細かい制御が必要であれば、自分でJavaScriptライブラリを導入するという選択肢もあります。この方法は、シンタックスハイライトを手動で実装することになりますが、コードの見た目や動作を完全にカスタマイズできる利点があります。&lt;/p&gt;&#10;&lt;p&gt;CodeMirrorやHighlight.jsなどのライブラリを導入することで、このタスクを達成できます。ただし、これらのライブラリを使ってシンタックスハイライトを手動で実装するには、JavaScriptとWordPressのテーマのカスタマイズに精通している必要があります。&lt;/p&gt;&#10;&lt;h2 id="syntaxhighlighter-evolvedの導入"&gt;SyntaxHighlighter Evolvedの導入&#10;&lt;/h2&gt;&lt;p&gt;Prism.jsやEnlighter - Customizable Syntax Highlighterといった有名なプラグインもありますが、今回は、シンプルさを最優先に考えるため、&lt;strong&gt;SyntaxHighlighter Evolved&lt;/strong&gt;を導入することにします。&lt;/p&gt;&#10;&lt;p&gt;このプラグインはWordPressのコミュニティで長い間利用されてきたものであり、その簡単さと信頼性が評価されています。特に設定を多く行う必要はなく、ショートコードを使用して簡単にブログ記事やページにコードブロックを挿入できます。&lt;/p&gt;&#10;&lt;p&gt;多くのプログラミング言語をサポートしており、その使いやすさと直感的な操作性は、シンプルさを追求するユーザーには特に魅力的です。そのため、特に高度なカスタマイズや特殊な機能を必要としないのであれば、SyntaxHighlighter Evolvedは非常に良い選択となります。&lt;/p&gt;&#10;&lt;h3 id="インストール"&gt;インストール&#10;&lt;/h3&gt;&lt;p&gt;まずはプラグインのインストールから始めましょう。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;WordPressの管理ダッシュボードにログインします。&lt;/li&gt;&#10;&lt;li&gt;左側のメニューバーから「プラグイン」を選択し、「新規追加」をクリックします。&lt;/li&gt;&#10;&lt;li&gt;検索バーに「SyntaxHighlighter Evolved」を入力し、該当するプラグインを見つけます。&lt;/li&gt;&#10;&lt;li&gt;「今すぐインストール」をクリックします。&lt;/li&gt;&#10;&lt;li&gt;インストールが完了したら、「有効化」をクリックします。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="コードブロックの追加"&gt;コードブロックの追加&#10;&lt;/h3&gt;&lt;p&gt;次に、記事にコードブロックを追加してみましょう。以下にその例を示します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[sourcecode language=&amp;#34;css&amp;#34;]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;your code here&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[/sourcecode]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ここで、&lt;code&gt;language=&amp;quot;css&amp;quot;&lt;/code&gt;の部分は、ハイライトを適用する言語に応じて変更します。たとえば、JavaScriptのコードをハイライトする場合は&lt;code&gt;language=&amp;quot;js&amp;quot;&lt;/code&gt;とします。&lt;/p&gt;&#10;&lt;p&gt;Gutenbergにおいては、ブロックも用意されています。&lt;/p&gt;&#10;&lt;h3 id="追加の設定必要に応じて"&gt;追加の設定（必要に応じて）&#10;&lt;/h3&gt;&lt;p&gt;SyntaxHighlighter Evolvedはデフォルトの状態でも非常に良く機能しますが、必要に応じてさまざまな設定を調整することもできます。設定はダッシュボードの左側のメニューバーから「設定」を選択し、「SyntaxHighlighter」をクリックすることで行えます。&lt;/p&gt;&#10;&lt;h3 id="既存の記事にシンタックスハイライトを適用する"&gt;既存の記事にシンタックスハイライトを適用する&#10;&lt;/h3&gt;&lt;p&gt;しかし、既存の記事にシンタックスハイライトを適用するには、各記事を手動で編集してショートコードを追加する必要があります。これは、特に記事数が多い場合、一見大変そうに見えます。&lt;/p&gt;&#10;&lt;p&gt;データベースの検索置換ツールを使用すれば、一部の作業を自動化できるかもしれません。しかし、この方法は非常に注意が必要です。誤った操作が行われるとサイトに重大な問題を引き起こす可能性があります。したがって、必ず事前にデータベースのバックアップを取るなど、安全な手順を踏むようにしてください。&lt;/p&gt;&#10;&lt;h2 id="まとめ"&gt;まとめ&#10;&lt;/h2&gt;&lt;p&gt;結局のところ、既存の記事をどのように処理するかはあなた次第です。あなたのサイトはあなた自身のものです。必要に応じて、時間を見つけて徐々に修正するか、あるいは、特定の記事だけ修正することも可能です。&lt;/p&gt;&#10;&lt;p&gt;それにより、少なくとも新しい記事については、きれいにシンタックスハイライトされたコードを含むことができます。これは、コードの読みやすさを向上させ、読者にとってより価値のあるコンテンツを提供するための一歩となります。&lt;/p&gt;&#10;&lt;h2 id="寸評"&gt;寸評&#10;&lt;/h2&gt;&lt;p&gt;プラグインの比較については色々と聞いたのだが、結局試したのはSynataxHighliter Evolvedだけなので、詳細につちえは省いた。まぁ十分ちゃんと動いているのでよしとする。&lt;/p&gt;&#10;&lt;p&gt;このサイトは比較的新しいサイトであるので、手動で全部置き換えることができたのだが、本館にあたる「&lt;a class="link" href="https://hack-le.com/" target="_blank" rel="noopener"&#10; &gt;或る阿呆の記 - 見栄を張らない、背伸びをしない。 私はただの阿呆です。 嘘です。 since 2012.10.17.&lt;/a&gt;」で手動による置き換えはさすがにつらい。これについては置換ツール（Better Search Replaceを勧められた）を使えという、まぁそうねという回答がきたのだが、調べたところなぜか&lt;code&gt;&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;&lt;/code&gt;と&lt;code&gt;&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;/code&gt;の数が合わないということが判明し、そのまま置き換えられねーというかなんで数あわねーんだぬおおぉぉみたいなことになり、挫けた。まぁどうせ昔の記事なんてほとんどアクセスもされないので、比較的アクセスの多い記事については気が向いた時に置き換えるくらいにしたいと思う。&lt;/p&gt;&#10;&lt;p&gt;以下は今回の質問。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;WordPressで、コードのシンタックスハイライトをいい感じで簡単に実装したい&lt;/li&gt;&#10;&lt;li&gt;特にこだわりはないので、簡単さのほうが大事だから、プラグインが良い。いくつかの有名なプラグインを比較してくれ。&lt;/li&gt;&#10;&lt;li&gt;柔軟性や機能の豊富さと簡単さはしばしばトレードオフの関係にある。見た感じこれらのプラグインも例に漏れないようだ。 僕は機能の豊富さや柔軟性よりもシンプルさを重視している。その観点では、君は何が良いと思う？&lt;/li&gt;&#10;&lt;li&gt;オーケー。SyntaxHighlighter Evolvedの使い方を教えてくれ。&lt;/li&gt;&#10;&lt;li&gt;なるほど便利だ。しかし、過去の記事にあるコードにこれを適用しなおすのはたいへんだ。なんとかならないか？&lt;/li&gt;&#10;&lt;li&gt;置換する手順を詳細かつ具体的に教えてくれ&lt;/li&gt;&#10;&lt;li&gt;ちょっと検索してみたら、なぜか&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;と&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;の数が合わなかったよ……。どうやら過去の記事はぐちゃぐちゃになっているようだ。 個人サイトだし、ちょっと調べる気力はないな……。&lt;/li&gt;&#10;&lt;li&gt;はぁ、まぁ、とりあえず新しい記事についてはSyntaxHighlighterを使っていくとしよう。 ここまでの話をブログの記事としてまとめてくれ。適切に見出しをつけてくれ。&lt;/li&gt;&#10;&lt;li&gt;他のプラグインも同様のことが言えるだろう。その中でSyntaxHighlighter Evolvedを選んだのは何故かについて書きたい。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;最後のほうの質問については、なんか適当なことを言い始めたので打ち切った。&lt;/p&gt;&#10;</description></item><item><title>Webhookとは何か？そして、なぜその名前なのか？</title><link>https://ai.hack-le.com/webhook/</link><pubDate>Thu, 13 Jul 2023 02:46:37 +0900</pubDate><guid>https://ai.hack-le.com/webhook/</guid><description>&lt;p&gt;Webhookはよく使われる言葉なので機能的にどんなものかは知っていたが、名前と機能がうまく結びついていなかったという。そしていまさら聞けないという。&lt;/p&gt;&#10;&lt;p&gt;それで、ChatGPT-4に記事を書かせてみた。何故かいつもと違ってものすごいフランクなノリでちょっと笑った。&lt;/p&gt;&#10;&lt;h2 id="イントロ"&gt;イントロ&#10;&lt;/h2&gt;&lt;p&gt;こんにちは！今日は、「Webhook」という言葉について深く掘り下げてみたいと思います。これはプログラミングの世界でよく使われる単語で、その機能をなんとなく理解している方も多いかと思います。しかし、「Webhook」が何を指していて、そして何故その名前なのかを具体的に説明することができるでしょうか？それでは、一緒に探求してみましょう。&lt;/p&gt;&#10;&lt;h2 id="webhookの機能"&gt;Webhookの機能&#10;&lt;/h2&gt;&lt;p&gt;まず、Webhookの基本的な機能から説明しましょう。Webhookとは、一つのウェブアプリケーションが特定のイベントが発生した時に、自動的に他のウェブサービスに通知するためのメカニズムです。この通知は通常HTTP POSTリクエストの形式で行われ、イベントが発生したときに別のウェブサービスがその情報を受け取り、適切なアクションを起こすことができます。このような機能はリアルタイムの通知やアクションを必要とする多くのウェブサービスやアプリケーションで活用されています。&lt;/p&gt;&#10;&lt;h2 id="webhookの実例-github"&gt;Webhookの実例: GitHub&#10;&lt;/h2&gt;&lt;p&gt;以下に、GitHubというバージョン管理システムを使用したWebhookの一例を挙げてみましょう。&lt;/p&gt;&#10;&lt;p&gt;GitHubは、コードのバージョン管理を行うためのプラットフォームで、その中にはWebhookの機能が含まれています。例えば、ある開発者がGitHubリポジトリに新たなコードをpushしたとき、その事実を他のシステムに通知したいとします。&lt;/p&gt;&#10;&lt;p&gt;その通知を受け取りたいシステム（例えば、連携しているCI/CD（Continuous Integration / Continuous Delivery）システム）には、その通知を受け取るためのURL（通常はAPIエンドポイント）が存在します。&lt;/p&gt;&#10;&lt;p&gt;GitHubのリポジトリの設定に行き、Webhookを設定します。その際、通知先のURL（CI/CDシステムのエンドポイント）と、どのようなイベントが起きた時に通知を送るのか（この場合、新しいコードがpushされたとき）を設定します。&lt;/p&gt;&#10;&lt;p&gt;このWebhookが設定された後は、指定されたリポジトリに新しいコードがpushされる度に、GitHubは自動的に通知先のURL（CI/CDシステム）にHTTP POSTリクエストを送信します。このリクエストには、どのリポジトリで何が起きたのかについての詳細な情報が含まれます。&lt;/p&gt;&#10;&lt;p&gt;これを受け取ったCI/CDシステムは、新しいコードがpushされたことを知り、例えば新しいコードのビルドとテストを自動的に始めることができます。&lt;/p&gt;&#10;&lt;p&gt;このように、Webhookは一つのシステムが他のシステムにリアルタイムの情報を送るための非常に有効なツールです。&lt;/p&gt;&#10;&lt;h2 id="なぜwebhookというのか"&gt;なぜWebhookというのか？&#10;&lt;/h2&gt;&lt;p&gt;さて、ではこの「Webhook」という言葉は何故このように名付けられたのでしょうか？&lt;/p&gt;&#10;&lt;p&gt;この疑問に答えるためには、「Webhook」という言葉を二つに分け、「Web」と「hook」をそれぞれ理解することから始めてみましょう。「Web」は、この機能がインターネットを通じて動作することを指しています。一方、「hook」はプログラミングの世界で特定のイベントや動作が発生したときに実行される関数やルーチンを指す一般的な用語です。&lt;/p&gt;&#10;&lt;p&gt;この二つの単語を合わせると、「Webhook」はインターネット上で何か特定の事が起きたときに呼び出される、つまり&amp;quot;hooked&amp;quot;または&amp;quot;hooked into&amp;quot;されるウェブベースのコールバックルーチンを指します。つまり、それはあるサービスから別のサービスへ情報を「転送」する役割を果たします。&lt;/p&gt;&#10;&lt;p&gt;言い換えれば、Webhookは「Web上でhookされるコールバック」という概念を表しているのです。その名前はその機能から直接導き出されています。特定のイベントが発生したときに、事前に設定された「hook」（アクション）がWebを通じて自動的に呼び出されます。&lt;/p&gt;&#10;&lt;p&gt;このように考えると、「Webhook」という言葉はその名の通り、Web上の特定のイベントに「hook」または「引っ掛け」を設定し、それによって特定のアクションが自動的に実行される仕組みを表しているのです。&lt;/p&gt;&#10;&lt;p&gt;今日の記事が、Webhookという言葉とその背後の意味を理解する一助となれば幸いです。Webhookはその名が示す通り、Web上で起きるイベントに反応し、特定のアクションを引き起こす「引っ掛け」のような役割を果たします。この理解を持つことで、より深くWebhookの世界を理解し、活用することができるでしょう。&lt;/p&gt;&#10;&lt;h2 id="寸評"&gt;寸評&#10;&lt;/h2&gt;&lt;p&gt;ということで、普通にためになってしまった。いまさら聞けないけど微妙に調べづらいこういうニュアンスを解説してくれるのはありがたいなと思う。Webとhookの言葉の繋がりが見えてなかったから、なんかしっくりこなかったんだろうな。&lt;/p&gt;&#10;&lt;p&gt;以下に質問を書いておきます。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Webhookは何故Webhookというのでしょうか。転送っぽいイメージなのですが。&lt;/li&gt;&#10;&lt;li&gt;ああ、なるほど。Webもhookもそれぞれわかってはいたが、その繋がりが見えていなかったらしっくりきてなかったのかもしれない。Web上でhookedされるコールバックというような感じか。&lt;/li&gt;&#10;&lt;li&gt;僕がしっくりきていなかったのは、Webとhookの関係が、Webhookという言葉からわからなかったからなんだろうな。なるほどね。&lt;/li&gt;&#10;&lt;li&gt;ここまでの議論をブログの記事としてまとめてください。 私はWebhookという言葉も、その機能もなんとなく理解していたにも関わらず、しっくりきてはいませんでした。私のような人に向けた記事です。 ですから、Webhookという言葉がさすところは何かだけではなく、なぜそのように呼ばれるのかが理解できるように書いてください。&lt;/li&gt;&#10;&lt;li&gt;Webhookの実例を一つあげてくれますか。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;最初に書かせたものは見出しもなく、概念的な解説だけだった。なので、実例を一つあげさせた。&lt;/p&gt;&#10;</description></item><item><title>WordPressのエディタ選択: Gutenbergとクラシックエディタの存在理由と選択ガイド</title><link>https://ai.hack-le.com/wordpress-gutenberg/</link><pubDate>Fri, 30 Jun 2023 00:45:50 +0900</pubDate><guid>https://ai.hack-le.com/wordpress-gutenberg/</guid><description>&lt;p&gt;これは私がクラシックエディタの存在意義についてChatGPT-4に書かせたものである。私自身は複数のブログを運営しており、Gutenbergをメインにしているものもあれば、クラシックエディタをメインにしているものもある。どちらにも良いところと悪いところがあるわけだが、基本的には新しいエディタであるGutenbergが推奨される。というか、Gutenbergが出てもう何年もたっているのに、未だにクラシックエディタは健在である。それはいったいぜんたいどういうことだ、ということについての記事である。&lt;/p&gt;&#10;&lt;h2 id="はじめに"&gt;はじめに&#10;&lt;/h2&gt;&lt;p&gt;WordPressユーザーにとって、記事やページの作成と編集は日々の重要なタスクの一つです。そのため、使用するエディタの選択は、作業の効率性、使いやすさ、そして最終的なコンテンツの品質に大きな影響を与えます。WordPressでは、現在、二つの主要なエディターが提供されています: Gutenbergとクラシックエディタ。しかし、これらの違いとどちらを選ぶべきかは一見すると明確ではありません。ここでは、両者の特性を詳しく見ていき、どちらのエディタがあなたに適しているかを判断するためのガイドを提供します。&lt;/p&gt;&#10;&lt;h2 id="gutenbergとクラシックエディタの違い"&gt;Gutenbergとクラシックエディタの違い&#10;&lt;/h2&gt;&lt;p&gt;まず最初に、それぞれのエディタの特性と機能を理解することが重要です。&lt;/p&gt;&#10;&lt;p&gt;Gutenbergは、ブロックベースのエディタで、視覚的なレイアウトとデザインに重点を置いています。それは特に、画像、ビデオ、カラムレイアウトなどを頻繁に使用するユーザーにとって有用です。視覚的なエディタとして、ユーザーは自由にブロックを移動、編集、または削除することができ、より直感的なビジュアル編集体験を提供します。&lt;/p&gt;&#10;&lt;p&gt;一方、クラシックエディタはより伝統的なWordPressエディタで、テキストエディタと視覚エディタの間で切り替える選択肢があります。これはテキストベースのコンテンツとHTMLコードを直接編集する能力を必要とする人々にとっては便利な機能かもしれません。&lt;/p&gt;&#10;&lt;h2 id="なぜクラシックエディタは依然として存在しているのか"&gt;なぜクラシックエディタは依然として存在しているのか&#10;&lt;/h2&gt;&lt;p&gt;それぞれのエディタには独自の利点があり、WordPressユーザーの間でそれぞれ異なるニーズを満たしています。Gutenbergは多くの点で魅力的なエディタですが、すべてのユーザーや状況に対して最適とは限りません。その一部を以下に挙げます。&lt;/p&gt;&#10;&lt;h3 id="テキストヘビーなブログ"&gt;テキストヘビーなブログ&#10;&lt;/h3&gt;&lt;p&gt;Gutenbergは視覚的な要素とレイアウトが多いサイトに最適化されています。しかし、主にテキストベースのコンテンツを提供するブログや、コードスニペットや引用などの特定のテキスト要素を頻繁に使用するウェブサイトでは、クラシックエディタの方がより直感的で使いやすい場合があります。&lt;/p&gt;&#10;&lt;h3 id="高度なカスタマイゼーションの必要性"&gt;高度なカスタマイゼーションの必要性&#10;&lt;/h3&gt;&lt;p&gt;Gutenbergは便利なブロックを提供していますが、それらのブロックのカスタマイゼーションは限定的です。HTMLやCSSのようなウェブ言語に精通していて、独自のカスタマイゼーションを高度に適用したいユーザーにとっては、クラシックエディタの方が直接的なコード編集の能力を提供するため、より魅力的な選択肢となるかもしれません。&lt;/p&gt;&#10;&lt;h3 id="特定のプラグインやテーマの依存"&gt;特定のプラグインやテーマの依存&#10;&lt;/h3&gt;&lt;p&gt;一部のプラグインやテーマは、Gutenbergではなくクラシックエディタに最適化されているか、または両方をサポートしていません。したがって、これらのプラグインやテーマに依存している場合、Gutenbergの使用は制限される可能性があります。&lt;/p&gt;&#10;&lt;p&gt;ただし、古いプラグインやテーマには、セキュリティなどの観点で別の問題を抱えていることにも留意すべきです。&lt;/p&gt;&#10;&lt;h3 id="学習曲線"&gt;学習曲線&#10;&lt;/h3&gt;&lt;p&gt;最後に、長年にわたりWordPressを使用してきたユーザーの中には、クラシックエディタの使いやすさと見覚えのあるインターフェースのほうが好ましいを感じられる人もいるでしょう。新しいシステムを学ぶことなく、すぐに編集作業を開始できることは、継続的にコンテンツを提供するために重要な要素です。&lt;/p&gt;&#10;&lt;h2 id="新規参加者にとってなぜgutenbergがおすすめなのか"&gt;新規参加者にとって、なぜGutenbergがおすすめなのか&#10;&lt;/h2&gt;&lt;p&gt;これらの理由にもかかわらず、新規のWordPressユーザーに対しては、まずGutenbergを試すことをお勧めします。その理由は、Gutenbergが現在のデフォルトのエディタであり、今後のアップデートと新機能のサポートが続くと考えられるからです。&lt;/p&gt;&#10;&lt;p&gt;GutenbergはWordPressの未来のデザインと機能の方向性を示しています。ブロックベースの設計は、編集体験をより直感的で視覚的にするだけでなく、柔軟性と拡張性も提供します。ユーザーは個々のブロックを使ってページを自由に設計し、各ブロックを個別にカスタマイズすることができます。&lt;/p&gt;&#10;&lt;p&gt;さらに、新機能や改善はまずGutenbergに導入され、新しいテーマやプラグインはGutenbergとの互換性を保証する傾向があります。これは、Gutenbergを学ぶことが、最新のWordPress機能を活用するための重要なステップであることを示しています。&lt;/p&gt;&#10;&lt;h2 id="最終的な選択はユーザーのニーズによる"&gt;最終的な選択はユーザーのニーズによる&#10;&lt;/h2&gt;&lt;p&gt;最終的には、どのエディタを選ぶべきかは、その人が何を求めているか、どのようなスキルや経験を持っているかによります。したがって、最適なエディタを見つけるためには、両方のエディタを試し、自分のニーズと作業フローに最も適しているものを選ぶことをお勧めします。&lt;/p&gt;&#10;&lt;p&gt;しかし、今後のことを考えると、新規のWordPressユーザーは、まずGutenbergを試すことを強くお勧めします。現在のデフォルトのエディタとして、そしてWordPressの未来のデザインと機能の方向性を示しているためです。クラシックエディタはまだ有効な選択肢であり続けますが、新しいユーザーはGutenbergに触れ、その機能と可能性を試すことで、最新のWordPress機能を最大限に活用するための基盤を築くことができます。&lt;/p&gt;&#10;&lt;h2 id="寸評"&gt;寸評&#10;&lt;/h2&gt;&lt;p&gt;僕はクラシックエディタとGutenbergの両方を使っている。このChatGPT-4の回答は、概ね悪くないものだと思う（まぁそのように誘導したとも言えるが…）。&lt;/p&gt;&#10;&lt;p&gt;以下のような質問をした。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;WordPressのGutenbergはクラシックエディタと比べた時、すべての人にとって推奨されるエディタだと言えるか。&lt;/li&gt;&#10;&lt;li&gt;シンプルな編集体験を求めるのは、具体的にどんな人か&lt;/li&gt;&#10;&lt;li&gt;私自身、Gutenbergをメインで使っているブログとクラシックエディタをメインで使っているブログに分かれている。テキストベースのブログでクラシックエディタを今も使っており、実際、機能的にもクラシックエディタのほうが優れていると感じることが多い。Gutenbergではタブキーで箇条書きのインデントを下げるといった、通常テキストエディタに期待されるような機能もなかったりする。 2つの形式をサポートするのはWordPressにとっても負荷が大きいと思うが、実際的に両方に向き不向きがあると感じる。Gutenbergに統一されることはあるのだろうか。&lt;/li&gt;&#10;&lt;li&gt;これからWordPressを始めようという人に、あえてクラシックエディタを勧める理由はあるだろうか。それとも、たとえテキストベースのブログであったとしても、今後のことを考えると、総合的にGutenbergを勧めるべきか。&lt;/li&gt;&#10;&lt;li&gt;ここまでの話を、長くなってもよいのでしっかりとした記事としてまとめてください。特に、今でもクラシックエディタがなくならない理由には必ず触れてください。そのうえでなお、新規参加者はまずGutenbergに触れたほうがよいのは何故かについても書いてください。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;ポイントとして、最初の質問で「すべての」という修飾を入れた。普通に聞けばChatGPT-4がGutenbergを勧めるのは明らかだったからだ。しかし、ChatGPTは「すべて」について語ることを避ける。そこで、「すべての人に勧められるか」を聞いて、勧められないパターンについて言及させた感じだ。&lt;/p&gt;&#10;&lt;p&gt;まぁ、僕自身もこれから始める人がわざわざクラシックエディタから選ぶ必要はないかなと思う。とはいえ、クラシックエディタで既にサイトを運営していてかつ、テキスト主体のブログの人が、あえてGutenbergに乗り換える理由も薄いだろう。&lt;/p&gt;&#10;</description></item><item><title>WordPressにおける画像リサイズの抑制</title><link>https://ai.hack-le.com/wordpress-image-resize/</link><pubDate>Wed, 28 Jun 2023 23:57:16 +0900</pubDate><guid>https://ai.hack-le.com/wordpress-image-resize/</guid><description>&lt;p&gt;このサイトはWordPressで構築している。WordPressではメディアをアップロードすると、複数のサイズのものが自動的に生成される。これは主にパフォーマンスのためだ。なのだが、サイトの性質によってはストレージ容量を圧迫するデメリットのほうが大きいと判断される場合もある。&lt;/p&gt;&#10;&lt;p&gt;ということで、自動リサイズを抑制するにはどうしたらよいか、ChatGPT-4に聞いた。&lt;/p&gt;&#10;&lt;h2 id="イントロ"&gt;イントロ&#10;&lt;/h2&gt;&lt;p&gt;WordPressでは、画像をアップロードすると自動的に複数のサイズが生成されます。これはテーマやプラグインがそれぞれ異なるサイズの画像を必要とするためであり、また、レスポンシブデザインを適用するためにも必要です。しかし、これらの自動生成される画像は、一部のユーザーにとっては不必要なディスク容量を占有する可能性があります。&lt;/p&gt;&#10;&lt;h2 id="抑制する方法"&gt;抑制する方法&#10;&lt;/h2&gt;&lt;p&gt;WordPressの画像生成を抑制する方法はいくつかあります：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;Media Settingsを調整する&lt;/strong&gt;: WordPressの「Settings」-&amp;gt;「Media」から各画像サイズを0pxに設定すると、WordPressはそのサイズの画像を生成しなくなります。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;プラグインを使用する&lt;/strong&gt;: 「Stop Generating Unnecessary Thumbnails」や「Disable Media Sizes」のようなプラグインを利用すると、自動生成される画像のサイズを制御できます。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;functions.phpにコードを追加する&lt;/strong&gt;: テーマのfunctions.phpファイルに特定のコードを追加すると、特定の画像サイズの生成を停止できます。ただし、これには開発者スキルが必要であり、テーマの更新時に変更が上書きされる可能性もあります。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;しかし、これらの手法を適用する際には注意が必要です。特に、現在使用しているテーマやプラグインが特定の画像サイズを必要としている場合や、レスポンシブデザインを適切に機能させるためには、これらの自動生成される画像が必要な場合があります。&lt;/p&gt;&#10;&lt;p&gt;特に、WordPress 4.4以降で追加された「medium_large」サイズは、メディア設定からは設定できませんが、これはモバイルやタブレットなどのデバイスでの表示性能を向上させるために重要です。このサイズを無効にすると、一部のデバイスでの読み込み速度が低下する可能性があります。&lt;/p&gt;&#10;&lt;h2 id="未検証-medium_large-を生成しない方法"&gt;(未検証) medium_large を生成しない方法&#10;&lt;/h2&gt;&lt;p&gt;もし「medium_large」サイズの画像も生成しないようにしたい場合は、先ほどご紹介したfunctions.phpへのコード追加の方法を利用すると良いでしょう。以下のコードをあなたのテーマのfunctions.phpファイルに追加すれば、「medium_large」サイズの画像の生成を停止できます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;add_action( &amp;#39;init&amp;#39;, &amp;#39;remove_plugin_image_sizes&amp;#39; );&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;function remove_plugin_image_sizes() {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; remove_image_size( &amp;#39;medium_large&amp;#39; );&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ただし、これを行うと、一部のレスポンシブデザインの要素がうまく機能しなくなる可能性があるので、注意してください。&lt;/p&gt;&#10;&lt;h2 id="wordpressで画像のサイズを確認する方法"&gt;WordPressで画像のサイズを確認する方法&#10;&lt;/h2&gt;&lt;p&gt;WordPressが自動的に生成した画像のサイズを確認するには、主に以下の2つの方法があります。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;FTPクライアントまたはcPanelのファイルマネージャを使用する&lt;/strong&gt;:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;FTPクライアント（FileZillaなど）またはcPanelのファイルマネージャを使用して、サーバー上のWordPressインストールフォルダにアクセスします。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;wp-content/uploads&lt;/code&gt;ディレクトリに移動します。このディレクトリには、アップロードされたすべてのメディアファイルが保存されています。&lt;/li&gt;&#10;&lt;li&gt;年と月ごとにフォルダが分けられています。新しく画像をアップロードしたら、対応する年と月のフォルダに移動します。&lt;/li&gt;&#10;&lt;li&gt;アップロードした画像のバリエーションを見ることができます。もし設定した通りに特定のサイズの画像が生成されていなければ、それは成功している証拠です。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;ol start="2"&gt;&#10;&lt;li&gt;&lt;strong&gt;WordPressのメディアライブラリから確認する&lt;/strong&gt;:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;WordPressのダッシュボードにアクセスして、「メディア」-&amp;gt;「ライブラリ」に移動します。&lt;/li&gt;&#10;&lt;li&gt;アップロードした画像をクリックし、「編集」を選択します。&lt;/li&gt;&#10;&lt;li&gt;「ファイル URL」フィールドを見ると、画像のバリエーションが表示されます。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;どちらの方法も手動で確認する方法ですが、直接サーバー上のファイルを調べる方がより確実です。&lt;/p&gt;&#10;&lt;h2 id="まとめ"&gt;まとめ&#10;&lt;/h2&gt;&lt;p&gt;WordPressでの画像サイズ生成は、ディスク容量と表示性能のトレードオフを考慮する必要があります。そのバランスは、サイトの内容、訪問者のデバイスの種類、ホスティング環境などによります。ディスク容量を節約することは重要ですが、それがユーザ体験の悪化を引き起こすならば、ある程度のディスク容量の増加を受け入れることが合理的な選択と言えるでしょう。&lt;/p&gt;&#10;&lt;h2 id="寸評"&gt;寸評&#10;&lt;/h2&gt;&lt;p&gt;これは僕が実際にChatGPTに相談して、かつその挙動を確認したものだ。したがって内容に嘘はないはず。&lt;/p&gt;&#10;&lt;p&gt;結論として、僕はlarge sizeのみ抑制するようにした。というのも、メインであげる画像のsizeがlarge sizeと近かったからである。small sizeとmedium sizeについては、なくても僕の使うテーマでは挙動に問題は見られなかったものの、元画像の1/10程度まで容量が圧縮されるので、たとえ作られても全体の影響はさほどでもないと考えた。一方で、large sizeについては、元画像とあまり変わりがない。なくてもテーマには影響がなかったし、あまり意味がないと考えた。これによって、3割程度の容量を節約できる見込みだ。&lt;/p&gt;&#10;&lt;p&gt;ということで、このやりとりはけっこう僕にとって有意義だった。このまとめは、他のユーザにとっても有意義ではなかろうか。以下に質問を書く。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;WordPressでは画像を上げると自動的に複数のサイズでリサイズされて保存されますが、それによる容量がもったいないです。抑制することはできますか。&lt;/li&gt;&#10;&lt;li&gt;メディアの設定による方法がもっとも簡単そうですね。それを実行するにあたって、注意すべきことはありますか。&lt;/li&gt;&#10;&lt;li&gt;複数のサイズが生成されていないことを実際に確認するには、どうしたらいいですか&lt;/li&gt;&#10;&lt;li&gt;調べてみたところ、オリジナルサイズ以外に4つのサイズができていたものが、1つまで減っていました。 設定画面ではサムネイルサイズ、ミディアムサイズ、ラージサイズの3つについて設定できました。 どうやら、メディア画面からは残り1つのサイズについては制御できないようですね。&lt;/li&gt;&#10;&lt;li&gt;なるほど。 しかしメディア画面で設定できないようにしているのには、理由があるかもしれません。 また、functions.phpの改修は、今後のメンテナンスを考えるとできれば避けたいところです。 容量が1.5倍ほどになってしまうのは少し痛いですが、これくらいは受容すべきかもしれません。&lt;/li&gt;&#10;&lt;li&gt;ここまでの議論を、記事にまとめてください。&lt;/li&gt;&#10;&lt;li&gt;確認方法についても、以下にまとめてください。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;確認方法をスキップするのは非常によろしくなかったが、指摘すれば書いてくれる。&lt;/p&gt;&#10;</description></item><item><title>SPAのアップデート戦略：データベースの整合性と後方互換性</title><link>https://ai.hack-le.com/spa/</link><pubDate>Wed, 28 Jun 2023 21:53:22 +0900</pubDate><guid>https://ai.hack-le.com/spa/</guid><description>&lt;p&gt;シングルページアプリケーション（SPA）は、ユーザ体験を改善するための重要な技術の一つですが、そのアップデート戦略はしっかりと考える必要があります。特に、データベース操作に影響を与えるアップデートがある場合、ユーザーが旧バージョンを使用し続けるとデータベースの不整合が生じる可能性があります。今回は、この問題を解決するためのアプローチについて考えてみましょう。&lt;/p&gt;&#10;&lt;h2 id="バックワードコンパチビリティ後方互換性の確保"&gt;バックワードコンパチビリティ（後方互換性）の確保&#10;&lt;/h2&gt;&lt;p&gt;SPAの新バージョンがリリースされたとき、すべてのユーザーがすぐに新しいバージョンに移行するわけではありません。このため、新旧の両方のバージョンで問題なく動作できるよう、データベースのスキーマ変更や操作方法を設計することが重要です。&lt;/p&gt;&#10;&lt;p&gt;新しいバージョンがデータベースに新しいフィールドを追加する場合、そのフィールドが旧バージョンで不在でもアプリケーションが正しく動作するようにすべきです。また、新しいバージョンが既存のフィールドを削除する場合、そのフィールドが存在しても新バージョンのアプリケーションが問題なく動作するように設計する必要があります。&lt;/p&gt;&#10;&lt;h2 id="データ移行の実施"&gt;データ移行の実施&#10;&lt;/h2&gt;&lt;p&gt;場合によっては、新しいバージョンのリリースに伴ってデータベースの大きな変更が必要になることもあります。このような場合、データの移行（マイグレーション）が不可欠となります。マイグレーションスクリプトを作成し、新旧バージョン間のデータ変換を自動化することで、データベースの整合性を保つことが可能です。&lt;/p&gt;&#10;&lt;p&gt;ただし、データ移行は複雑で時間がかかる作業であるため、計画的に進める必要があります。また、マイグレーション中に問題が生じた場合のロールバック戦略も事前に考えておくことが重要です。&lt;/p&gt;&#10;&lt;h2 id="バージョン通知の最適化"&gt;バージョン通知の最適化&#10;&lt;/h2&gt;&lt;p&gt;最後に、新バージョンのリリースをユーザーに効率的に通知する方法を考えることも重要です。リアルタイムリスナーやポーリングなどの技術を用いて、新バージョンがリリースされたことをユーザーに知らせ、可能な限り早く更新を促すことが理想的です。ただし、ユーザーが入力中の情報を失わないように、リロードのタイミングには配慮が必要です。&lt;/p&gt;&#10;&lt;p&gt;以上のようなアプローチにより、SPAの新しいバージョンのリリースがデータベースの不整合を引き起こす問題を防ぐことが可能となります。どの手法を採用するにしても、アプリケーションの設計段階からこれらの問題を考慮することで、将来的な問題を防ぐことができます。&lt;/p&gt;&#10;&lt;h2 id="寸評"&gt;寸評&#10;&lt;/h2&gt;&lt;p&gt;なんかタメになるようなならんような。主にFirebaseでの操作を念頭に起きながら、以下のような質問をした。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;SPAの課題の一つとして、リリース内容が即座にクライアントに反映されない問題があると思います。これは特にDBの操作までフロントエンドで定義するFirebaseでは深刻に思います。&lt;/li&gt;&#10;&lt;li&gt;リアルタイムリスナーでバージョンを常に監視し、バージョンが上がった場合は、リロードを促したりする設計が考えられますかねぇ。&lt;/li&gt;&#10;&lt;li&gt;たとえば投稿サイトで、投稿内容を入力中にリロードを促されると、あまり良い体験とは言えませんね。そういう時はどうしたらいいでしょうか。&lt;/li&gt;&#10;&lt;li&gt;ふむ。保存などのタイミングでバージョン更新させるようなアクションを追加することもできそうです。 いずれにせよ、ユーザにストレスを与えず、かつシステムに支障がないようにバージョンをアップデートさせるには、あらかじめそれができるような仕組みを仕込んでおくことが必要になりますね。難しいな。&lt;/li&gt;&#10;&lt;li&gt;ここまでの話を記事としてまとめてください。&lt;/li&gt;&#10;&lt;li&gt;特定の部分だけを動的に更新する仕組み、がよく理解できない。この部分を説明してくれ。&lt;/li&gt;&#10;&lt;li&gt;「部分的な更新は新しいバージョンのリリースと同時に実施することも可能」について詳しく説明してくれ&lt;/li&gt;&#10;&lt;li&gt;つまり、全体を一度のビルドしなおすのではなく、特定の部分のみが置き換わるようにビルドするということか？&lt;/li&gt;&#10;&lt;li&gt;理解した。 しかし、少し論点がズレてきているな。 そもそも何故リリースの反映が遅れると困るかといえば、データベースの操作に変更があるような更新の場合、更新されないままユーザにアクションを起こされると、データベースに不整合などが生じうるためだ。 この問題を解決するには、結局のところ新旧どちらのバージョンでも問題ないように設計し、場合によってはしばらくバッチ処理などでデータベースの手当をしながら移行するということになるだろうか。&lt;/li&gt;&#10;&lt;li&gt;OK。このデータベースの整合について特に焦点をあてて、SPAのあるべきアップデート戦略について、記事を書いてくれ。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;10回も質問していたのか……。&lt;/p&gt;&#10;&lt;p&gt;まぁ結局のところ、アップデートがあっても困らないように、事前に設計して仕込みをしておく、ということになるのだろう。うーん、まぁそりゃそうだろうけどさ。ううん。&lt;/p&gt;&#10;</description></item><item><title>無料ブログプラットフォームとWordPress: 所有権がもたらす影響とその重要性</title><link>https://ai.hack-le.com/blog-wordpress/</link><pubDate>Tue, 27 Jun 2023 01:31:32 +0900</pubDate><guid>https://ai.hack-le.com/blog-wordpress/</guid><description>&lt;p&gt;デジタル時代において、オンラインでの情報発信は個々人だけでなく、ビジネスにとっても不可欠な要素となりました。そのためにはブログやウェブサイトが重要なツールとなりますが、その運営方法やプラットフォーム選びについて迷うことは少なくありません。この記事では、無料のブログプラットフォームとWordPressの違い、特に「所有権」の観点からその違いがもたらす影響について掘り下げていきます。&lt;/p&gt;&#10;&lt;h2 id="無料ブログプラットフォームとは"&gt;無料ブログプラットフォームとは&#10;&lt;/h2&gt;&lt;p&gt;無料のブログプラットフォーム、例えばBloggerやTumblrなどは、非常に手軽に始めることができるのが大きな特徴です。多くのテンプレートや基本的なカスタマイズオプションが提供されており、技術的な知識がほとんどなくてもブログの運営を始めることができます。一方で、その手軽さの裏には所有権の制限や機能の制約があります。&lt;/p&gt;&#10;&lt;h2 id="wordpressとは"&gt;WordPressとは&#10;&lt;/h2&gt;&lt;p&gt;WordPressは世界で最も広く使用されているコンテンツ管理システム（CMS）の一つで、特に自己ホストのWordPress.orgは、ユーザーに高度なカスタマイズ性と所有権を提供します。しかし、その一方で、一定の技術的知識や初期設定、メンテナンスが必要となります。&lt;/p&gt;&#10;&lt;h2 id="所有権とは"&gt;所有権とは&#10;&lt;/h2&gt;&lt;p&gt;所有権とは、あなたのウェブサイトとそのすべてのコンテンツを完全に制御する能力を指します。これは自分のサイトのデザイン、機能、SEO設定、データの管理など、ウェブサイト全体に対する絶対的な権利を含んでいます。WordPressを使用すれば、これら全てを自由自在にコントロールすることが可能です。&lt;/p&gt;&#10;&lt;h2 id="所有権の重要性"&gt;所有権の重要性&#10;&lt;/h2&gt;&lt;p&gt;所有権は、ウェブサイトの長期的な成功と成長に対する重要な要素です。それはサイトの見た目や機能を自分のニーズに合わせて調整できる自由度、SEOの最適化による訪問者の増加、そしてブランド価値の確立に寄与します。さらに、モネタイズの選択肢を広げることも可能にします。&lt;/p&gt;&#10;&lt;h2 id="無料ブログプラットフォームとwordpressの選択"&gt;無料ブログプラットフォームとWordPressの選択&#10;&lt;/h2&gt;&lt;p&gt;それぞれのプラットフォームにはメリットとデメリットがあります。無料のブログプラットフォームは初心者に優しく、すぐにブログを始めることができます。一方、WordPressは高度なカスタマイズや機能、所有権を提供しますが、そのための一定の技術的知識や運用コスト、メンテナンスが必要です。そのため、どちらを選ぶべきかはあなたのニーズや目標によります。&lt;/p&gt;&#10;&lt;h2 id="wordpressへの移行を考えるタイミング"&gt;WordPressへの移行を考えるタイミング&#10;&lt;/h2&gt;&lt;p&gt;カスタマイズの制限に直面したとき、SEOやマーケティングの必要性を感じたとき、プロフェッショナルなブランドイメージが必要となったとき、モネタイズの選択肢を広げたいときなど、あなたのブログが成長し、より高度な要件を必要とするようになったときに、WordPressへの移行を検討するタイミングかもしれません。&lt;/p&gt;&#10;&lt;h2 id="まとめ"&gt;まとめ&#10;&lt;/h2&gt;&lt;p&gt;無料ブログプラットフォームとWordPress、そのどちらが最適かはあなたのブログの目標とニーズによります。どちらのプラットフォームも一長一短があるため、あなたの状況に最も適した選択を行うことが重要です。&lt;/p&gt;&#10;&lt;p&gt;キーワード: ブログプラットフォーム, WordPress, 所有権, カスタマイズ, SEO, ブランドイメージ, モネタイズ, ブログ運営, ウェブサイト運営&lt;/p&gt;&#10;&lt;h2 id="寸評"&gt;寸評&#10;&lt;/h2&gt;&lt;p&gt;前回「&lt;a class="link" href="https://ai.hack-le.com/wordpress/" &gt;WordPress入門: なぜ今すぐにでもWordPressを使い始めるべきなのか – 或る阿呆とAIと&lt;/a&gt;」あまりにもつまらない記事だったのだが、もう少し掘り下げたらもうちょっとマシになるんじゃないかと思えた。そこで、特に「所有権」というそれだけではよくわからないが、しかし重要な概念について掘り下げて聞いてみた。前よりはよくなったんじゃないかと思う。&lt;/p&gt;&#10;&lt;p&gt;以下のような質問をした。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;無料のブログサービスではなくWordPressを利用する理由として、「所有権」が主な理由になりうるのはなぜでしょうか。&lt;/li&gt;&#10;&lt;li&gt;無料のブログでも多くのテンプレートが用意されていたり、独自ドメインを利用したりするオプションがあるのではないでしょうか。&lt;/li&gt;&#10;&lt;li&gt;確かにプラットフォームの都合に振り回されるリスクは常に存在しますし、データの移行も難しいケースが多いようです。 そうすると、むしろWordPressを選ばない理由はなさそうですが、現実には有料のオプションを使ってもブログプラットフォームを利用するユーザーも多いようです。なぜでしょうか。&lt;/li&gt;&#10;&lt;li&gt;スモールスタートではブログプラットフォームも悪くない選択だということですね。 しかし、どこかでWordPressに移行を考えるようになる。それはどういうタイミングでしょうか。&lt;/li&gt;&#10;&lt;li&gt;所有権の有無によって、出来ることが大きく変わるわけですね。 では、ここまでの議論を長めの記事でまとめてください。 最初にタイトルをつけてください。 適切にH2の見出しをつけてください。 最後にキーワードを並べてください。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;ただ1パラグラフあたりがあまりにも短い。読み応えがない。やはり出力の仕方はまだまだ工夫の余地がある。&lt;/p&gt;&#10;</description></item><item><title>WordPress入門: なぜ今すぐにでもWordPressを使い始めるべきなのか</title><link>https://ai.hack-le.com/wordpress/</link><pubDate>Mon, 26 Jun 2023 22:09:28 +0900</pubDate><guid>https://ai.hack-le.com/wordpress/</guid><description>&lt;h2 id="wordpressとは何か"&gt;WordPressとは何か&#10;&lt;/h2&gt;&lt;p&gt;WordPressは世界中のエンジニアから初心者まで、幅広いユーザーにとって便利で使いやすいツールとされています。このコンテンツ管理システム (CMS) はウェブサイトの構築・管理を容易にする一方で、多少の学習曲線があることも事実です。それでは、なぜWordPressがあなたのブログ作成のパートナーとして最適なのかを考えてみましょう。&lt;/p&gt;&#10;&lt;h2 id="初心者にとってのwordpress"&gt;初心者にとってのWordPress&#10;&lt;/h2&gt;&lt;p&gt;無料のブログプラットフォーム（例えばBloggerやTumblrなど）は非常に使いやすく、手軽にブログを開始できます。しかし、その簡単さと引き換えに、カスタマイズの自由度が限られる場合があります。&lt;/p&gt;&#10;&lt;p&gt;それに対してWordPressは、より高度なカスタマイズと機能性を提供しますが、その反面、初めての人にとっては少々学習が必要です。特に自分でホスティングを設定したり、テーマやプラグインをインストールしたりするといった工程が含まれます。&lt;/p&gt;&#10;&lt;h2 id="wordpressの利点と挑戦"&gt;WordPressの利点と挑戦&#10;&lt;/h2&gt;&lt;p&gt;WordPressの最大の利点はその柔軟性と拡張性です。あなたのニーズに合わせてカスタマイズが可能で、何千ものテーマやプラグインが利用可能です。さらに、SEO（検索エンジン最適化）に優れているため、ブログが検索エンジンに見つけやすくなります。&lt;/p&gt;&#10;&lt;p&gt;しかしその一方で、WordPressの学習曲線を乗り越えるためには、基本的な機能から学び始め、学ぶリソースを活用し、小さなステップで進めていくことが重要です。そして何よりも、試行錯誤を恐れず、コミュニティの力を借りて問題を解決することが大切です。&lt;/p&gt;&#10;&lt;h2 id="なぜあなたはwordpressを使うべきなのか"&gt;なぜあなたはWordPressを使うべきなのか&#10;&lt;/h2&gt;&lt;p&gt;WordPressを使うことで、ブログの完全なコントロールと所有権を保つことができます。これにより、あなたのサイトの見た目や機能性、モネタイゼーション、SEOなど、全てを自分で決定することができます。&lt;/p&gt;&#10;&lt;p&gt;また、大規模で活発なWordPressのコミュニティは、疑問や問題に対するサポートを提供します。そして、何よりもWordPressは成熟しており、世界中で広く使われているため、その開発と改善は継続的に行われています。&lt;/p&gt;&#10;&lt;p&gt;以上の理由から、WordPressはあなたがブログを開始するのに最適なプラットフォームであると言えます。最初は少し難しく感じるかもしれませんが、その可能性と柔軟性は、学習時間を投資する価値があります。&lt;/p&gt;&#10;&lt;h2 id="まとめ"&gt;まとめ&#10;&lt;/h2&gt;&lt;p&gt;WordPressを使用することで、あなた自身が自分のウェブサイトやブログを完全に制御し、カスタマイズする能力を持つことができます。最初は少し学習が必要かもしれませんが、その後の利益と成功はその労力に見合うものとなるでしょう。&lt;/p&gt;&#10;&lt;p&gt;キーワード: WordPress, ブログ, コンテンツ管理システム, CMS, 学習曲線, プラグイン, テーマ, SEO, コミュニティ, カスタマイズ, 柔軟性, 拡張性, モネタイゼーション, 所有権&lt;/p&gt;&#10;&lt;h2 id="質問と寸評"&gt;質問と寸評&#10;&lt;/h2&gt;&lt;p&gt;……という記事をChatGPT-4に書かせてみたわけだが、ちょっとこれを読んでWordPressを使おうという気になる人がいるかは甚だ疑問である。話が抽象的過ぎてなんとも言えない。ブログの完全なコントロールと所有権のところをもっと深掘りしたらよかったのだろうか？たとえばうざったい広告を置かなくて済むとか、プラットフォーマーから理不尽な規制をかけられないとか……。アク禁NGも自由にできるとか。&lt;/p&gt;&#10;&lt;p&gt;うーん、なるほど、そう考えると、やっぱり質問の仕方に問題があったかな。なお下記のような質問をChatGPT-4にした。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;WordPressはエンジニアにとっては便利で手軽なソフトだが、多くの人にとって難しいツールなのだろうか？&lt;/li&gt;&#10;&lt;li&gt;そのとおりだと思うが、ネットで実際にブログをやっている人たちの話を見ると、WordPressはどちらかというとチャレンジだと捉えられているように思える。恐らくはいわゆる無料ブログなんかと比べてだと思うが。自分でサイトを運用するということにハードルを感じる人は多いようだ。&lt;/li&gt;&#10;&lt;li&gt;ブログをやる限りは是非挑戦してほしいし、その価値があると思うが、難しさをかんじている人にはどう勧めたら良いだろうか。&lt;/li&gt;&#10;&lt;li&gt;使い始めた初心者にはそのアドバイスで良いと思うが、これから使うか悩んでいる人には、使うとこんないいことがあるよと、思ってもらえるようなことを言う必要があるだろう。&lt;/li&gt;&#10;&lt;li&gt;ここまでの話を長めの記事にまとめてください。&lt;/li&gt;&#10;&lt;li&gt;記事には、以下の条件を指定します。&lt;/li&gt;&#10;&lt;li&gt;最初にタイトルをつける&lt;/li&gt;&#10;&lt;li&gt;適度に見出しをつける&lt;/li&gt;&#10;&lt;li&gt;最後にキーワードを並べる&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;フォーマットだけは遵守しているね。&lt;/p&gt;&#10;</description></item></channel></rss>