<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Hikari's Notebook Blog</title>
        <link>https://www.hikari-dev.com/blog</link>
        <description>Hikari's Notebook Blog</description>
        <lastBuildDate>Sun, 19 Apr 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>ja</language>
        <item>
            <title><![CDATA[AWS S3 から Cloudflare Pages へ移行しました]]></title>
            <link>https://www.hikari-dev.com/blog/2026/04/19/migrate-to-cloudflare-pages</link>
            <guid>https://www.hikari-dev.com/blog/2026/04/19/migrate-to-cloudflare-pages</guid>
            <pubDate>Sun, 19 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[このブログを AWS S3 から Cloudflare Pages へ移行した。これまでは S3 で静的ホスティングを行い、CloudFront を通じて配信していたが、管理の簡素化とパフォーマンス向上のために Cloudflare Pages を採用することにした。]]></description>
            <content:encoded><![CDATA[<p>このブログを AWS S3 から Cloudflare Pages へ移行した。これまでは S3 で静的ホスティングを行い、CloudFront を通じて配信していたが、管理の簡素化とパフォーマンス向上のために Cloudflare Pages を採用することにした。</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="なぜ-cloudflare-pages-か">なぜ Cloudflare Pages か<a href="https://www.hikari-dev.com/blog/2026/04/19/migrate-to-cloudflare-pages#%E3%81%AA%E3%81%9C-cloudflare-pages-%E3%81%8B" class="hash-link" aria-label="なぜ Cloudflare Pages か への直接リンク" title="なぜ Cloudflare Pages か への直接リンク" translate="no">​</a></h2>
<p>これまで S3 + CloudFront + Route53 という AWS 標準の構成で運用してきたが、以下の理由から Cloudflare Pages への移行を決めた。</p>
<ol>
<li class=""><strong>管理コストの低さ</strong>: SSL 証明書の自動更新、グローバルエッジへのデプロイが標準で組み込まれている。</li>
<li class=""><strong>無料枠の広さ</strong>: 個人ブログ程度のトラフィックであれば、ほとんどの機能を無料枠で利用できる。</li>
<li class=""><strong>デプロイの柔軟性</strong>: GitHub 連携だけでなく、GitHub Actions からの Direct Upload にも対応しており、複雑なビルドフローも維持できる。</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="移行の手順">移行の手順<a href="https://www.hikari-dev.com/blog/2026/04/19/migrate-to-cloudflare-pages#%E7%A7%BB%E8%A1%8C%E3%81%AE%E6%89%8B%E9%A0%86" class="hash-link" aria-label="移行の手順 への直接リンク" title="移行の手順 への直接リンク" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="1-github-actions-のワークフロー作成">1. GitHub Actions のワークフロー作成<a href="https://www.hikari-dev.com/blog/2026/04/19/migrate-to-cloudflare-pages#1-github-actions-%E3%81%AE%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BC%E4%BD%9C%E6%88%90" class="hash-link" aria-label="1. GitHub Actions のワークフロー作成 への直接リンク" title="1. GitHub Actions のワークフロー作成 への直接リンク" translate="no">​</a></h3>
<p>既存の S3 デプロイ用のワークフローを Cloudflare Pages 用に書き換えた。今回は <code>cloudflare/pages-action</code> を使用している。</p>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="2-cloudflare-pages-プロジェクトの作成">2. Cloudflare Pages プロジェクトの作成<a href="https://www.hikari-dev.com/blog/2026/04/19/migrate-to-cloudflare-pages#2-cloudflare-pages-%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90" class="hash-link" aria-label="2. Cloudflare Pages プロジェクトの作成 への直接リンク" title="2. Cloudflare Pages プロジェクトの作成 への直接リンク" translate="no">​</a></h3>
<p>Cloudflare のダッシュボード、または CLI (Wrangler) からプロジェクトを作成する。今回は確実にブランチを指定して作成するため、Wrangler を使用した。</p>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="3-dns-の切り替え">3. DNS の切り替え<a href="https://www.hikari-dev.com/blog/2026/04/19/migrate-to-cloudflare-pages#3-dns-%E3%81%AE%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88" class="hash-link" aria-label="3. DNS の切り替え への直接リンク" title="3. DNS の切り替え への直接リンク" translate="no">​</a></h3>
<p>S3 を向いていた <code>www.hikari-dev.com</code> の DNS レコードを Cloudflare Pages のエンドポイント（<code>xxx.pages.dev</code>）に向けるよう更新した。</p>
<p>Cloudflare Pages 側でカスタムドメインを追加すると、自動的に検証が走り、SSL 証明書が発行される。この際、古いレコードが残っていると検証に失敗することがあるため、一度ドメイン設定を削除して再登録することでスムーズに反映された。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="移行後の所感">移行後の所感<a href="https://www.hikari-dev.com/blog/2026/04/19/migrate-to-cloudflare-pages#%E7%A7%BB%E8%A1%8C%E5%BE%8C%E3%81%AE%E6%89%80%E6%84%9F" class="hash-link" aria-label="移行後の所感 への直接リンク" title="移行後の所感 への直接リンク" translate="no">​</a></h2>
<p>移行自体は非常にスムーズで、デプロイ速度も S3 へのアップロードと遜色ない。何より、AWS 側で管理していた複数のリソース（S3 バケット、CloudFront ディストリビューション、ACM 証明書）を Cloudflare Pages という一つのプロジェクトに集約できたのが大きなメリットだと感じている。</p>
<p>今後は Cloudflare Workers などを活用した動的な機能追加も検討していきたい。</p>]]></content:encoded>
            <category>AWS</category>
            <category>Cloudflare</category>
            <category>Docusaurus</category>
            <category>CI/CD</category>
        </item>
        <item>
            <title><![CDATA[GPT-5.4 / GPT-5.4 mini / GPT-5.4 nano / GPT-4o / GPT-4o mini の料金・性能比較]]></title>
            <link>https://www.hikari-dev.com/blog/2026/04/18/gpt-54-pricing-comparison</link>
            <guid>https://www.hikari-dev.com/blog/2026/04/18/gpt-54-pricing-comparison</guid>
            <pubDate>Sat, 18 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[OpenAI の現行 API モデルである GPT-5.4、GPT-5.4 nano、GPT-5.4 mini、GPT-4o、GPT-4o mini の料金・スペック・性能を比較した。用途に応じてどのモデルを選ぶべきかをまとめる。]]></description>
            <content:encoded><![CDATA[<p>OpenAI の現行 API モデルである GPT-5.4、GPT-5.4 nano、GPT-5.4 mini、GPT-4o、GPT-4o mini の料金・スペック・性能を比較した。用途に応じてどのモデルを選ぶべきかをまとめる。</p>
<!-- -->
<blockquote>
<p>単位: USD / 1M トークン (MTok)。2026 年 4 月時点の情報。</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="料金比較">料金比較<a href="https://www.hikari-dev.com/blog/2026/04/18/gpt-54-pricing-comparison#%E6%96%99%E9%87%91%E6%AF%94%E8%BC%83" class="hash-link" aria-label="料金比較 への直接リンク" title="料金比較 への直接リンク" translate="no">​</a></h2>
<table><thead><tr><th>モデル</th><th style="text-align:right">入力</th><th style="text-align:right">キャッシュ入力</th><th style="text-align:right">出力</th></tr></thead><tbody><tr><td><strong>GPT-5.4</strong></td><td style="text-align:right">$2.50</td><td style="text-align:right">$1.25</td><td style="text-align:right">$15.00</td></tr><tr><td><strong>GPT-5.4 mini</strong></td><td style="text-align:right">$0.75</td><td style="text-align:right">$0.075</td><td style="text-align:right">$4.50</td></tr><tr><td><strong>GPT-5.4 nano</strong></td><td style="text-align:right">$0.20</td><td style="text-align:right">$0.02</td><td style="text-align:right">$1.25</td></tr><tr><td><strong>GPT-4o</strong></td><td style="text-align:right">$2.50</td><td style="text-align:right">$1.25</td><td style="text-align:right">$10.00</td></tr><tr><td><strong>GPT-4o mini</strong></td><td style="text-align:right">$0.15</td><td style="text-align:right">$0.075</td><td style="text-align:right">$0.60</td></tr></tbody></table>
<p>GPT-4o mini が入力・出力ともに最安だが、ナレッジカットオフが 2023 年 10 月と古いため最新知識が必要なタスクには不向きである。GPT-5.4 nano は入力コストで GPT-4o mini とほぼ同等ながら、GPT-5.4 ファミリーの品質と 2025 年 8 月までの最新知識を持つ。GPT-5.4 (フラグシップ) は入力コストが GPT-4o と同額だが、出力コストが $15.00 / MTok と高く、最高品質の推論が必要な場面向けである。</p>
<p>リージョナル処理エンドポイントを使用する場合は、GPT-5.4 シリーズに対して <strong>10% の割増料金</strong> が発生する。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="スペック比較">スペック比較<a href="https://www.hikari-dev.com/blog/2026/04/18/gpt-54-pricing-comparison#%E3%82%B9%E3%83%9A%E3%83%83%E3%82%AF%E6%AF%94%E8%BC%83" class="hash-link" aria-label="スペック比較 への直接リンク" title="スペック比較 への直接リンク" translate="no">​</a></h2>
<table><thead><tr><th>モデル</th><th style="text-align:center">コンテキスト</th><th style="text-align:center">最大出力</th><th style="text-align:center">画像入力</th><th style="text-align:center">ナレッジカットオフ</th></tr></thead><tbody><tr><td><strong>GPT-5.4</strong></td><td style="text-align:center">400K</td><td style="text-align:center">128K</td><td style="text-align:center">○</td><td style="text-align:center">2025 年 8 月</td></tr><tr><td><strong>GPT-5.4 mini</strong></td><td style="text-align:center">400K</td><td style="text-align:center">128K</td><td style="text-align:center">○</td><td style="text-align:center">2025 年 8 月</td></tr><tr><td><strong>GPT-5.4 nano</strong></td><td style="text-align:center">400K</td><td style="text-align:center">128K</td><td style="text-align:center">○</td><td style="text-align:center">2025 年 8 月</td></tr><tr><td><strong>GPT-4o</strong></td><td style="text-align:center">128K</td><td style="text-align:center">16,384</td><td style="text-align:center">○</td><td style="text-align:center">2023 年 10 月</td></tr><tr><td><strong>GPT-4o mini</strong></td><td style="text-align:center">128K</td><td style="text-align:center">16,384</td><td style="text-align:center">○</td><td style="text-align:center">2023 年 10 月</td></tr></tbody></table>
<p>GPT-5.4 シリーズはコンテキスト ウィンドウが <strong>400K トークン</strong> と大幅に拡張され、最大出力も 128K トークンまで対応する。GPT-4o / GPT-4o mini は 128K / 16K に留まる。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="性能精度比較">性能・精度比較<a href="https://www.hikari-dev.com/blog/2026/04/18/gpt-54-pricing-comparison#%E6%80%A7%E8%83%BD%E7%B2%BE%E5%BA%A6%E6%AF%94%E8%BC%83" class="hash-link" aria-label="性能・精度比較 への直接リンク" title="性能・精度比較 への直接リンク" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="gpt-54">GPT-5.4<a href="https://www.hikari-dev.com/blog/2026/04/18/gpt-54-pricing-comparison#gpt-54" class="hash-link" aria-label="GPT-5.4 への直接リンク" title="GPT-5.4 への直接リンク" translate="no">​</a></h3>
<p>GPT-5.4 ファミリーのフラグシップ モデル。OpenAI が提供する現世代最高の知能を持ち、複雑な推論・長文生成・高度なコーディングにおいて GPT-5.4 mini を大きく上回る。コンピュータ使用・MCP・Web 検索などすべてのネイティブ ツールに対応し、マルチモーダル入出力も完全サポートする。出力コストが $15.00 / MTok と高いため、高品質な出力が必要な場面に絞って使用するのが効果的である。</p>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="gpt-54-mini">GPT-5.4 mini<a href="https://www.hikari-dev.com/blog/2026/04/18/gpt-54-pricing-comparison#gpt-54-mini" class="hash-link" aria-label="GPT-5.4 mini への直接リンク" title="GPT-5.4 mini への直接リンク" translate="no">​</a></h3>
<p>GPT-5.4 ファミリーの中間モデルで、コーディング、コンピュータ使用、サブエージェントに最適化されている。GPT-5 mini より一貫して高い性能を示し、フラグシップの GPT-5.4 に近いパス レートを、より高速な処理で実現する。GPT-5 mini 比で <strong>2 倍以上の速度</strong>向上が確認されており、コーディング ワークフローにおいて最高クラスのパフォーマンス / レイテンシー トレードオフを提供する。</p>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="gpt-54-nano">GPT-5.4 nano<a href="https://www.hikari-dev.com/blog/2026/04/18/gpt-54-pricing-comparison#gpt-54-nano" class="hash-link" aria-label="GPT-5.4 nano への直接リンク" title="GPT-5.4 nano への直接リンク" translate="no">​</a></h3>
<p>GPT-5.4 ファミリーの最小・最安モデル。分類、データ抽出、ランキング、コーディングのサブエージェントなど、大量処理で速度とコストが最優先のユース ケース向けに最適化されている。深い推論が必要な複雑なタスクには向かない。</p>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="gpt-4o">GPT-4o<a href="https://www.hikari-dev.com/blog/2026/04/18/gpt-54-pricing-comparison#gpt-4o" class="hash-link" aria-label="GPT-4o への直接リンク" title="GPT-4o への直接リンク" translate="no">​</a></h3>
<p>汎用フラグシップ モデルとして登場し、テキスト・画像の両方に対応する高い知能を持つ。現在は GPT-5.4 系に後継されたレガシー モデルの位置付けで、ChatGPT からは 2026 年 2 月に退役したが API アクセスは継続している。</p>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="gpt-4o-mini">GPT-4o mini<a href="https://www.hikari-dev.com/blog/2026/04/18/gpt-54-pricing-comparison#gpt-4o-mini" class="hash-link" aria-label="GPT-4o mini への直接リンク" title="GPT-4o mini への直接リンク" translate="no">​</a></h3>
<p>「ファインチューニングに最適な小型モデル」として設計された。大規模モデル (GPT-4o) の出力を蒸留することで同等の結果を低コスト・低遅延で実現する。MMLU スコアは <strong>82.0%</strong>。シンプルなタスクへの投入コストを抑えたい場合に適している。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="どのモデルを選ぶか">どのモデルを選ぶか<a href="https://www.hikari-dev.com/blog/2026/04/18/gpt-54-pricing-comparison#%E3%81%A9%E3%81%AE%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%E9%81%B8%E3%81%B6%E3%81%8B" class="hash-link" aria-label="どのモデルを選ぶか への直接リンク" title="どのモデルを選ぶか への直接リンク" translate="no">​</a></h2>
<ul>
<li class=""><strong>大量処理・コスト最優先</strong>: GPT-5.4 nano か GPT-4o mini。最新知識が必要なら GPT-5.4 nano、ファインチューニングが必要なら GPT-4o mini。</li>
<li class=""><strong>コーディング・エージェント</strong>: GPT-5.4 mini。速度・精度のバランスが最良。</li>
<li class=""><strong>複雑な推論・高品質出力</strong>: GPT-5.4。入力 $2.50、出力 $15.00 / MTok と高コストだが、現世代最高品質の出力が得られる。</li>
<li class=""><strong>レガシー システムとの互換性</strong>: GPT-4o。API は継続提供されているため既存の統合を維持できる。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="コスパ良く選ぶなら">コスパ良く選ぶなら...<a href="https://www.hikari-dev.com/blog/2026/04/18/gpt-54-pricing-comparison#%E3%82%B3%E3%82%B9%E3%83%91%E8%89%AF%E3%81%8F%E9%81%B8%E3%81%B6%E3%81%AA%E3%82%89" class="hash-link" aria-label="コスパ良く選ぶなら... への直接リンク" title="コスパ良く選ぶなら... への直接リンク" translate="no">​</a></h2>
<p>コスパの観点で特に注目すべきは <strong>GPT-5.4 nano</strong> と <strong>GPT-5.4 mini</strong> の 2 モデルである。</p>
<p><strong>GPT-5.4 nano</strong> は GPT-4o mini とほぼ同じ入力コスト ($0.20 vs $0.15) ながら、400K のコンテキスト、2025 年 8 月までのナレッジ、Web 検索・ファイル検索・MCP などのネイティブ ツールをすべて利用できる。ナレッジカットオフを除いて GPT-4o mini に優る点がほとんどであるため、ファインチューニングが不要であれば GPT-5.4 nano への移行が合理的である。</p>
<p><strong>GPT-5.4 mini</strong> は GPT-4o ($2.50 / MTok) より安い入力コスト ($0.75) で、コーディングや エージェント ワークフローにおいては GPT-4o を超える性能を発揮する。GPT-4o を日常的に使っているなら、GPT-5.4 mini への切り替えでコスト削減と性能向上を同時に実現できる可能性が高い。</p>
<p>一方、<strong>GPT-4o</strong> は現時点では割高感がある。入力コストが GPT-5.4 と同額 ($2.50) でありながら、コンテキスト・知識・ツール対応のいずれでも GPT-5.4 系に劣る。ファインチューニングや既存システムとの互換性が必要な場合を除き、積極的に選ぶ理由は薄い。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="参考">参考<a href="https://www.hikari-dev.com/blog/2026/04/18/gpt-54-pricing-comparison#%E5%8F%82%E8%80%83" class="hash-link" aria-label="参考 への直接リンク" title="参考 への直接リンク" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://developers.openai.com/api/docs/pricing" target="_blank" rel="noopener noreferrer" class="">OpenAI API 料金</a></li>
<li class=""><a href="https://developers.openai.com/api/docs/models/gpt-5.4-mini" target="_blank" rel="noopener noreferrer" class="">GPT-5.4 mini モデル詳細</a></li>
<li class=""><a href="https://developers.openai.com/api/docs/models/gpt-5.4-nano" target="_blank" rel="noopener noreferrer" class="">GPT-5.4 nano モデル詳細</a></li>
<li class=""><a href="https://openai.com/index/introducing-gpt-5-4-mini-and-nano/" target="_blank" rel="noopener noreferrer" class="">GPT-5.4 mini と nano の紹介 – OpenAI</a></li>
<li class=""><a href="https://developers.openai.com/api/docs/models/gpt-5.4" target="_blank" rel="noopener noreferrer" class="">GPT-5.4 モデル詳細</a></li>
<li class=""><a href="https://developers.openai.com/api/docs/models/gpt-4o-mini" target="_blank" rel="noopener noreferrer" class="">GPT-4o mini モデル詳細</a></li>
</ul>]]></content:encoded>
            <category>AI</category>
            <category>OpenAI</category>
        </item>
        <item>
            <title><![CDATA[CSS ではなぜ「8 の倍数」が余白の基準になるのか]]></title>
            <link>https://www.hikari-dev.com/blog/2026/04/12/8px-spacing-rule</link>
            <guid>https://www.hikari-dev.com/blog/2026/04/12/8px-spacing-rule</guid>
            <pubDate>Sun, 12 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[現代の UI デザインでは「余白は 8 の倍数で設定する」というルールがよく用いられる。これは単なる慣習ではなく、画面密度・タイポグラフィ・スケールの数学的整合性に裏付けられた経験則である。]]></description>
            <content:encoded><![CDATA[<p>現代の UI デザインでは「余白は 8 の倍数で設定する」というルールがよく用いられる。これは単なる慣習ではなく、<strong>画面密度・タイポグラフィ・スケールの数学的整合性</strong>に裏付けられた経験則である。</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="多くの画面密度への対応">多くの画面密度への対応<a href="https://www.hikari-dev.com/blog/2026/04/12/8px-spacing-rule#%E5%A4%9A%E3%81%8F%E3%81%AE%E7%94%BB%E9%9D%A2%E5%AF%86%E5%BA%A6%E3%81%B8%E3%81%AE%E5%AF%BE%E5%BF%9C" class="hash-link" aria-label="多くの画面密度への対応 への直接リンク" title="多くの画面密度への対応 への直接リンク" translate="no">​</a></h2>
<p>現代のディスプレイは <strong>1x・1.5x・2x・3x・4x</strong> などの pixel ratio を持っている。</p>
<table><thead><tr><th>値</th><th>1x</th><th>1.5x</th><th>2x</th><th>3x</th><th>4x</th></tr></thead><tbody><tr><td><strong>8 px</strong></td><td>8</td><td>12</td><td>16</td><td>24</td><td>32</td></tr><tr><td>5 px</td><td>5</td><td>7.5 ⚠️</td><td>10</td><td>15</td><td>20</td></tr></tbody></table>
<p>8 は多くの倍率で<strong>整数に割り切れる</strong>ため、サブピクセルレンダリングによるぼやけが起きにくい。5 px のような値を使うと、1.5x 環境で 7.5 px という端数が生じ、レンダリングが不正確になる。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="タイポグラフィとの相性">タイポグラフィとの相性<a href="https://www.hikari-dev.com/blog/2026/04/12/8px-spacing-rule#%E3%82%BF%E3%82%A4%E3%83%9D%E3%82%B0%E3%83%A9%E3%83%95%E3%82%A3%E3%81%A8%E3%81%AE%E7%9B%B8%E6%80%A7" class="hash-link" aria-label="タイポグラフィとの相性 への直接リンク" title="タイポグラフィとの相性 への直接リンク" translate="no">​</a></h2>
<p>ブラウザのデフォルトフォントサイズは <strong>16 px (= 8 × 2)</strong>。行間も通常 1.5 倍 = 24 px (= 8 × 3) である。</p>
<p>8 の倍数で余白を設定すると、テキストのリズムと視覚的に揃いやすくなる。見出しや本文の高さが余白のグリッドと一致するため、<strong>整然とした垂直リズム</strong>が生まれる。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="デザイントークンの作りやすさ">デザイントークンの作りやすさ<a href="https://www.hikari-dev.com/blog/2026/04/12/8px-spacing-rule#%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%81%AE%E4%BD%9C%E3%82%8A%E3%82%84%E3%81%99%E3%81%95" class="hash-link" aria-label="デザイントークンの作りやすさ への直接リンク" title="デザイントークンの作りやすさ への直接リンク" translate="no">​</a></h2>
<div class="language-css codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-css codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token variable" style="color:#36acaa">--space-1</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">8</span><span class="token unit">px</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token variable" style="color:#36acaa">--space-2</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">16</span><span class="token unit">px</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token variable" style="color:#36acaa">--space-3</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">24</span><span class="token unit">px</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token variable" style="color:#36acaa">--space-4</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">32</span><span class="token unit">px</span><span class="token punctuation" style="color:#393A34">;</span></span><br></div></code></pre></div></div>
<p>スケールが単純で、デザイナーとエンジニアが<strong>共通言語</strong>として使いやすい。Material Design や Tailwind CSS もこの考え方を採用している。</p>
<p>デザイナーが「ここは space-3」と指定するだけで、エンジニアは迷わず <code>24px</code> を当てられる。命名規則が整うことで、コードレビュー時のコミュニケーションコストも下がる。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="4-px-ベースという選択肢">4 px ベースという選択肢<a href="https://www.hikari-dev.com/blog/2026/04/12/8px-spacing-rule#4-px-%E3%83%99%E3%83%BC%E3%82%B9%E3%81%A8%E3%81%84%E3%81%86%E9%81%B8%E6%8A%9E%E8%82%A2" class="hash-link" aria-label="4 px ベースという選択肢 への直接リンク" title="4 px ベースという選択肢 への直接リンク" translate="no">​</a></h2>
<p>より細かい調整が必要な UI では <strong>4 px ベース</strong> (4, 8, 12, 16...) も一般的である。Tailwind CSS はデフォルトで 4 px ベース (<code>p-1 = 4px</code>) を採用している。</p>
<p>4 px ベースは 8 px ベースの部分集合でもあるため、両者は矛盾しない。コンポーネント内部など細かな余白には 4 px 単位を使い、セクション間など大きな余白には 8 px 単位を使うといった使い分けも有効である。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="まとめ">まとめ<a href="https://www.hikari-dev.com/blog/2026/04/12/8px-spacing-rule#%E3%81%BE%E3%81%A8%E3%82%81" class="hash-link" aria-label="まとめ への直接リンク" title="まとめ への直接リンク" translate="no">​</a></h2>
<p>8 px の倍数が余白の基準として使われる理由は 3 点に集約される。</p>
<ol>
<li class=""><strong>画面密度への対応</strong>: 多くの pixel ratio で整数に割り切れ、サブピクセルのぼやけを防ぐ</li>
<li class=""><strong>タイポグラフィとの整合</strong>: デフォルトフォントサイズ (16 px) や行間 (24 px) と揃い、垂直リズムが生まれる</li>
<li class=""><strong>スケールの一貫性</strong>: シンプルなトークン体系がデザイナーとエンジニアの共通言語になる</li>
</ol>]]></content:encoded>
            <category>デザイン</category>
            <category>CSS</category>
        </item>
        <item>
            <title><![CDATA[新機能 Amazon S3 Files で S3 バケットを EC2 にマウントする]]></title>
            <link>https://www.hikari-dev.com/blog/2026/04/08/s3-files</link>
            <guid>https://www.hikari-dev.com/blog/2026/04/08/s3-files</guid>
            <pubDate>Wed, 08 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Amazon S3 Files は、S3 バケットを NFS ファイルシステムとして EC2 などのコンピュートリソースに直接マウントできるサービスである。データは S3 に保持されたまま、通常のファイル操作 (ls、cp、cat など) で読み書きできる。]]></description>
            <content:encoded><![CDATA[<p>Amazon S3 Files は、S3 バケットを NFS ファイルシステムとして EC2 などのコンピュートリソースに直接マウントできるサービスである。データは S3 に保持されたまま、通常のファイル操作 (<code>ls</code>、<code>cp</code>、<code>cat</code> など) で読み書きできる。</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="s3-files-とは">S3 Files とは<a href="https://www.hikari-dev.com/blog/2026/04/08/s3-files#s3-files-%E3%81%A8%E3%81%AF" class="hash-link" aria-label="S3 Files とは への直接リンク" title="S3 Files とは への直接リンク" translate="no">​</a></h2>
<p>S3 Files は Amazon EFS をベースに構築された共有ファイルシステムで、S3 バケットのデータにファイルシステムとしてアクセスできる。</p>
<p>主な特徴は以下の通りである。</p>
<table><thead><tr><th>項目</th><th>内容</th></tr></thead><tbody><tr><td>プロトコル</td><td>NFS 4.1 / 4.2</td></tr><tr><td>対応コンピュート</td><td>EC2、Lambda、ECS、EKS</td></tr><tr><td>同時接続数</td><td>最大 25,000 コンピュートリソース</td></tr><tr><td>読み取りスループット</td><td>最大 TB/秒</td></tr><tr><td>IOPS</td><td>1,000 万以上/バケット</td></tr><tr><td>暗号化</td><td>TLS (転送中) + AWS KMS (保存時)</td></tr><tr><td>ファイルシステム機能</td><td>POSIX パーミッション、ファイルロック、読み取り後書き込み一貫性</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="動作の仕組み">動作の仕組み<a href="https://www.hikari-dev.com/blog/2026/04/08/s3-files#%E5%8B%95%E4%BD%9C%E3%81%AE%E4%BB%95%E7%B5%84%E3%81%BF" class="hash-link" aria-label="動作の仕組み への直接リンク" title="動作の仕組み への直接リンク" translate="no">​</a></h3>
<p>S3 Files はアクセスされたデータを高性能ストレージに自動ロードし、低レイテンシで提供する。</p>
<ul>
<li class=""><strong>小さいファイル</strong> (デフォルト 128 KB 未満): 高性能ストレージから直接読み取り</li>
<li class=""><strong>大きいファイル</strong> (1 MB 以上): S3 から直接ストリーミング</li>
<li class=""><strong>書き込み</strong>: 高性能ストレージに書き込み後、S3 に自動同期</li>
</ul>
<p>高性能ストレージ上のデータは、一定期間 (デフォルト 30 日、1 - 365 日で設定可能) アクセスがないと自動削除される。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="前提条件">前提条件<a href="https://www.hikari-dev.com/blog/2026/04/08/s3-files#%E5%89%8D%E6%8F%90%E6%9D%A1%E4%BB%B6" class="hash-link" aria-label="前提条件 への直接リンク" title="前提条件 への直接リンク" translate="no">​</a></h2>
<ul>
<li class="">AWS アカウント</li>
<li class="">EC2 インスタンス (Linux)</li>
<li class="">S3 バケット (EC2 と同じリージョン)</li>
<li class="">IAM ロール 2 つ<!-- -->
<ul>
<li class="">ファイルシステム作成用: S3 バケットの読み書き権限</li>
<li class="">EC2 インスタンス用: <code>AmazonS3FilesClientFullAccess</code> マネージドポリシーをアタッチ</li>
</ul>
</li>
<li class="">セキュリティグループ: NFS ポート 2049 の通信を許可</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="iam-ロールの作成">IAM ロールの作成<a href="https://www.hikari-dev.com/blog/2026/04/08/s3-files#iam-%E3%83%AD%E3%83%BC%E3%83%AB%E3%81%AE%E4%BD%9C%E6%88%90" class="hash-link" aria-label="IAM ロールの作成 への直接リンク" title="IAM ロールの作成 への直接リンク" translate="no">​</a></h3>
<p>S3 Files には 2 つの IAM ロールが必要である。</p>
<h4 class="anchor anchorTargetStickyNavbar_DVDF" id="1-ファイルシステム作成用ロール">1. ファイルシステム作成用ロール<a href="https://www.hikari-dev.com/blog/2026/04/08/s3-files#1-%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E4%BD%9C%E6%88%90%E7%94%A8%E3%83%AD%E3%83%BC%E3%83%AB" class="hash-link" aria-label="1. ファイルシステム作成用ロール への直接リンク" title="1. ファイルシステム作成用ロール への直接リンク" translate="no">​</a></h4>
<p><strong>マネジメントコンソールを使用した場合は自動的に作成されるため不要</strong></p>
<p>S3 Files がバケットにアクセスするためのロールである。</p>
<div class="language-bash codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-bash codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token comment" style="color:#999988;font-style:italic"># ロールの作成</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">aws iam create-role </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  --role-name S3Files-FileSystem-Role </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  --assume-role-policy-document </span><span class="token string" style="color:#e3116c">'{</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token string" style="color:#e3116c">    "Version": "2012-10-17",</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token string" style="color:#e3116c">    "Statement": [</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token string" style="color:#e3116c">      {</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token string" style="color:#e3116c">        "Effect": "Allow",</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token string" style="color:#e3116c">        "Principal": { "Service": "s3files.amazonaws.com" },</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token string" style="color:#e3116c">        "Action": "sts:AssumeRole"</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token string" style="color:#e3116c">      }</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token string" style="color:#e3116c">    ]</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token string" style="color:#e3116c">  }'</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># S3 Files クライアントポリシーをアタッチ</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">aws iam attach-role-policy </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  --role-name S3Files-FileSystem-Role </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  --policy-arn arn:aws:iam::aws:policy/AmazonS3FilesClientFullAccess</span></span><br></div></code></pre></div></div>
<p>ファイルシステム作成時に <code>--role-arn</code> で指定する。</p>
<h4 class="anchor anchorTargetStickyNavbar_DVDF" id="2-ec2-インスタンス用ロール">2. EC2 インスタンス用ロール<a href="https://www.hikari-dev.com/blog/2026/04/08/s3-files#2-ec2-%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E7%94%A8%E3%83%AD%E3%83%BC%E3%83%AB" class="hash-link" aria-label="2. EC2 インスタンス用ロール への直接リンク" title="2. EC2 インスタンス用ロール への直接リンク" translate="no">​</a></h4>
<p><strong>IAM ロールのアタッチがないとマウントに失敗する</strong></p>
<p>以下のロールを CloudShell で作成する。</p>
<div class="language-bash codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-bash codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token comment" style="color:#999988;font-style:italic"># ロールの作成</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">aws iam create-role </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  --role-name EC2-S3Files-Role </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  --assume-role-policy-document </span><span class="token string" style="color:#e3116c">'{</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token string" style="color:#e3116c">    "Version": "2012-10-17",</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token string" style="color:#e3116c">    "Statement": [</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token string" style="color:#e3116c">      {</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token string" style="color:#e3116c">        "Effect": "Allow",</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token string" style="color:#e3116c">        "Principal": { "Service": "ec2.amazonaws.com" },</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token string" style="color:#e3116c">        "Action": "sts:AssumeRole"</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token string" style="color:#e3116c">      }</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token string" style="color:#e3116c">    ]</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token string" style="color:#e3116c">  }'</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># S3 Files クライアントポリシーをアタッチ</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">aws iam attach-role-policy </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  --role-name EC2-S3Files-Role </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  --policy-arn arn:aws:iam::aws:policy/AmazonS3FilesClientFullAccess</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># インスタンスプロファイルの作成とアタッチ</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">aws iam create-instance-profile </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  --instance-profile-name EC2-S3Files-Profile</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">aws iam add-role-to-instance-profile </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  --instance-profile-name EC2-S3Files-Profile </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  --role-name EC2-S3Files-Role</span></span><br></div></code></pre></div></div>
<p>このロールをインスタンスにアタッチする。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="セットアップ手順">セットアップ手順<a href="https://www.hikari-dev.com/blog/2026/04/08/s3-files#%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97%E6%89%8B%E9%A0%86" class="hash-link" aria-label="セットアップ手順 への直接リンク" title="セットアップ手順 への直接リンク" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="1-s3-バケットの準備">1. S3 バケットの準備<a href="https://www.hikari-dev.com/blog/2026/04/08/s3-files#1-s3-%E3%83%90%E3%82%B1%E3%83%83%E3%83%88%E3%81%AE%E6%BA%96%E5%82%99" class="hash-link" aria-label="1. S3 バケットの準備 への直接リンク" title="1. S3 バケットの準備 への直接リンク" translate="no">​</a></h3>
<p>S3 コンソールで汎用バケットを作成する。既存のバケットでも構わない。</p>
<p>ただし、<strong>バケットのバージョニング設定が必要</strong></p>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="2-ファイルシステムの作成">2. ファイルシステムの作成<a href="https://www.hikari-dev.com/blog/2026/04/08/s3-files#2-%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AE%E4%BD%9C%E6%88%90" class="hash-link" aria-label="2. ファイルシステムの作成 への直接リンク" title="2. ファイルシステムの作成 への直接リンク" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_DVDF" id="コンソールから作成する場合">コンソールから作成する場合<a href="https://www.hikari-dev.com/blog/2026/04/08/s3-files#%E3%82%B3%E3%83%B3%E3%82%BD%E3%83%BC%E3%83%AB%E3%81%8B%E3%82%89%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88" class="hash-link" aria-label="コンソールから作成する場合 への直接リンク" title="コンソールから作成する場合 への直接リンク" translate="no">​</a></h4>
<p><img decoding="async" loading="lazy" alt="alt text" src="https://www.hikari-dev.com/assets/images/image-94187530abfe3f668203ae1aedd9bcb6.webp" width="1884" height="1434" class="img_y1Im"></p>
<ol>
<li class="">S3 コンソールでバケットを選択</li>
<li class="">「ファイルシステム」タブ → 「ファイルシステムを作成」 をクリック</li>
</ol>
<p>コンソールから作成すると、全 AZ にマウントターゲットとアクセスポイントが自動作成される。</p>
<p><img decoding="async" loading="lazy" alt="alt text" src="https://www.hikari-dev.com/assets/images/image-2-87b383a4e6c713f047b8b9576f6e79a1.webp" width="1876" height="1118" class="img_y1Im"></p>
<ol start="3">
<li class="">プレフィックスと VPC を指定して、「ファイルシステムを作成」をクリックする。</li>
</ol>
<p>出力されるファイルシステム ID (例: fs-0123456789abcdef0) を記録しておく。</p>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="3-インスタンスにマウント">3. インスタンスにマウント<a href="https://www.hikari-dev.com/blog/2026/04/08/s3-files#3-%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%81%AB%E3%83%9E%E3%82%A6%E3%83%B3%E3%83%88" class="hash-link" aria-label="3. インスタンスにマウント への直接リンク" title="3. インスタンスにマウント への直接リンク" translate="no">​</a></h3>
<p>ターミナルで、以下を実行する。</p>
<div class="language-bash codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-bash codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token comment" style="color:#999988;font-style:italic"># マウントポイントの作成</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">mkdir</span><span class="token plain"> /mnt/s3files</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># マウント</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">mount</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> s3files fs-0123456789abcdef0:/ /mnt/s3files</span></span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-note admonition_fOhH alert alert--secondary"><div class="admonitionHeading_XaF5"><span class="admonitionIcon_zgRW"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>注記</div><div class="admonitionContent_KaOa"><p>マウントできない場合は、以下のコマンドを実行し再試行</p><div class="language-bash codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-bash codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> dnf </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-y</span><span class="token plain"> amazon-efs-utils </span><span class="token comment" style="color:#999988;font-style:italic"># Amazon Linux, RHEL</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># sudo apt install -y amazon-efs-utils (Ubuntu, Debian)</span></span><br></div></code></pre></div></div></div></div>
<div class="theme-admonition theme-admonition-note admonition_fOhH alert alert--secondary"><div class="admonitionHeading_XaF5"><span class="admonitionIcon_zgRW"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>注記</div><div class="admonitionContent_KaOa"><p>dnf コマンド実行時に通信がうまくいかない場合は、S3 エンドポイント (ゲートウェイ) を設置し、インスタンスと同じ AZ に割り当てる。</p><p>ただし、S3 エンドポイントのルートテーブルはインスタンスのあるサブネットと同一のものにしておく。</p></div></div>
<p>マウントの確認:</p>
<div class="language-bash codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-bash codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token function" style="color:#d73a49">df</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-h</span><span class="token plain"> /mnt/s3files</span></span><br></div></code></pre></div></div>
<p>以下のような出力が表示される。</p>
<div class="language-text codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-text codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">Filesystem      Size  Used Avail Use% Mounted on</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">&lt;s3files-dns&gt;   8.0E  129M  8.0E   1% /mnt/s3files</span></span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="4-動作確認">4. 動作確認<a href="https://www.hikari-dev.com/blog/2026/04/08/s3-files#4-%E5%8B%95%E4%BD%9C%E7%A2%BA%E8%AA%8D" class="hash-link" aria-label="4. 動作確認 への直接リンク" title="4. 動作確認 への直接リンク" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-bash codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token builtin class-name">cd</span><span class="token plain"> /mnt/s3files</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># ファイルの作成</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">sh</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-c</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'echo "Hello, s3 Files!" &gt; test.txt'</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># ファイルの読み取り</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function" style="color:#d73a49">cat</span><span class="token plain"> test.txt</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># ディレクトリの作成</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">mkdir</span><span class="token plain"> test-directory</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function" style="color:#d73a49">ls</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-la</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># ファイルのコピー</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">cp</span><span class="token plain"> test.txt test-directory/</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token builtin class-name">cd</span><span class="token plain"> test-directory/</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># ファイル一覧の確認</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function" style="color:#d73a49">ls</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-la</span></span><br></div></code></pre></div></div>
<p>書き込んだファイルは約 1 分で S3 バケットに同期される。S3 コンソールでオブジェクトが作成されていることを確認できる。</p>
<div class="language-sh codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-sh codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">aws s3 </span><span class="token function" style="color:#d73a49">ls</span><span class="token plain"> s3://</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">bucket-name</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain">/</span></span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="自動マウントの設定">自動マウントの設定<a href="https://www.hikari-dev.com/blog/2026/04/08/s3-files#%E8%87%AA%E5%8B%95%E3%83%9E%E3%82%A6%E3%83%B3%E3%83%88%E3%81%AE%E8%A8%AD%E5%AE%9A" class="hash-link" aria-label="自動マウントの設定 への直接リンク" title="自動マウントの設定 への直接リンク" translate="no">​</a></h2>
<p>再起動後もマウントを維持するには <code>/etc/fstab</code> に追加する。</p>
<div class="language-bash codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-bash codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token comment" style="color:#999988;font-style:italic"># /etc/fstab に追加</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">fs-0123456789abcdef0:/ /mnt/s3files s3files _netdev,nofail </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span></span><br></div></code></pre></div></div>
<p><code>_netdev</code> はネットワーク接続後にマウントするためのオプションで、必須である。<code>nofail</code> を付けることで、マウント失敗時にインスタンスが起動不能になることを防げる。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="料金">料金<a href="https://www.hikari-dev.com/blog/2026/04/08/s3-files#%E6%96%99%E9%87%91" class="hash-link" aria-label="料金 への直接リンク" title="料金 への直接リンク" translate="no">​</a></h2>
<p>S3 Files の料金は以下で構成される。</p>
<ul>
<li class=""><strong>高性能ストレージ使用量</strong>: ファイルシステム上のデータのストレージ料金</li>
<li class=""><strong>ファイルシステムアクセス料金</strong>: 高性能ストレージへの読み書き操作</li>
<li class=""><strong>S3 リクエスト料金</strong>: 1 MB 以上のファイルを S3 から直接読み取る場合は S3 GET 料金のみ</li>
</ul>
<p>プロビジョニング不要の従量課金制で、AWS によると従来の S3 とファイルシステム間のデータコピーと比較して最大 90% のコスト削減が可能とされている。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="まとめ">まとめ<a href="https://www.hikari-dev.com/blog/2026/04/08/s3-files#%E3%81%BE%E3%81%A8%E3%82%81" class="hash-link" aria-label="まとめ への直接リンク" title="まとめ への直接リンク" translate="no">​</a></h2>
<ul>
<li class="">S3 Files を使うと S3 バケットを NFS ファイルシステムとして EC2 にマウントできる</li>
<li class="">データは S3 に保持されたまま、<code>ls</code>、<code>cat</code>、<code>cp</code> などの通常のファイル操作が使える</li>
<li class="">高性能ストレージによるキャッシュで低レイテンシを実現し、アクセスのないデータは自動で退避される</li>
<li class=""><code>/etc/fstab</code> で自動マウントを設定すれば、再起動後も維持される</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="参考">参考<a href="https://www.hikari-dev.com/blog/2026/04/08/s3-files#%E5%8F%82%E8%80%83" class="hash-link" aria-label="参考 への直接リンク" title="参考 への直接リンク" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://aws.amazon.com/jp/s3/features/files/" target="_blank" rel="noopener noreferrer" class="">Amazon S3 Files - Amazon Web Services</a></li>
<li class=""><a href="https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-files.html" target="_blank" rel="noopener noreferrer" class="">S3 Files ユーザーガイド - AWS Documentation</a></li>
<li class=""><a href="https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-files-getting-started.html" target="_blank" rel="noopener noreferrer" class="">Tutorial: Getting started with S3 Files - AWS Documentation</a></li>
</ul>]]></content:encoded>
            <category>AWS</category>
            <category>Linux</category>
            <category>S3</category>
            <category>S3 Files</category>
        </item>
        <item>
            <title><![CDATA[mitmproxy で AI コーディングツールの通信を見てみる]]></title>
            <link>https://www.hikari-dev.com/blog/2026/04/05/ai-agent-mitmproxy</link>
            <guid>https://www.hikari-dev.com/blog/2026/04/05/ai-agent-mitmproxy</guid>
            <pubDate>Sun, 05 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[mitmproxy を中間プロキシとして設定することで、AI コーディングツールが裏側で行っている API 通信をリアルタイムで確認できる。]]></description>
            <content:encoded><![CDATA[<p>mitmproxy を中間プロキシとして設定することで、AI コーディングツールが裏側で行っている API 通信をリアルタイムで確認できる。</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="仕組み">仕組み<a href="https://www.hikari-dev.com/blog/2026/04/05/ai-agent-mitmproxy#%E4%BB%95%E7%B5%84%E3%81%BF" class="hash-link" aria-label="仕組み への直接リンク" title="仕組み への直接リンク" translate="no">​</a></h2>
<p>多くの AI コーディングツールは Node.js 製のアプリであり、HTTPS で外部 API と通信している。mitmproxy を中間プロキシとして挟み、Node.js に mitmproxy の CA 証明書を信頼させることで、暗号化された通信を復号してリアルタイムで確認できる。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="インストール">インストール<a href="https://www.hikari-dev.com/blog/2026/04/05/ai-agent-mitmproxy#%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB" class="hash-link" aria-label="インストール への直接リンク" title="インストール への直接リンク" translate="no">​</a></h2>
<p>mitmproxy は <code>uv</code> でインストールするのが手軽である。</p>
<div class="language-ps1 codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-ps1 codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">uv tool install mitmproxy</span></span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="プロキシの設定">プロキシの設定<a href="https://www.hikari-dev.com/blog/2026/04/05/ai-agent-mitmproxy#%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7%E3%81%AE%E8%A8%AD%E5%AE%9A" class="hash-link" aria-label="プロキシの設定 への直接リンク" title="プロキシの設定 への直接リンク" translate="no">​</a></h2>
<p>ツールを起動する前に、以下の環境変数を設定する。</p>
<div class="language-ps1 codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-ps1 codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">$env:HTTPS_PROXY = "http://127.0.0.1:8080"</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">$env:HTTP_PROXY  = "http://127.0.0.1:8080"</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">$env:NODE_EXTRA_CA_CERTS = "$env:USERPROFILE\.mitmproxy\mitmproxy-ca-cert.pem"</span></span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="node_extra_ca_certs-について">NODE_EXTRA_CA_CERTS について<a href="https://www.hikari-dev.com/blog/2026/04/05/ai-agent-mitmproxy#node_extra_ca_certs-%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6" class="hash-link" aria-label="NODE_EXTRA_CA_CERTS について への直接リンク" title="NODE_EXTRA_CA_CERTS について への直接リンク" translate="no">​</a></h3>
<p><code>HTTPS_PROXY</code> と <code>HTTP_PROXY</code> だけでは Node.js の TLS 検証が失敗し、通信できない。mitmproxy は HTTPS を中継するときに自己署名証明書を使うため、Node.js がその証明書を拒否してしまう。</p>
<p><code>NODE_EXTRA_CA_CERTS</code> に mitmproxy の CA 証明書のパスを指定することで、Node.js がその証明書を信頼するようになり、通信が成立する。</p>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="ca-証明書の生成">CA 証明書の生成<a href="https://www.hikari-dev.com/blog/2026/04/05/ai-agent-mitmproxy#ca-%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%81%AE%E7%94%9F%E6%88%90" class="hash-link" aria-label="CA 証明書の生成 への直接リンク" title="CA 証明書の生成 への直接リンク" translate="no">​</a></h3>
<p>mitmproxy は初回起動時に自動的に CA 証明書を生成し、<code>~\.mitmproxy\</code> に保存する。まだ生成していない場合は一度起動すれば生成される。</p>
<div class="language-ps1 codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-ps1 codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">mitmweb</span></span><br></div></code></pre></div></div>
<p>ブラウザが自動的に開き、<code>http://127.0.0.1:8081</code> にプロキシの管理画面が表示される。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="ツールの起動">ツールの起動<a href="https://www.hikari-dev.com/blog/2026/04/05/ai-agent-mitmproxy#%E3%83%84%E3%83%BC%E3%83%AB%E3%81%AE%E8%B5%B7%E5%8B%95" class="hash-link" aria-label="ツールの起動 への直接リンク" title="ツールの起動 への直接リンク" translate="no">​</a></h2>
<p>別のターミナルで環境変数を設定した状態でツールを起動する。</p>
<p>ツールを操作し始めると、mitmweb の画面にリクエストが流れてくる。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="キャプチャした通信の中身">キャプチャした通信の中身<a href="https://www.hikari-dev.com/blog/2026/04/05/ai-agent-mitmproxy#%E3%82%AD%E3%83%A3%E3%83%97%E3%83%81%E3%83%A3%E3%81%97%E3%81%9F%E9%80%9A%E4%BF%A1%E3%81%AE%E4%B8%AD%E8%BA%AB" class="hash-link" aria-label="キャプチャした通信の中身 への直接リンク" title="キャプチャした通信の中身 への直接リンク" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="エンドポイント">エンドポイント<a href="https://www.hikari-dev.com/blog/2026/04/05/ai-agent-mitmproxy#%E3%82%A8%E3%83%B3%E3%83%89%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88" class="hash-link" aria-label="エンドポイント への直接リンク" title="エンドポイント への直接リンク" translate="no">​</a></h3>
<p>ツールは以下のエンドポイントにリクエストを送信する。</p>
<div class="language-text codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-text codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">POST https://api.example.com/v1/messages</span></span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="リクエストヘッダー">リクエストヘッダー<a href="https://www.hikari-dev.com/blog/2026/04/05/ai-agent-mitmproxy#%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%83%98%E3%83%83%E3%83%80%E3%83%BC" class="hash-link" aria-label="リクエストヘッダー への直接リンク" title="リクエストヘッダー への直接リンク" translate="no">​</a></h3>
<div class="language-http codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-http codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">x-service-version: ...</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">content-type: application/json</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">x-api-key: sk-...</span></span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="リクエストボディ">リクエストボディ<a href="https://www.hikari-dev.com/blog/2026/04/05/ai-agent-mitmproxy#%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%83%9C%E3%83%87%E3%82%A3" class="hash-link" aria-label="リクエストボディ への直接リンク" title="リクエストボディ への直接リンク" translate="no">​</a></h3>
<div class="language-json codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-json codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"model"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"model-name"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"max_tokens"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">16000</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"stream"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"system"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"type"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"text"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"text"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"..."</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"messages"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"role"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"user"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"content"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"..."</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"tools"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Read"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"description"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"..."</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"input_schema"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span></span><br></div></code></pre></div></div>
<p><code>stream: true</code> で Server-Sent Events (SSE) 形式のストリーミングレスポンスを受け取る。</p>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="レスポンス">レスポンス<a href="https://www.hikari-dev.com/blog/2026/04/05/ai-agent-mitmproxy#%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9" class="hash-link" aria-label="レスポンス への直接リンク" title="レスポンス への直接リンク" translate="no">​</a></h3>
<div class="language-text codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-text codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""}}</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"Hello"}}</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">...</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">data: {"type":"message_stop"}</span></span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="わかること">わかること<a href="https://www.hikari-dev.com/blog/2026/04/05/ai-agent-mitmproxy#%E3%82%8F%E3%81%8B%E3%82%8B%E3%81%93%E3%81%A8" class="hash-link" aria-label="わかること への直接リンク" title="わかること への直接リンク" translate="no">​</a></h2>
<table><thead><tr><th>項目</th><th>内容</th></tr></thead><tbody><tr><td>API エンドポイント</td><td><code>api.example.com/v1/messages</code></td></tr><tr><td>認証方式</td><td>API キー (<code>x-api-key</code> ヘッダー)</td></tr><tr><td>ストリーミング</td><td>SSE 形式</td></tr><tr><td>ツール定義</td><td>毎回リクエストに含まれる</td></tr><tr><td>システムプロンプト</td><td>数千〜数万トークン規模</td></tr></tbody></table>
<p>システムプロンプトの中には AI コーディングツールの動作原則、利用可能なツールの説明、注意事項などが含まれている。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="まとめ">まとめ<a href="https://www.hikari-dev.com/blog/2026/04/05/ai-agent-mitmproxy#%E3%81%BE%E3%81%A8%E3%82%81" class="hash-link" aria-label="まとめ への直接リンク" title="まとめ への直接リンク" translate="no">​</a></h2>
<ul>
<li class=""><code>NODE_EXTRA_CA_CERTS</code> で mitmproxy の CA 証明書を Node.js に信頼させることがポイント</li>
<li class="">API 通信は SSE ストリーミング形式で行われる</li>
<li class="">ツール定義やシステムプロンプトなど、AI コーディングツールの内部構造を把握できる</li>
</ul>]]></content:encoded>
            <category>AI</category>
            <category>API</category>
        </item>
        <item>
            <title><![CDATA[Amazon Cognito でパスキー (WebAuthn) を設定してみた]]></title>
            <link>https://www.hikari-dev.com/blog/2026/04/05/cognito-passkey</link>
            <guid>https://www.hikari-dev.com/blog/2026/04/05/cognito-passkey</guid>
            <pubDate>Sun, 05 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[AWS SAM で構築したファイルストレージ API のユーザー認証に Amazon Cognito を使っている。先日、パスキー (WebAuthn) によるログインを追加したので、設定内容をまとめる。]]></description>
            <content:encoded><![CDATA[<p>AWS SAM で構築したファイルストレージ API のユーザー認証に Amazon Cognito を使っている。先日、パスキー (WebAuthn) によるログインを追加したので、設定内容をまとめる。</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="前提条件パスキーに必要な-cognito-の設定">前提条件：パスキーに必要な Cognito の設定<a href="https://www.hikari-dev.com/blog/2026/04/05/cognito-passkey#%E5%89%8D%E6%8F%90%E6%9D%A1%E4%BB%B6%E3%83%91%E3%82%B9%E3%82%AD%E3%83%BC%E3%81%AB%E5%BF%85%E8%A6%81%E3%81%AA-cognito-%E3%81%AE%E8%A8%AD%E5%AE%9A" class="hash-link" aria-label="前提条件：パスキーに必要な Cognito の設定 への直接リンク" title="前提条件：パスキーに必要な Cognito の設定 への直接リンク" translate="no">​</a></h2>
<p>Cognito でパスキーを使うには、以下がすべて揃っている必要がある。</p>
<table><thead><tr><th>要件</th><th>今回の構成</th></tr></thead><tbody><tr><td>UserPool Tier</td><td><strong>ESSENTIALS</strong> 以上</td></tr><tr><td>Managed Login</td><td><strong>v2</strong> (新しいログイン UI)</td></tr><tr><td>カスタムドメイン</td><td><code>login.example.com</code> (Relying Party ID に使用)</td></tr></tbody></table>
<p>Cognito のパスキーは Managed Login v2 UI から登録・使用する形になる。LITE tier (無料) では WebAuthn は使えないため、ESSENTIALS tier が必要である。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="認証フロー">認証フロー<a href="https://www.hikari-dev.com/blog/2026/04/05/cognito-passkey#%E8%AA%8D%E8%A8%BC%E3%83%95%E3%83%AD%E3%83%BC" class="hash-link" aria-label="認証フロー への直接リンク" title="認証フロー への直接リンク" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="パスキー登録フロー">パスキー登録フロー<a href="https://www.hikari-dev.com/blog/2026/04/05/cognito-passkey#%E3%83%91%E3%82%B9%E3%82%AD%E3%83%BC%E7%99%BB%E9%8C%B2%E3%83%95%E3%83%AD%E3%83%BC" class="hash-link" aria-label="パスキー登録フロー への直接リンク" title="パスキー登録フロー への直接リンク" translate="no">​</a></h3>
<p>初回はパスワードでログインし、アカウント設定からパスキーを登録する。</p>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="パスキーログインフロー">パスキーログインフロー<a href="https://www.hikari-dev.com/blog/2026/04/05/cognito-passkey#%E3%83%91%E3%82%B9%E3%82%AD%E3%83%BC%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E3%83%95%E3%83%AD%E3%83%BC" class="hash-link" aria-label="パスキーログインフロー への直接リンク" title="パスキーログインフロー への直接リンク" translate="no">​</a></h3>
<p>登録後は「パスキーでサインイン」ボタンから直接認証できる。</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="設定内容">設定内容<a href="https://www.hikari-dev.com/blog/2026/04/05/cognito-passkey#%E8%A8%AD%E5%AE%9A%E5%86%85%E5%AE%B9" class="hash-link" aria-label="設定内容 への直接リンク" title="設定内容 への直接リンク" translate="no">​</a></h2>
<p>パスキー追加のために <code>template.yaml</code> (SAM テンプレート) に加えた変更はわずか 6 行である。</p>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="変更前">変更前<a href="https://www.hikari-dev.com/blog/2026/04/05/cognito-passkey#%E5%A4%89%E6%9B%B4%E5%89%8D" class="hash-link" aria-label="変更前 への直接リンク" title="変更前 への直接リンク" translate="no">​</a></h3>
<div class="language-yaml codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-yaml codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token key atrule" style="color:#00a4db">UserPool</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">Type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> AWS</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">Cognito</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">UserPool</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">Properties</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># ...</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">Policies</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">PasswordPolicy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">MinimumLength</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">8</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># ...</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">MfaConfiguration</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"OFF"</span></span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="変更後">変更後<a href="https://www.hikari-dev.com/blog/2026/04/05/cognito-passkey#%E5%A4%89%E6%9B%B4%E5%BE%8C" class="hash-link" aria-label="変更後 への直接リンク" title="変更後 への直接リンク" translate="no">​</a></h3>
<div class="language-yaml codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-yaml codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token key atrule" style="color:#00a4db">UserPool</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">Type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> AWS</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">Cognito</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">UserPool</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">Properties</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># ...</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">Policies</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">PasswordPolicy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">MinimumLength</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">8</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># ...</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">SignInPolicy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">AllowedFirstAuthFactors</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> PASSWORD</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> WEB_AUTHN       </span><span class="token comment" style="color:#999988;font-style:italic"># ← パスキーを追加</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">MfaConfiguration</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"OFF"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">WebAuthnRelyingPartyID</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> login.example.com   </span><span class="token comment" style="color:#999988;font-style:italic"># ← RP ID を指定</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">WebAuthnUserVerification</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> required              </span><span class="token comment" style="color:#999988;font-style:italic"># ← 生体認証等を必須に</span></span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="各パラメータの意味">各パラメータの意味<a href="https://www.hikari-dev.com/blog/2026/04/05/cognito-passkey#%E5%90%84%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%81%AE%E6%84%8F%E5%91%B3" class="hash-link" aria-label="各パラメータの意味 への直接リンク" title="各パラメータの意味 への直接リンク" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="signinpolicyallowedfirstauthfactors"><code>SignInPolicy.AllowedFirstAuthFactors</code><a href="https://www.hikari-dev.com/blog/2026/04/05/cognito-passkey#signinpolicyallowedfirstauthfactors" class="hash-link" aria-label="signinpolicyallowedfirstauthfactors への直接リンク" title="signinpolicyallowedfirstauthfactors への直接リンク" translate="no">​</a></h3>
<p>最初の認証ステップで使える認証方式のリストである。<code>PASSWORD</code> だけだとパスワードのみ、<code>WEB_AUTHN</code> を追加するとパスキーも選べるようになる。</p>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="webauthnrelyingpartyid"><code>WebAuthnRelyingPartyID</code><a href="https://www.hikari-dev.com/blog/2026/04/05/cognito-passkey#webauthnrelyingpartyid" class="hash-link" aria-label="webauthnrelyingpartyid への直接リンク" title="webauthnrelyingpartyid への直接リンク" translate="no">​</a></h3>
<p>WebAuthn の <strong>Relying Party ID (RP ID)</strong> である。パスキーはこのドメインに紐付いて生成・保存されるため、<strong>実際にログインページを配信しているドメインと一致させる必要がある</strong>。</p>
<p>今回はカスタムドメイン <code>login.example.com</code> をそのまま指定している。Cognito デフォルトドメイン (<code>xxx.auth.ap-northeast-1.amazoncognito.com</code>) を使っている場合はそちらを指定する。</p>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="webauthnuserverification"><code>WebAuthnUserVerification</code><a href="https://www.hikari-dev.com/blog/2026/04/05/cognito-passkey#webauthnuserverification" class="hash-link" aria-label="webauthnuserverification への直接リンク" title="webauthnuserverification への直接リンク" translate="no">​</a></h3>
<p>パスキー使用時のユーザー確認レベルである。</p>
<table><thead><tr><th>値</th><th>説明</th></tr></thead><tbody><tr><td><code>required</code></td><td>生体認証・PIN など本人確認を必須とする</td></tr><tr><td><code>preferred</code></td><td>可能なら本人確認、なくても許可する</td></tr><tr><td><code>discouraged</code></td><td>本人確認を省略する (生体認証等なし)</td></tr></tbody></table>
<p>セキュリティ強化のため <code>required</code> を選択した。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="managed-login-の-ui">Managed Login の UI<a href="https://www.hikari-dev.com/blog/2026/04/05/cognito-passkey#managed-login-%E3%81%AE-ui" class="hash-link" aria-label="Managed Login の UI への直接リンク" title="Managed Login の UI への直接リンク" translate="no">​</a></h2>
<p>Managed Login v2 の画面では、パスキー設定後にログイン画面へ「パスキーでサインイン」ボタンが自動で追加される。初回登録時はパスワードでログインした後、アカウント設定からパスキーを追加できる。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="デプロイ">デプロイ<a href="https://www.hikari-dev.com/blog/2026/04/05/cognito-passkey#%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4" class="hash-link" aria-label="デプロイ への直接リンク" title="デプロイ への直接リンク" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-bash codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">sam build</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">sam deploy --no-confirm-changeset</span></span><br></div></code></pre></div></div>
<p><code>samconfig.toml</code> にスタック名・リージョン・パラメータを定義済みなので、毎回オプション指定は不要である。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="まとめ">まとめ<a href="https://www.hikari-dev.com/blog/2026/04/05/cognito-passkey#%E3%81%BE%E3%81%A8%E3%82%81" class="hash-link" aria-label="まとめ への直接リンク" title="まとめ への直接リンク" translate="no">​</a></h2>
<p>Cognito でパスキーを有効にするポイントをまとめると:</p>
<ol>
<li class=""><strong>ESSENTIALS tier</strong> に設定する (LITE では WebAuthn 非対応)</li>
<li class=""><strong>Managed Login v2</strong> を使う</li>
<li class=""><strong>カスタムドメイン</strong> (または Cognito デフォルトドメイン) を RP ID として指定する</li>
<li class=""><code>SignInPolicy.AllowedFirstAuthFactors</code> に <code>WEB_AUTHN</code> を追加する</li>
<li class=""><code>WebAuthnUserVerification: required</code> で生体認証を必須にする</li>
</ol>
<p>たった 6 行の変更でパスキーログインが使えるようになった。パスワードは残しつつ段階的にパスキーへ移行できるのが Cognito の便利なところである。</p>]]></content:encoded>
            <category>AWS</category>
            <category>Cognito</category>
            <category>WebAuthn</category>
            <category>セキュリティ</category>
        </item>
        <item>
            <title><![CDATA[PowerShell で Vertex AI Gemini API を叩く]]></title>
            <link>https://www.hikari-dev.com/blog/2026/04/03/vertex-ai-gemini-powershell</link>
            <guid>https://www.hikari-dev.com/blog/2026/04/03/vertex-ai-gemini-powershell</guid>
            <pubDate>Fri, 03 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Google Cloud の Vertex AI 経由で Gemini モデルを PowerShell から呼び出す方法をまとめる。OpenAI 互換エンドポイントとネイティブ Gemini エンドポイントの 2 種類を紹介する。]]></description>
            <content:encoded><![CDATA[<p>Google Cloud の Vertex AI 経由で Gemini モデルを PowerShell から呼び出す方法をまとめる。OpenAI 互換エンドポイントとネイティブ Gemini エンドポイントの 2 種類を紹介する。</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="認証方法">認証方法<a href="https://www.hikari-dev.com/blog/2026/04/03/vertex-ai-gemini-powershell#%E8%AA%8D%E8%A8%BC%E6%96%B9%E6%B3%95" class="hash-link" aria-label="認証方法 への直接リンク" title="認証方法 への直接リンク" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="gcloud-auth推奨">gcloud auth（推奨）<a href="https://www.hikari-dev.com/blog/2026/04/03/vertex-ai-gemini-powershell#gcloud-auth%E6%8E%A8%E5%A5%A8" class="hash-link" aria-label="gcloud auth（推奨） への直接リンク" title="gcloud auth（推奨） への直接リンク" translate="no">​</a></h3>
<p>API キー不要。既存の Google Cloud 認証情報をそのまま利用できる。</p>
<div class="language-ps1 codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-ps1 codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">$accessToken = (gcloud auth print-access-token)</span></span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="api-キー">API キー<a href="https://www.hikari-dev.com/blog/2026/04/03/vertex-ai-gemini-powershell#api-%E3%82%AD%E3%83%BC" class="hash-link" aria-label="API キー への直接リンク" title="API キー への直接リンク" translate="no">​</a></h3>
<div class="language-ps1 codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-ps1 codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">$apiKey = $env:VERTEX_API_KEY</span></span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="エンドポイント">エンドポイント<a href="https://www.hikari-dev.com/blog/2026/04/03/vertex-ai-gemini-powershell#%E3%82%A8%E3%83%B3%E3%83%89%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88" class="hash-link" aria-label="エンドポイント への直接リンク" title="エンドポイント への直接リンク" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="openai-互換エンドポイントgcloud-auth-認証">OpenAI 互換エンドポイント（gcloud auth 認証）<a href="https://www.hikari-dev.com/blog/2026/04/03/vertex-ai-gemini-powershell#openai-%E4%BA%92%E6%8F%9B%E3%82%A8%E3%83%B3%E3%83%89%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88gcloud-auth-%E8%AA%8D%E8%A8%BC" class="hash-link" aria-label="OpenAI 互換エンドポイント（gcloud auth 認証） への直接リンク" title="OpenAI 互換エンドポイント（gcloud auth 認証） への直接リンク" translate="no">​</a></h3>
<div class="language-text codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-text codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">https://{region}-aiplatform.googleapis.com/v1beta1/projects/{projectId}/locations/{region}/endpoints/openapi/chat/completions</span></span><br></div></code></pre></div></div>
<p>リクエスト・レスポンス形式が OpenAI API と同じ。モデル名に <code>google/</code> プレフィックスが必要（例: <code>google/gemini-2.5-flash-lite</code>）。</p>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="ネイティブ-gemini-エンドポイントapi-キー認証">ネイティブ Gemini エンドポイント（API キー認証）<a href="https://www.hikari-dev.com/blog/2026/04/03/vertex-ai-gemini-powershell#%E3%83%8D%E3%82%A4%E3%83%86%E3%82%A3%E3%83%96-gemini-%E3%82%A8%E3%83%B3%E3%83%89%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88api-%E3%82%AD%E3%83%BC%E8%AA%8D%E8%A8%BC" class="hash-link" aria-label="ネイティブ Gemini エンドポイント（API キー認証） への直接リンク" title="ネイティブ Gemini エンドポイント（API キー認証） への直接リンク" translate="no">​</a></h3>
<div class="language-text codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-text codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">https://{region}-aiplatform.googleapis.com/v1/projects/{projectId}/locations/{region}/publishers/google/models/{model}:generateContent</span></span><br></div></code></pre></div></div>
<p>ストリーミングが必要な場合は <code>:streamGenerateContent</code> を使用する。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="基本的な呼び出し">基本的な呼び出し<a href="https://www.hikari-dev.com/blog/2026/04/03/vertex-ai-gemini-powershell#%E5%9F%BA%E6%9C%AC%E7%9A%84%E3%81%AA%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97" class="hash-link" aria-label="基本的な呼び出し への直接リンク" title="基本的な呼び出し への直接リンク" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="openai-互換gcloud-auth">OpenAI 互換（gcloud auth）<a href="https://www.hikari-dev.com/blog/2026/04/03/vertex-ai-gemini-powershell#openai-%E4%BA%92%E6%8F%9Bgcloud-auth" class="hash-link" aria-label="OpenAI 互換（gcloud auth） への直接リンク" title="OpenAI 互換（gcloud auth） への直接リンク" translate="no">​</a></h3>
<div class="language-ps1 codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-ps1 codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">$projectId   = "your-project-id"</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">$region      = "us-central1"</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">$model       = "google/gemini-2.5-flash-lite"</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">$accessToken = (gcloud auth print-access-token)</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">$body = @{</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    model    = $model</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    messages = @(</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">        @{</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">            role    = "user"</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">            content = "東京の人口は?"</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">        }</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    )</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">} | ConvertTo-Json -Depth 10</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">$uri = "https://$region-aiplatform.googleapis.com/v1beta1/projects/$projectId/locations/$region/endpoints/openapi/chat/completions"</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">$response = Invoke-RestMethod `</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    -Uri         $uri `</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    -Method      Post `</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    -ContentType "application/json" `</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    -Headers     @{ Authorization = "Bearer $accessToken" } `</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    -Body        $body</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">$response.choices[0].message.content</span></span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="ネイティブ-geminiapi-キー">ネイティブ Gemini（API キー）<a href="https://www.hikari-dev.com/blog/2026/04/03/vertex-ai-gemini-powershell#%E3%83%8D%E3%82%A4%E3%83%86%E3%82%A3%E3%83%96-geminiapi-%E3%82%AD%E3%83%BC" class="hash-link" aria-label="ネイティブ Gemini（API キー） への直接リンク" title="ネイティブ Gemini（API キー） への直接リンク" translate="no">​</a></h3>
<div class="language-ps1 codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-ps1 codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">$projectId = "your-project-id"</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">$region    = "us-central1"</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">$model     = "gemini-2.5-flash-lite"</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">$apiKey    = $env:VERTEX_API_KEY</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">$body = @{</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    contents = @(</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">        @{</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">            role  = "user"</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">            parts = @(</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">                @{ text = "東京の人口は?" }</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">            )</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">        }</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    )</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">} | ConvertTo-Json -Depth 10</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">$uri = "https://$region-aiplatform.googleapis.com/v1/projects/$projectId/locations/$region/publishers/google/models/${model}:generateContent?key=$apiKey"</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">$response = Invoke-RestMethod `</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    -Uri         $uri `</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    -Method      Post `</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    -ContentType "application/json" `</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    -Body        $body</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">$response.candidates[0].content.parts[0].text</span></span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="レスポンス構造">レスポンス構造<a href="https://www.hikari-dev.com/blog/2026/04/03/vertex-ai-gemini-powershell#%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9%E6%A7%8B%E9%80%A0" class="hash-link" aria-label="レスポンス構造 への直接リンク" title="レスポンス構造 への直接リンク" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="openai-互換">OpenAI 互換<a href="https://www.hikari-dev.com/blog/2026/04/03/vertex-ai-gemini-powershell#openai-%E4%BA%92%E6%8F%9B" class="hash-link" aria-label="OpenAI 互換 への直接リンク" title="OpenAI 互換 への直接リンク" translate="no">​</a></h3>
<div class="language-ps1 codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-ps1 codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">$response.choices[0].message.content  # 生成テキスト</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">$response.usage.total_tokens           # 合計トークン数</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">$response.model                        # 使用モデル</span></span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="ネイティブ-gemini">ネイティブ Gemini<a href="https://www.hikari-dev.com/blog/2026/04/03/vertex-ai-gemini-powershell#%E3%83%8D%E3%82%A4%E3%83%86%E3%82%A3%E3%83%96-gemini" class="hash-link" aria-label="ネイティブ Gemini への直接リンク" title="ネイティブ Gemini への直接リンク" translate="no">​</a></h3>
<div class="language-ps1 codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-ps1 codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">$response.candidates[0].content.parts[0].text  # 生成テキスト</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">$response.usageMetadata.totalTokenCount         # 合計トークン数</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">$response.modelVersion                          # 使用モデルバージョン</span></span><br></div></code></pre></div></div>
<p>ストリーミング（<code>streamGenerateContent</code>）の場合は複数チャンクの配列が返るため、テキストを結合して取り出す。</p>
<div class="language-ps1 codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-ps1 codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">$fullText = ($response | ForEach-Object {</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    $_.candidates[0].content.parts[0].text</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">}) -join ""</span></span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="システムプロンプトを追加する">システムプロンプトを追加する<a href="https://www.hikari-dev.com/blog/2026/04/03/vertex-ai-gemini-powershell#%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B" class="hash-link" aria-label="システムプロンプトを追加する への直接リンク" title="システムプロンプトを追加する への直接リンク" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="openai-互換-1">OpenAI 互換<a href="https://www.hikari-dev.com/blog/2026/04/03/vertex-ai-gemini-powershell#openai-%E4%BA%92%E6%8F%9B-1" class="hash-link" aria-label="OpenAI 互換 への直接リンク" title="OpenAI 互換 への直接リンク" translate="no">​</a></h3>
<div class="language-ps1 codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-ps1 codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">$body = @{</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    model    = $model</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    messages = @(</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">        @{</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">            role    = "system"</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">            content = "日本語で回答する AI アシスタントです。簡潔に答えてください。"</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">        }</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">        @{</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">            role    = "user"</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">            content = "What is the speed of light?"</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">        }</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    )</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">} | ConvertTo-Json -Depth 10</span></span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="ネイティブ-gemini-1">ネイティブ Gemini<a href="https://www.hikari-dev.com/blog/2026/04/03/vertex-ai-gemini-powershell#%E3%83%8D%E3%82%A4%E3%83%86%E3%82%A3%E3%83%96-gemini-1" class="hash-link" aria-label="ネイティブ Gemini への直接リンク" title="ネイティブ Gemini への直接リンク" translate="no">​</a></h3>
<div class="language-ps1 codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-ps1 codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">$body = @{</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    system_instruction = @{</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">        parts = @(</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">            @{ text = "日本語で回答する AI アシスタントです。簡潔に答えてください。" }</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">        )</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    }</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    contents = @(</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">        @{</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">            role  = "user"</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">            parts = @(@{ text = "What is the speed of light?" })</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">        }</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    )</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">} | ConvertTo-Json -Depth 10</span></span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="マルチターン会話">マルチターン会話<a href="https://www.hikari-dev.com/blog/2026/04/03/vertex-ai-gemini-powershell#%E3%83%9E%E3%83%AB%E3%83%81%E3%82%BF%E3%83%BC%E3%83%B3%E4%BC%9A%E8%A9%B1" class="hash-link" aria-label="マルチターン会話 への直接リンク" title="マルチターン会話 への直接リンク" translate="no">​</a></h2>
<p>これまでの会話履歴を配列に並べることでマルチターン会話が実現できる。</p>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="openai-互換-2">OpenAI 互換<a href="https://www.hikari-dev.com/blog/2026/04/03/vertex-ai-gemini-powershell#openai-%E4%BA%92%E6%8F%9B-2" class="hash-link" aria-label="OpenAI 互換 への直接リンク" title="OpenAI 互換 への直接リンク" translate="no">​</a></h3>
<div class="language-ps1 codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-ps1 codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">$body = @{</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    model    = $model</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    messages = @(</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">        @{ role = "user";      content = "猫と犬、どちらが好きですか?" }</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">        @{ role = "assistant"; content = "私は猫が好きです。" }</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">        @{ role = "user";      content = "その理由は?" }</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    )</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">} | ConvertTo-Json -Depth 10</span></span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="ネイティブ-gemini-2">ネイティブ Gemini<a href="https://www.hikari-dev.com/blog/2026/04/03/vertex-ai-gemini-powershell#%E3%83%8D%E3%82%A4%E3%83%86%E3%82%A3%E3%83%96-gemini-2" class="hash-link" aria-label="ネイティブ Gemini への直接リンク" title="ネイティブ Gemini への直接リンク" translate="no">​</a></h3>
<p>アシスタントのロールは <code>"model"</code> を指定する。</p>
<div class="language-ps1 codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-ps1 codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">$body = @{</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    contents = @(</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">        @{</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">            role  = "user"</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">            parts = @(@{ text = "猫と犬、どちらが好きですか?" })</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">        }</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">        @{</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">            role  = "model"</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">            parts = @(@{ text = "私は猫が好きです。" })</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">        }</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">        @{</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">            role  = "user"</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">            parts = @(@{ text = "その理由は?" })</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">        }</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    )</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">} | ConvertTo-Json -Depth 10</span></span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="利用可能なモデル">利用可能なモデル<a href="https://www.hikari-dev.com/blog/2026/04/03/vertex-ai-gemini-powershell#%E5%88%A9%E7%94%A8%E5%8F%AF%E8%83%BD%E3%81%AA%E3%83%A2%E3%83%87%E3%83%AB" class="hash-link" aria-label="利用可能なモデル への直接リンク" title="利用可能なモデル への直接リンク" translate="no">​</a></h2>
<table><thead><tr><th>モデル</th><th>OpenAI 互換名</th><th>特徴</th></tr></thead><tbody><tr><td><code>gemini-2.5-flash-lite</code></td><td><code>google/gemini-2.5-flash-lite</code></td><td>軽量・高速・低コスト</td></tr><tr><td><code>gemini-2.5-flash</code></td><td><code>google/gemini-2.5-flash</code></td><td>バランス型</td></tr><tr><td><code>gemini-2.5-pro</code></td><td><code>google/gemini-2.5-pro</code></td><td>高精度・複雑なタスク向け</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="方式の選択基準">方式の選択基準<a href="https://www.hikari-dev.com/blog/2026/04/03/vertex-ai-gemini-powershell#%E6%96%B9%E5%BC%8F%E3%81%AE%E9%81%B8%E6%8A%9E%E5%9F%BA%E6%BA%96" class="hash-link" aria-label="方式の選択基準 への直接リンク" title="方式の選択基準 への直接リンク" translate="no">​</a></h2>
<table><thead><tr><th>状況</th><th>推奨方式</th></tr></thead><tbody><tr><td>GCP 認証済み環境（開発・CI など）</td><td>OpenAI 互換 + gcloud auth</td></tr><tr><td>API キーのみ利用可能</td><td>ネイティブ Gemini</td></tr><tr><td>OpenAI から移行中</td><td>OpenAI 互換（コード変更を最小化）</td></tr><tr><td>ストリーミングが必要</td><td>ネイティブ Gemini</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="注意事項">注意事項<a href="https://www.hikari-dev.com/blog/2026/04/03/vertex-ai-gemini-powershell#%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A0%85" class="hash-link" aria-label="注意事項 への直接リンク" title="注意事項 への直接リンク" translate="no">​</a></h2>
<ul>
<li class="">API キーはスクリプトにハードコードせず、環境変数 (<code>$env:VERTEX_API_KEY</code>) から読み込むこと。</li>
<li class="">gcloud auth の場合、トークンの有効期限は約 1 時間。長時間スクリプトでは都度再取得が必要。</li>
<li class="">レート制限やクォータはプロジェクトごとに設定されている。大量リクエストを送る場合は事前に確認すること。</li>
</ul>]]></content:encoded>
            <category>AI</category>
            <category>PowerShell</category>
            <category>GCP</category>
        </item>
        <item>
            <title><![CDATA[CORS とは何か - セキュリティの観点から初心者向けに解説]]></title>
            <link>https://www.hikari-dev.com/blog/2026/04/02/cors-security</link>
            <guid>https://www.hikari-dev.com/blog/2026/04/02/cors-security</guid>
            <pubDate>Thu, 02 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Web ブラウザーのセキュリティ機能である CORS (Cross-Origin Resource Sharing) について、「なぜ必要なのか」「何が危険なのか」を初心者向けに解説する。正しく理解することで、セキュアな Web 開発が可能になる。]]></description>
            <content:encoded><![CDATA[<p>Web ブラウザーのセキュリティ機能である <strong>CORS (Cross-Origin Resource Sharing)</strong> について、「なぜ必要なのか」「何が危険なのか」を初心者向けに解説する。正しく理解することで、セキュアな Web 開発が可能になる。</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="cors-が必要になった背景-同一オリジンポリシー">CORS が必要になった背景: 同一オリジンポリシー<a href="https://www.hikari-dev.com/blog/2026/04/02/cors-security#cors-%E3%81%8C%E5%BF%85%E8%A6%81%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%9F%E8%83%8C%E6%99%AF-%E5%90%8C%E4%B8%80%E3%82%AA%E3%83%AA%E3%82%B8%E3%83%B3%E3%83%9D%E3%83%AA%E3%82%B7%E3%83%BC" class="hash-link" aria-label="CORS が必要になった背景: 同一オリジンポリシー への直接リンク" title="CORS が必要になった背景: 同一オリジンポリシー への直接リンク" translate="no">​</a></h2>
<p>1990 年代初頭、JavaScript がブラウザーに搭載されたとき、Web セキュリティの概念はほぼ存在しなかった。当時、悪意のある Web サイトが他のサイトのデータに自由にアクセスできたため、セッション乗っ取りやデータ窃盗が容易だった。</p>
<p>この問題を解決するため、<strong>同一オリジンポリシー (Same-Origin Policy)</strong> という制限が導入された。これは「Web ページから読み込んだ JavaScript は、そのページと異なるオリジンのデータにアクセスできない」というシンプルかつ強力なルールである。</p>
<p>例えば、<code>https://www.example.com</code> のページから読み込んだ JavaScript は、<code>https://www.bank.com</code> のデータにアクセスできない。これにより、ユーザーが銀行サイトにログイン中に悪意のあるサイトにアクセスしても、銀行の情報が盗まれることはなくなった。</p>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="同一オリジンとは">同一オリジンとは<a href="https://www.hikari-dev.com/blog/2026/04/02/cors-security#%E5%90%8C%E4%B8%80%E3%82%AA%E3%83%AA%E3%82%B8%E3%83%B3%E3%81%A8%E3%81%AF" class="hash-link" aria-label="同一オリジンとは への直接リンク" title="同一オリジンとは への直接リンク" translate="no">​</a></h3>
<p><strong>オリジン (Origin)</strong> とは、以下の 3 つで決まる。</p>
<ul>
<li class=""><strong>プロトコル</strong>: <code>http://</code> か <code>https://</code> か</li>
<li class=""><strong>ホスト (ドメイン)</strong>: <code>example.com</code> か <code>api.example.com</code> か</li>
<li class=""><strong>ポート</strong>: <code>80</code> か <code>8080</code> か</li>
</ul>
<p>例えば、</p>
<table><thead><tr><th>URL</th><th>プロトコル</th><th>ホスト</th><th>ポート</th><th>オリジン</th></tr></thead><tbody><tr><td><code>https://www.example.com/page</code></td><td>HTTPS</td><td><a href="http://www.example.com/" target="_blank" rel="noopener noreferrer" class="">www.example.com</a></td><td>443 (デフォルト)</td><td><code>https://www.example.com</code></td></tr><tr><td><code>https://api.example.com/data</code></td><td>HTTPS</td><td>api.example.com</td><td>443 (デフォルト)</td><td><code>https://api.example.com</code></td></tr></tbody></table>
<p>これらは異なるホストなので、<strong>異なるオリジン</strong> と見なされる。</p>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="同一オリジンポリシーが防ぐもの">同一オリジンポリシーが防ぐもの<a href="https://www.hikari-dev.com/blog/2026/04/02/cors-security#%E5%90%8C%E4%B8%80%E3%82%AA%E3%83%AA%E3%82%B8%E3%83%B3%E3%83%9D%E3%83%AA%E3%82%B7%E3%83%BC%E3%81%8C%E9%98%B2%E3%81%90%E3%82%82%E3%81%AE" class="hash-link" aria-label="同一オリジンポリシーが防ぐもの への直接リンク" title="同一オリジンポリシーが防ぐもの への直接リンク" translate="no">​</a></h3>
<p>JavaScript からの <strong>XHR (XMLHttpRequest)</strong> や <strong>Fetch API</strong> で、異なるオリジンへのリクエストが制限される。</p>
<p>例: evil.com にある悪意のあるスクリプト</p>
<div class="language-javascript codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-javascript codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token function" style="color:#d73a49">fetch</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'https://bank.example.com/api/transfer'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">method</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'POST'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">body</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token known-class-name class-name">JSON</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">stringify</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">amount</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1000000</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span></span><br></div></code></pre></div></div>
<p>同一オリジンポリシーがなければ、悪意あるサイト (<code>evil.com</code>) の JavaScript から、ユーザーが銀行サイトにログインしている状態で送金リクエストを送られてしまう。<strong>これを防ぐのが同一オリジンポリシーの目的である</strong>。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="なぜ-cors-が必要か">なぜ CORS が必要か<a href="https://www.hikari-dev.com/blog/2026/04/02/cors-security#%E3%81%AA%E3%81%9C-cors-%E3%81%8C%E5%BF%85%E8%A6%81%E3%81%8B" class="hash-link" aria-label="なぜ CORS が必要か への直接リンク" title="なぜ CORS が必要か への直接リンク" translate="no">​</a></h2>
<p>しかし現代の Web では、複数のオリジンが協力する設計が一般的。</p>
<ul>
<li class=""><strong>フロントエンド</strong>: <code>https://www.example.com</code></li>
<li class=""><strong>API サーバー</strong>: <code>https://api.example.com</code></li>
<li class=""><strong>CDN / 静的ファイル</strong>: <code>https://cdn.example.com</code></li>
</ul>
<p>これらは<strong>同じ企業が運営しており、正当な通信</strong>である。しかし同一オリジンポリシーで制限されては、アプリが動かない。</p>
<p>そこで CORS (Cross-Origin Resource Sharing) が登場した。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="cors-とは明示的にアクセスを許可する">CORS とは：明示的にアクセスを許可する<a href="https://www.hikari-dev.com/blog/2026/04/02/cors-security#cors-%E3%81%A8%E3%81%AF%E6%98%8E%E7%A4%BA%E7%9A%84%E3%81%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%82%92%E8%A8%B1%E5%8F%AF%E3%81%99%E3%82%8B" class="hash-link" aria-label="CORS とは：明示的にアクセスを許可する への直接リンク" title="CORS とは：明示的にアクセスを許可する への直接リンク" translate="no">​</a></h2>
<p><strong>CORS は、サーバー側が「このオリジンからのリクエストは許可する」と明示的に宣言する仕組み</strong>である。</p>
<p>サーバーが以下のレスポンス ヘッダーを返すだけで、ブラウザーが制限を緩和する。</p>
<div class="language-http codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-http codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">Access-Control-Allow-Origin: https://www.example.com</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">Access-Control-Allow-Methods: GET, POST, PUT</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">Access-Control-Allow-Headers: Content-Type, Authorization</span></span><br></div></code></pre></div></div>
<p><strong>サーバーが「許可」と言わない限り、ブラウザーはリクエストの結果を JavaScript に渡さない</strong>。これで安全性を保ちながら、クロスオリジンアクセスを実現する。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="cors-のセキュリティリスクよくある設定ミス">CORS のセキュリティリスク：よくある設定ミス<a href="https://www.hikari-dev.com/blog/2026/04/02/cors-security#cors-%E3%81%AE%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E3%83%AA%E3%82%B9%E3%82%AF%E3%82%88%E3%81%8F%E3%81%82%E3%82%8B%E8%A8%AD%E5%AE%9A%E3%83%9F%E3%82%B9" class="hash-link" aria-label="CORS のセキュリティリスク：よくある設定ミス への直接リンク" title="CORS のセキュリティリスク：よくある設定ミス への直接リンク" translate="no">​</a></h2>
<p>便利な CORS だが、設定を間違えるとセキュリティホールになる。</p>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="ng-すべてのオリジンを許可する">NG: すべてのオリジンを許可する<a href="https://www.hikari-dev.com/blog/2026/04/02/cors-security#ng-%E3%81%99%E3%81%B9%E3%81%A6%E3%81%AE%E3%82%AA%E3%83%AA%E3%82%B8%E3%83%B3%E3%82%92%E8%A8%B1%E5%8F%AF%E3%81%99%E3%82%8B" class="hash-link" aria-label="NG: すべてのオリジンを許可する への直接リンク" title="NG: すべてのオリジンを許可する への直接リンク" translate="no">​</a></h3>
<div class="language-http codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-http codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">Access-Control-Allow-Origin: *</span></span><br></div></code></pre></div></div>
<p>これは「世界中誰からでも、このサーバーにアクセス OK」という意味。</p>
<div class="language-javascript codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-javascript codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token comment" style="color:#999988;font-style:italic">// https://evil.com の JavaScript から</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function" style="color:#d73a49">fetch</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'https://api.example.com/user/profile'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">then</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">r</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> r</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">json</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">then</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">data</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// ユーザーのプロフィール情報を盗む処理</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">data</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span></span><br></div></code></pre></div></div>
<p>認証情報 (Cookie) を含むリクエストでは特に危険であり、ユーザーが <code>api.example.com</code> にログイン状態で <code>evil.com</code> にアクセスすると、個人情報が盗まれる。</p>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="半分だけ危険cookie-を含む場合は--禁止">半分だけ危険：Cookie を含む場合は <code>*</code> 禁止<a href="https://www.hikari-dev.com/blog/2026/04/02/cors-security#%E5%8D%8A%E5%88%86%E3%81%A0%E3%81%91%E5%8D%B1%E9%99%BAcookie-%E3%82%92%E5%90%AB%E3%82%80%E5%A0%B4%E5%90%88%E3%81%AF--%E7%A6%81%E6%AD%A2" class="hash-link" aria-label="半分だけ危険cookie-を含む場合は--禁止 への直接リンク" title="半分だけ危険cookie-を含む場合は--禁止 への直接リンク" translate="no">​</a></h3>
<div class="language-javascript codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-javascript codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token function" style="color:#d73a49">fetch</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'https://api.example.com/user/profile'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">credentials</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'include'</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Cookie を含める</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span></span><br></div></code></pre></div></div>
<p>認証情報を含む場合、<code>Access-Control-Allow-Origin: *</code> は使用できない。必ず<strong>具体的なオリジンを指定</strong>する必要がある。</p>
<div class="language-http codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-http codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">Access-Control-Allow-Origin: https://www.example.com</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">Access-Control-Allow-Credentials: true</span></span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="ng-ユーザーが指定した-url-をそのまま許可する">NG: ユーザーが指定した URL をそのまま許可する<a href="https://www.hikari-dev.com/blog/2026/04/02/cors-security#ng-%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%8C%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%9F-url-%E3%82%92%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%E8%A8%B1%E5%8F%AF%E3%81%99%E3%82%8B" class="hash-link" aria-label="NG: ユーザーが指定した URL をそのまま許可する への直接リンク" title="NG: ユーザーが指定した URL をそのまま許可する への直接リンク" translate="no">​</a></h3>
<div class="language-javascript codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-javascript codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token comment" style="color:#999988;font-style:italic">// 危険な実装例 (サーバー側)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> origin </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> request</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">headers</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'Origin'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">response</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">headers</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">set</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'Access-Control-Allow-Origin'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> origin</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// そのまま返す!</span></span><br></div></code></pre></div></div>
<p>こうすると、<code>https://evil.com</code> からのリクエストでも、レスポンスに <code>Access-Control-Allow-Origin: https://evil.com</code> が付いて、悪用される。</p>
<p><strong>ホワイトリストを用意して、そこにあるものだけ許可する</strong>のが正解である。</p>
<div class="language-javascript codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-javascript codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> allowedOrigins </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token string" style="color:#e3116c">'https://www.example.com'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token string" style="color:#e3116c">'https://admin.example.com'</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">allowedOrigins</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">includes</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">origin</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  response</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">headers</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">set</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'Access-Control-Allow-Origin'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> origin</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span></span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="ng-すべてのヘッダーを許可する">NG: すべてのヘッダーを許可する<a href="https://www.hikari-dev.com/blog/2026/04/02/cors-security#ng-%E3%81%99%E3%81%B9%E3%81%A6%E3%81%AE%E3%83%98%E3%83%83%E3%83%80%E3%83%BC%E3%82%92%E8%A8%B1%E5%8F%AF%E3%81%99%E3%82%8B" class="hash-link" aria-label="NG: すべてのヘッダーを許可する への直接リンク" title="NG: すべてのヘッダーを許可する への直接リンク" translate="no">​</a></h3>
<div class="language-http codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-http codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">Access-Control-Allow-Headers: *</span></span><br></div></code></pre></div></div>
<p>これは「どんなヘッダーでも受け付ける」という意味であり、カスタム ヘッダーで不正なデータを注入する攻撃が可能となる。</p>
<p><strong>必要なヘッダーだけリストアップ</strong>する。</p>
<div class="language-http codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-http codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">Access-Control-Allow-Headers: Content-Type, Authorization</span></span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="cors-プリフライト-リクエストブラウザーの事前確認">CORS プリフライト リクエスト：ブラウザーの事前確認<a href="https://www.hikari-dev.com/blog/2026/04/02/cors-security#cors-%E3%83%97%E3%83%AA%E3%83%95%E3%83%A9%E3%82%A4%E3%83%88-%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%83%BC%E3%81%AE%E4%BA%8B%E5%89%8D%E7%A2%BA%E8%AA%8D" class="hash-link" aria-label="CORS プリフライト リクエスト：ブラウザーの事前確認 への直接リンク" title="CORS プリフライト リクエスト：ブラウザーの事前確認 への直接リンク" translate="no">​</a></h2>
<p>単純なリクエスト (GET、HEAD、POST) 以外は、ブラウザーが事前に <strong>OPTIONS メソッド</strong> で「これで大丈夫？」と確認する。これをプリフライト リクエストという。</p>
<div class="language-text codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-text codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">1. JavaScript が PUT リクエストを送ろうとする</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">2. ブラウザーが OPTIONS プリフライト リクエストを自動送信</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    OPTIONS /api/resource HTTP/1.1</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    Origin: https://www.example.com</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    Access-Control-Request-Method: PUT</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    Access-Control-Request-Headers: Content-Type</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">3. サーバーが「OK」と応答</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    HTTP 200 OK</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    Access-Control-Allow-Origin: https://www.example.com</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    Access-Control-Allow-Methods: PUT</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    Access-Control-Allow-Headers: Content-Type</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">4. ブラウザーが実際の PUT リクエストを送信</span></span><br></div></code></pre></div></div>
<p>サーバー側で <code>OPTIONS</code> メソッドに対応していないと、プリフライトで失敗して、実際のリクエストが送信されない。</p>
<p><strong>ポイント:</strong></p>
<ul>
<li class="">ホワイトリストで許可するオリジンを明示的に指定</li>
<li class=""><code>credentials: true</code> で Cookie 認証を含むリクエストに対応</li>
<li class="">必要なメソッドとヘッダーのみ許可</li>
<li class="">OPTIONS プリフライト リクエスト</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="よくある疑問">よくある疑問<a href="https://www.hikari-dev.com/blog/2026/04/02/cors-security#%E3%82%88%E3%81%8F%E3%81%82%E3%82%8B%E7%96%91%E5%95%8F" class="hash-link" aria-label="よくある疑問 への直接リンク" title="よくある疑問 への直接リンク" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="q-cors-エラーが出たすべてのオリジンを許可して解決できるか">Q. CORS エラーが出た。すべてのオリジンを許可して解決できるか?<a href="https://www.hikari-dev.com/blog/2026/04/02/cors-security#q-cors-%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%8C%E5%87%BA%E3%81%9F%E3%81%99%E3%81%B9%E3%81%A6%E3%81%AE%E3%82%AA%E3%83%AA%E3%82%B8%E3%83%B3%E3%82%92%E8%A8%B1%E5%8F%AF%E3%81%97%E3%81%A6%E8%A7%A3%E6%B1%BA%E3%81%A7%E3%81%8D%E3%82%8B%E3%81%8B" class="hash-link" aria-label="Q. CORS エラーが出た。すべてのオリジンを許可して解決できるか? への直接リンク" title="Q. CORS エラーが出た。すべてのオリジンを許可して解決できるか? への直接リンク" translate="no">​</a></h3>
<p><strong>A:</strong> NG。一時的には動くかもしれないが、本番環境で <code>*</code> 許可するのはセキュリティリスクである。サーバー側設定を見直すか、API の設計を変更する必要がある。</p>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="q-ローカル開発中異なるポートのオリジンにアクセスしたいのか">Q. ローカル開発中、異なるポートのオリジンにアクセスしたいのか?<a href="https://www.hikari-dev.com/blog/2026/04/02/cors-security#q-%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E9%96%8B%E7%99%BA%E4%B8%AD%E7%95%B0%E3%81%AA%E3%82%8B%E3%83%9D%E3%83%BC%E3%83%88%E3%81%AE%E3%82%AA%E3%83%AA%E3%82%B8%E3%83%B3%E3%81%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%97%E3%81%9F%E3%81%84%E3%81%AE%E3%81%8B" class="hash-link" aria-label="Q. ローカル開発中、異なるポートのオリジンにアクセスしたいのか? への直接リンク" title="Q. ローカル開発中、異なるポートのオリジンにアクセスしたいのか? への直接リンク" translate="no">​</a></h3>
<p><strong>A:</strong> ローカル開発環境だけ CORS を無効化するのは問題ない。</p>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="q-モバイルアプリから-api-を呼ぶ場合cors-は関係あるか">Q. モバイルアプリから API を呼ぶ場合、CORS は関係あるか?<a href="https://www.hikari-dev.com/blog/2026/04/02/cors-security#q-%E3%83%A2%E3%83%90%E3%82%A4%E3%83%AB%E3%82%A2%E3%83%97%E3%83%AA%E3%81%8B%E3%82%89-api-%E3%82%92%E5%91%BC%E3%81%B6%E5%A0%B4%E5%90%88cors-%E3%81%AF%E9%96%A2%E4%BF%82%E3%81%82%E3%82%8B%E3%81%8B" class="hash-link" aria-label="Q. モバイルアプリから API を呼ぶ場合、CORS は関係あるか? への直接リンク" title="Q. モバイルアプリから API を呼ぶ場合、CORS は関係あるか? への直接リンク" translate="no">​</a></h3>
<p><strong>A:</strong> CORS はブラウザーのセキュリティ機能なので、<strong>モバイルアプリには関係ない</strong>。代わりに、API キーや OAuth で認証・認可を実装する必要がある。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="まとめ">まとめ<a href="https://www.hikari-dev.com/blog/2026/04/02/cors-security#%E3%81%BE%E3%81%A8%E3%82%81" class="hash-link" aria-label="まとめ への直接リンク" title="まとめ への直接リンク" translate="no">​</a></h2>
<table><thead><tr><th>ポイント</th><th>説明</th></tr></thead><tbody><tr><td><strong>CORS の目的</strong></td><td>ブラウザーのセキュリティを保ちながら、クロスオリジンアクセスを許可する</td></tr><tr><td><strong>危険な設定</strong></td><td><code>Access-Control-Allow-Origin: *</code> を認証が必要な API に使う</td></tr><tr><td><strong>正しい設定</strong></td><td>ホワイトリストで許可するオリジンを明示的に指定</td></tr><tr><td><strong>Cookie 含む場合</strong></td><td><code>Access-Control-Allow-Credentials: true</code> と具体的なオリジン指定が必須</td></tr><tr><td><strong>プリフライト</strong></td><td>PUT/DELETE など複雑なリクエストはブラウザーが OPTIONS で事前確認</td></tr></tbody></table>
<p>CORS は単なる「エラーの原因」ではなく、Web セキュリティの重要な仕組みである。
設定を間違えると、セキュリティ事故につながるため、慎重に取り扱う必要がある。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="参考">参考<a href="https://www.hikari-dev.com/blog/2026/04/02/cors-security#%E5%8F%82%E8%80%83" class="hash-link" aria-label="参考 への直接リンク" title="参考 への直接リンク" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://developer.mozilla.org/ja/docs/Web/HTTP/CORS" target="_blank" rel="noopener noreferrer" class="">MDN Web Docs - CORS (Cross-Origin Resource Sharing)</a></li>
<li class=""><a href="https://developer.mozilla.org/ja/docs/Web/Security/Same-origin_policy" target="_blank" rel="noopener noreferrer" class="">Same-origin policy - MDN Web Docs</a></li>
</ul>]]></content:encoded>
            <category>Web</category>
            <category>セキュリティ</category>
        </item>
        <item>
            <title><![CDATA[OpenAI API で複数言語に対応した翻訳 CLI ツール translate-mcp の開発]]></title>
            <link>https://www.hikari-dev.com/blog/2026/04/02/translate-mcp</link>
            <guid>https://www.hikari-dev.com/blog/2026/04/02/translate-mcp</guid>
            <pubDate>Thu, 02 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[translate-mcp は OpenAI の API を使った翻訳ツールである。CLI モードと MCP サーバーの両方の利用方法に対応している。]]></description>
            <content:encoded><![CDATA[<p>translate-mcp は OpenAI の API を使った翻訳ツールである。CLI モードと MCP サーバーの両方の利用方法に対応している。
ファイル全体を翻訳したい場合から、AI ツールに統合して使いたい場合まで、幅広いシーンで活躍する。</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="translate-mcp-とは">translate-mcp とは<a href="https://www.hikari-dev.com/blog/2026/04/02/translate-mcp#translate-mcp-%E3%81%A8%E3%81%AF" class="hash-link" aria-label="translate-mcp とは への直接リンク" title="translate-mcp とは への直接リンク" translate="no">​</a></h2>
<p><a href="https://github.com/Himeyama/translate-mcp" target="_blank" rel="noopener noreferrer" class="">translate-mcp</a> は、<strong>OpenAI API を使った翻訳専用ツール</strong> である。Python で実装されており、次の 2 つの利用方法がある。</p>
<ol>
<li class=""><strong>CLI モード</strong>: コマンドラインから直接ファイルを翻訳</li>
<li class=""><strong>MCP サーバーモード</strong>: Model Context Protocol (MCP) サーバーとして動作し、AI ツールに統合</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="特徴">特徴<a href="https://www.hikari-dev.com/blog/2026/04/02/translate-mcp#%E7%89%B9%E5%BE%B4" class="hash-link" aria-label="特徴 への直接リンク" title="特徴 への直接リンク" translate="no">​</a></h2>
<ul>
<li class=""><strong>複数言語対応</strong>: 多言語に対応している</li>
<li class=""><strong>シンプルな使い方</strong>: API キー 1 つで始められる</li>
<li class=""><strong>2 つの利用方法</strong>: CLI スクリプトとしても、MCP サーバーとしても動作する</li>
<li class=""><strong>軽量</strong>: 外部ライブラリに依存せず、OpenAI API に依存するのみ</li>
<li class=""><strong>エラー ハンドリング</strong>: CLI モードは stderr、MCP モードは JSON 形式で返却する</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="セットアップ">セットアップ<a href="https://www.hikari-dev.com/blog/2026/04/02/translate-mcp#%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97" class="hash-link" aria-label="セットアップ への直接リンク" title="セットアップ への直接リンク" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="前提条件">前提条件<a href="https://www.hikari-dev.com/blog/2026/04/02/translate-mcp#%E5%89%8D%E6%8F%90%E6%9D%A1%E4%BB%B6" class="hash-link" aria-label="前提条件 への直接リンク" title="前提条件 への直接リンク" translate="no">​</a></h3>
<ul>
<li class="">Python がインストール済み</li>
<li class="">OpenAI API キーを取得済み</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="uv-のインストール">uv のインストール<a href="https://www.hikari-dev.com/blog/2026/04/02/translate-mcp#uv-%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB" class="hash-link" aria-label="uv のインストール への直接リンク" title="uv のインストール への直接リンク" translate="no">​</a></h3>
<p>translate-mcp は <code>uv</code> で管理されているため、まず <code>uv</code> をインストールする必要がある。</p>
<p><code>uv</code> のインストール方法は <a href="https://docs.astral.sh/uv/getting-started/installation/" target="_blank" rel="noopener noreferrer" class="">Installation | uv</a> を参照すること。</p>
<div class="language-bash codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-bash codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token comment" style="color:#999988;font-style:italic"># macOS / Linux</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-LsSf</span><span class="token plain"> https://astral.sh/uv/install.sh </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">sh</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Windows (PowerShell)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">powershell </span><span class="token parameter variable" style="color:#36acaa">-ExecutionPolicy</span><span class="token plain"> ByPass </span><span class="token parameter variable" style="color:#36acaa">-c</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"irm https://astral.sh/uv/install.ps1 | iex"</span></span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="translate-mcp-のインストール">translate-mcp のインストール<a href="https://www.hikari-dev.com/blog/2026/04/02/translate-mcp#translate-mcp-%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB" class="hash-link" aria-label="translate-mcp のインストール への直接リンク" title="translate-mcp のインストール への直接リンク" translate="no">​</a></h3>
<p><code>uv</code> を使う場合は以下のコマンドでインストールできる。</p>
<div class="language-bash codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-bash codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">uv tool </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> git+https://github.com/Himeyama/translate-mcp</span></span><br></div></code></pre></div></div>
<p><code>uvx</code> を使えばインストール不要で直接実行も可能である。</p>
<div class="language-bash codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-bash codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">uvx git+https://github.com/Himeyama/translate-mcp </span><span class="token parameter variable" style="color:#36acaa">--help</span></span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="使用方法">使用方法<a href="https://www.hikari-dev.com/blog/2026/04/02/translate-mcp#%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95" class="hash-link" aria-label="使用方法 への直接リンク" title="使用方法 への直接リンク" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="cli-モード">CLI モード<a href="https://www.hikari-dev.com/blog/2026/04/02/translate-mcp#cli-%E3%83%A2%E3%83%BC%E3%83%89" class="hash-link" aria-label="CLI モード への直接リンク" title="CLI モード への直接リンク" translate="no">​</a></h3>
<p>ファイルを翻訳する場合は以下のように実行する。</p>
<div class="language-bash codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-bash codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">translate </span><span class="token parameter variable" style="color:#36acaa">--input</span><span class="token plain"> blog/2026-04-02-example.md </span><span class="token parameter variable" style="color:#36acaa">--from</span><span class="token plain"> Japanese </span><span class="token parameter variable" style="color:#36acaa">--to</span><span class="token plain"> English</span></span><br></div></code></pre></div></div>
<p>結果は標準出力に出力される。リダイレクトでファイルに保存できる。</p>
<div class="language-bash codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-bash codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">translate </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">--input</span><span class="token plain"> blog/2026-04-02-example.md </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">--from</span><span class="token plain"> Japanese </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">--to</span><span class="token plain"> English </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">--output</span><span class="token plain"> i18n/en/blog/2026-04-02-example.md</span></span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_DVDF" id="パラメータ">パラメータ<a href="https://www.hikari-dev.com/blog/2026/04/02/translate-mcp#%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF" class="hash-link" aria-label="パラメータ への直接リンク" title="パラメータ への直接リンク" translate="no">​</a></h4>
<ul>
<li class=""><code>--mcp</code>: MCP モード</li>
<li class=""><code>--input</code>: 翻訳するファイルのパス</li>
<li class=""><code>--from</code>: 元の言語（例: Japanese、English）</li>
<li class=""><code>--to</code>: 翻訳先の言語（例: English、Taiwanese）</li>
<li class=""><code>--output</code> (オプション): 翻訳済みテキストの保存先</li>
<li class=""><code>--model</code> (オプション): OpenAI モデル（例: gpt-5-mini）</li>
<li class=""><code>--debug</code> (オプション): デバッグモード</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_DVDF" id="エラー時">エラー時<a href="https://www.hikari-dev.com/blog/2026/04/02/translate-mcp#%E3%82%A8%E3%83%A9%E3%83%BC%E6%99%82" class="hash-link" aria-label="エラー時 への直接リンク" title="エラー時 への直接リンク" translate="no">​</a></h4>
<p>エラーが発生した場合は stderr に出力される。</p>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="mcp-サーバーモード">MCP サーバーモード<a href="https://www.hikari-dev.com/blog/2026/04/02/translate-mcp#mcp-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%83%A2%E3%83%BC%E3%83%89" class="hash-link" aria-label="MCP サーバーモード への直接リンク" title="MCP サーバーモード への直接リンク" translate="no">​</a></h3>
<p>MCP サーバーとして起動し、Claude Code や他の AI ツールから利用できる。</p>
<div class="language-bash codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-bash codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">translate </span><span class="token parameter variable" style="color:#36acaa">--mcp</span></span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="実践例">実践例<a href="https://www.hikari-dev.com/blog/2026/04/02/translate-mcp#%E5%AE%9F%E8%B7%B5%E4%BE%8B" class="hash-link" aria-label="実践例 への直接リンク" title="実践例 への直接リンク" translate="no">​</a></h2>
<p>ブログ記事を日本語から英語と繁体字中国語（台湾）に翻訳する場合について説明する。</p>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="日本語版元記事">日本語版（元記事）<a href="https://www.hikari-dev.com/blog/2026/04/02/translate-mcp#%E6%97%A5%E6%9C%AC%E8%AA%9E%E7%89%88%E5%85%83%E8%A8%98%E4%BA%8B" class="hash-link" aria-label="日本語版（元記事） への直接リンク" title="日本語版（元記事） への直接リンク" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-bash codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token comment" style="color:#999988;font-style:italic"># blog/2026-04-02-example.md に日本語の記事がある状態</span></span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="英語版を生成">英語版を生成<a href="https://www.hikari-dev.com/blog/2026/04/02/translate-mcp#%E8%8B%B1%E8%AA%9E%E7%89%88%E3%82%92%E7%94%9F%E6%88%90" class="hash-link" aria-label="英語版を生成 への直接リンク" title="英語版を生成 への直接リンク" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-bash codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">translate </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">--input</span><span class="token plain"> blog/2026-04-02-example.md </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">--from</span><span class="token plain"> Japanese </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">--to</span><span class="token plain"> English </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> i18n/en/docusaurus-plugin-content-blog/2026-04-02-example.md</span></span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="台湾版繁体字中国語を生成">台湾版（繁体字中国語）を生成<a href="https://www.hikari-dev.com/blog/2026/04/02/translate-mcp#%E5%8F%B0%E6%B9%BE%E7%89%88%E7%B9%81%E4%BD%93%E5%AD%97%E4%B8%AD%E5%9B%BD%E8%AA%9E%E3%82%92%E7%94%9F%E6%88%90" class="hash-link" aria-label="台湾版（繁体字中国語）を生成 への直接リンク" title="台湾版（繁体字中国語）を生成 への直接リンク" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-bash codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">translate </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">--input</span><span class="token plain"> blog/2026-04-02-example.md </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">--from</span><span class="token plain"> Japanese </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">--to</span><span class="token plain"> Taiwanese </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> i18n/zh-TW/docusaurus-plugin-content-blog/2026-04-02-example.md</span></span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="メリットデメリット">メリット・デメリット<a href="https://www.hikari-dev.com/blog/2026/04/02/translate-mcp#%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88%E3%83%87%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88" class="hash-link" aria-label="メリット・デメリット への直接リンク" title="メリット・デメリット への直接リンク" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="メリット">メリット<a href="https://www.hikari-dev.com/blog/2026/04/02/translate-mcp#%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88" class="hash-link" aria-label="メリット への直接リンク" title="メリット への直接リンク" translate="no">​</a></h3>
<ul>
<li class=""><strong>精度が高い</strong>: OpenAI の高品質モデル（GPT-4 など）を使用する</li>
<li class=""><strong>スキル対応</strong>: ChatGPT や Claude の様々なツールに統合可能である</li>
<li class=""><strong>シンプル</strong>: セットアップと使い方が非常に簡単である</li>
<li class=""><strong>カスタマイズ可能</strong>: ソースコードが公開されているため、カスタマイズも可能である</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="デメリット">デメリット<a href="https://www.hikari-dev.com/blog/2026/04/02/translate-mcp#%E3%83%87%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88" class="hash-link" aria-label="デメリット への直接リンク" title="デメリット への直接リンク" translate="no">​</a></h3>
<ul>
<li class=""><strong>API 費用がかかる</strong>: 翻訳量に応じて OpenAI API の費用が発生する</li>
<li class=""><strong>インターネット接続が必須</strong>: API 呼び出しが必要なため、オフライン利用は不可である</li>
<li class=""><strong>レート制限</strong>: OpenAI API のレート制限の影響を受ける</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="まとめ">まとめ<a href="https://www.hikari-dev.com/blog/2026/04/02/translate-mcp#%E3%81%BE%E3%81%A8%E3%82%81" class="hash-link" aria-label="まとめ への直接リンク" title="まとめ への直接リンク" translate="no">​</a></h2>
<p>translate-mcp は、OpenAI API を活用した <strong>シンプルで高品質な翻訳ツール</strong> である。ブログ記事の多言語対応、ドキュメント翻訳、AI ツールへの統合など、様々なシーンで活躍する。</p>
<p>特に Docusaurus などの静的サイト ジェネレーターで複数言語をサポートしたい場合、自動化スクリプトとしての利用が効果的である。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="参考">参考<a href="https://www.hikari-dev.com/blog/2026/04/02/translate-mcp#%E5%8F%82%E8%80%83" class="hash-link" aria-label="参考 への直接リンク" title="参考 への直接リンク" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://github.com/Himeyama/translate-mcp" target="_blank" rel="noopener noreferrer" class="">GitHub - Himeyama/translate-mcp</a></li>
<li class=""><a href="https://platform.openai.com/docs" target="_blank" rel="noopener noreferrer" class="">OpenAI API Documentation</a></li>
</ul>]]></content:encoded>
            <category>MCP</category>
            <category>翻訳</category>
            <category>OpenAI</category>
            <category>Python</category>
        </item>
        <item>
            <title><![CDATA[Anthropic API と AWS Bedrock の料金比較してみた]]></title>
            <link>https://www.hikari-dev.com/blog/2026/03/30/anthropic-api-vs-bedrock-price</link>
            <guid>https://www.hikari-dev.com/blog/2026/03/30/anthropic-api-vs-bedrock-price</guid>
            <pubDate>Mon, 30 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Claude を API 経由で使う場合、Anthropic API 直接のほかに AWS Bedrock、Google Vertex AI、Microsoft Azure (Azure AI Foundry) 経由でも利用できる。基本料金はどの経路もほぼ同額だが、バッチ処理やクラウドエコシステムとの統合面で差がある。]]></description>
            <content:encoded><![CDATA[<p>Claude を API 経由で使う場合、Anthropic API 直接のほかに <strong>AWS Bedrock</strong>、<strong>Google Vertex AI</strong>、<strong>Microsoft Azure (Azure AI Foundry)</strong> 経由でも利用できる。基本料金はどの経路もほぼ同額だが、バッチ処理やクラウドエコシステムとの統合面で差がある。</p>
<!-- -->
<blockquote>
<p>単位: USD / 1M トークン (MTok) 。2026 年 3 月時点の情報。</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="基本料金-オンデマンド">基本料金 (オンデマンド)<a href="https://www.hikari-dev.com/blog/2026/03/30/anthropic-api-vs-bedrock-price#%E5%9F%BA%E6%9C%AC%E6%96%99%E9%87%91-%E3%82%AA%E3%83%B3%E3%83%87%E3%83%9E%E3%83%B3%E3%83%89" class="hash-link" aria-label="基本料金 (オンデマンド) への直接リンク" title="基本料金 (オンデマンド) への直接リンク" translate="no">​</a></h2>
<table><thead><tr><th>モデル</th><th>項目</th><th style="text-align:center">Anthropic API</th><th style="text-align:center">Bedrock</th><th style="text-align:center">Vertex AI</th><th style="text-align:center">Azure</th></tr></thead><tbody><tr><td><strong>Claude Opus 4.6</strong></td><td>入力</td><td style="text-align:center">$5.00</td><td style="text-align:center">$5.00</td><td style="text-align:center">$5.00</td><td style="text-align:center">$5.00</td></tr><tr><td></td><td>出力</td><td style="text-align:center">$25.00</td><td style="text-align:center">$25.00</td><td style="text-align:center">$25.00</td><td style="text-align:center">$25.00</td></tr><tr><td><strong>Claude Sonnet 4.6</strong></td><td>入力</td><td style="text-align:center">$3.00</td><td style="text-align:center">$3.00</td><td style="text-align:center">$3.00</td><td style="text-align:center">$3.00</td></tr><tr><td></td><td>出力</td><td style="text-align:center">$15.00</td><td style="text-align:center">$15.00</td><td style="text-align:center">$15.00</td><td style="text-align:center">$15.00</td></tr><tr><td><strong>Claude Haiku 4.5</strong></td><td>入力</td><td style="text-align:center">$1.00</td><td style="text-align:center">$1.00</td><td style="text-align:center">$1.00</td><td style="text-align:center">$1.00</td></tr><tr><td></td><td>出力</td><td style="text-align:center">$5.00</td><td style="text-align:center">$5.00</td><td style="text-align:center">$5.00</td><td style="text-align:center">$5.00</td></tr><tr><td><strong>Claude Sonnet 4.5</strong></td><td>入力</td><td style="text-align:center">$3.00</td><td style="text-align:center">$3.00</td><td style="text-align:center">$3.00</td><td style="text-align:center">$3.00</td></tr><tr><td></td><td>出力</td><td style="text-align:center">$15.00</td><td style="text-align:center">$15.00</td><td style="text-align:center">$15.00</td><td style="text-align:center">$15.00</td></tr></tbody></table>
<p><strong>基本料金はどの経路でも同額。</strong></p>
<p>ただし Vertex AI ではグローバルエンドポイントではなくリージョナルエンドポイントを指定した場合、標準価格に <strong>10% 上乗せ</strong> される。Bedrock には Long Context バリアント (別 SKU) が存在するが同価格。Anthropic API では Long Context は通常モデルに統合済み。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="キャッシュ料金">キャッシュ料金<a href="https://www.hikari-dev.com/blog/2026/03/30/anthropic-api-vs-bedrock-price#%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5%E6%96%99%E9%87%91" class="hash-link" aria-label="キャッシュ料金 への直接リンク" title="キャッシュ料金 への直接リンク" translate="no">​</a></h2>
<p>プロンプトキャッシュ (Prompt Caching) の料金もどの経路でも同額。</p>
<table><thead><tr><th style="text-align:center">モデル</th><th style="text-align:center">キャッシュ種別</th><th style="text-align:center">Anthropic API</th><th style="text-align:center">Bedrock</th><th style="text-align:center">Vertex AI</th><th style="text-align:center">Azure</th></tr></thead><tbody><tr><td style="text-align:center"><strong>Claude Opus 4.6</strong></td><td style="text-align:center">5分キャッシュライト</td><td style="text-align:center">$6.25</td><td style="text-align:center">$6.25</td><td style="text-align:center">$6.25</td><td style="text-align:center">$6.25</td></tr><tr><td style="text-align:center"></td><td style="text-align:center">1時間キャッシュライト</td><td style="text-align:center">$10.00</td><td style="text-align:center">$10.00</td><td style="text-align:center">$10.00</td><td style="text-align:center">$10.00</td></tr><tr><td style="text-align:center"></td><td style="text-align:center">キャッシュリード</td><td style="text-align:center">$0.50</td><td style="text-align:center">$0.50</td><td style="text-align:center">$0.50</td><td style="text-align:center">$0.50</td></tr><tr><td style="text-align:center"><strong>Claude Sonnet 4.6</strong></td><td style="text-align:center">5分キャッシュライト</td><td style="text-align:center">$3.75</td><td style="text-align:center">$3.75</td><td style="text-align:center">$3.75</td><td style="text-align:center">$3.75</td></tr><tr><td style="text-align:center"></td><td style="text-align:center">1時間キャッシュライト</td><td style="text-align:center">$6.00</td><td style="text-align:center">$6.00</td><td style="text-align:center">$6.00</td><td style="text-align:center">$6.00</td></tr><tr><td style="text-align:center"></td><td style="text-align:center">キャッシュリード</td><td style="text-align:center">$0.30</td><td style="text-align:center">$0.30</td><td style="text-align:center">$0.30</td><td style="text-align:center">$0.30</td></tr><tr><td style="text-align:center"><strong>Claude Haiku 4.5</strong></td><td style="text-align:center">5分キャッシュライト</td><td style="text-align:center">$1.25</td><td style="text-align:center">$1.25</td><td style="text-align:center">$1.25</td><td style="text-align:center">$1.25</td></tr><tr><td style="text-align:center"></td><td style="text-align:center">1時間キャッシュライト</td><td style="text-align:center">$2.00</td><td style="text-align:center">$2.00</td><td style="text-align:center">$2.00</td><td style="text-align:center">$2.00</td></tr><tr><td style="text-align:center"></td><td style="text-align:center">キャッシュリード</td><td style="text-align:center">$0.10</td><td style="text-align:center">$0.10</td><td style="text-align:center">$0.10</td><td style="text-align:center">$0.10</td></tr></tbody></table>
<p>キャッシュライトは TTL に応じて 5 分 (短期) と 1 時間 (長期) の 2 段階がある。長期キャッシュほど書き込みコストが高いが、繰り返し参照するシステムプロンプトが長い場合はリード料金の節約で十分ペイする。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="バッチ処理料金">バッチ処理料金<a href="https://www.hikari-dev.com/blog/2026/03/30/anthropic-api-vs-bedrock-price#%E3%83%90%E3%83%83%E3%83%81%E5%87%A6%E7%90%86%E6%96%99%E9%87%91" class="hash-link" aria-label="バッチ処理料金 への直接リンク" title="バッチ処理料金 への直接リンク" translate="no">​</a></h2>
<p>Bedrock・Vertex AI・Anthropic API いずれも非同期バッチ API がオンデマンド料金の <strong>50% OFF</strong> で利用できる。Azure は現時点では非明示。</p>
<table><thead><tr><th>モデル</th><th style="text-align:center">バッチ入力</th><th style="text-align:center">バッチ出力</th></tr></thead><tbody><tr><td><strong>Claude Opus 4.6</strong></td><td style="text-align:center">$2.50</td><td style="text-align:center">$12.50</td></tr><tr><td><strong>Claude Sonnet 4.6</strong></td><td style="text-align:center">$1.50</td><td style="text-align:center">$7.50</td></tr><tr><td><strong>Claude Haiku 4.5</strong></td><td style="text-align:center">$0.50</td><td style="text-align:center">$2.50</td></tr><tr><td><strong>Claude Sonnet 4.5</strong></td><td style="text-align:center">$1.50</td><td style="text-align:center">$7.50</td></tr></tbody></table>
<p>大量データの一括処理 (ログ解析、埋め込み生成など) でバッチを多用するなら、いずれの経路でもコストを半減できる。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="エコシステム比較">エコシステム比較<a href="https://www.hikari-dev.com/blog/2026/03/30/anthropic-api-vs-bedrock-price#%E3%82%A8%E3%82%B3%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E6%AF%94%E8%BC%83" class="hash-link" aria-label="エコシステム比較 への直接リンク" title="エコシステム比較 への直接リンク" translate="no">​</a></h2>
<table><thead><tr><th>比較ポイント</th><th style="text-align:center">Anthropic API</th><th style="text-align:center">Bedrock</th><th style="text-align:center">Vertex AI</th><th style="text-align:center">Azure</th></tr></thead><tbody><tr><td>基本料金</td><td style="text-align:center">同額</td><td style="text-align:center">同額</td><td style="text-align:center">同額</td><td style="text-align:center">同額</td></tr><tr><td>リージョン課金</td><td style="text-align:center">—</td><td style="text-align:center">—</td><td style="text-align:center">+10% (リージョナル)</td><td style="text-align:center">—</td></tr><tr><td>バッチ処理 (50% OFF)</td><td style="text-align:center">○</td><td style="text-align:center">○</td><td style="text-align:center">○</td><td style="text-align:center">非明示</td></tr><tr><td>東京リージョン</td><td style="text-align:center">—</td><td style="text-align:center">○</td><td style="text-align:center">○</td><td style="text-align:center">—</td></tr><tr><td>IAM / 監査ログ統合</td><td style="text-align:center">—</td><td style="text-align:center">AWS</td><td style="text-align:center">Google Cloud</td><td style="text-align:center">Azure</td></tr><tr><td>VPC / PrivateLink</td><td style="text-align:center">—</td><td style="text-align:center">○</td><td style="text-align:center">○</td><td style="text-align:center">○</td></tr><tr><td>請求統合</td><td style="text-align:center">Anthropic 直接</td><td style="text-align:center">AWS</td><td style="text-align:center">Google Cloud</td><td style="text-align:center">Azure</td></tr><tr><td>新機能の展開速度</td><td style="text-align:center">最速</td><td style="text-align:center">遅延あり</td><td style="text-align:center">遅延あり</td><td style="text-align:center">遅延あり</td></tr></tbody></table>
<p>新機能 (Extended Thinking など) は Anthropic API に最初に展開され、Vertex AI・Bedrock・Azure への展開は数週間遅れることがある。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="どれを選ぶか">どれを選ぶか<a href="https://www.hikari-dev.com/blog/2026/03/30/anthropic-api-vs-bedrock-price#%E3%81%A9%E3%82%8C%E3%82%92%E9%81%B8%E3%81%B6%E3%81%8B" class="hash-link" aria-label="どれを選ぶか への直接リンク" title="どれを選ぶか への直接リンク" translate="no">​</a></h2>
<ul>
<li class=""><strong>シンプルな利用・プロトタイプ</strong>: Anthropic API が API キー 1 本で始められ、新機能も最速で使える。</li>
<li class=""><strong>AWS に統合済み</strong>: IAM・CloudWatch・VPC が必要なら Bedrock 一択。東京リージョン対応。</li>
<li class=""><strong>Google Cloud に統合済み</strong>: Vertex AI が自然な選択。リージョナルエンドポイントは 10% 割高になる点に注意。</li>
<li class=""><strong>Azure に統合済み</strong>: Azure AI Foundry 経由で利用可能。Azure の課金・管理に統合できる。</li>
<li class=""><strong>バッチ多用でコスト削減</strong>: Bedrock・Vertex AI・Anthropic API いずれも 50% OFF のバッチ API が使える。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="参考">参考<a href="https://www.hikari-dev.com/blog/2026/03/30/anthropic-api-vs-bedrock-price#%E5%8F%82%E8%80%83" class="hash-link" aria-label="参考 への直接リンク" title="参考 への直接リンク" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://www.anthropic.com/pricing#anthropic-api" target="_blank" rel="noopener noreferrer" class="">Anthropic API 料金 – Claude API Docs</a></li>
<li class=""><a href="https://aws.amazon.com/jp/bedrock/pricing/" target="_blank" rel="noopener noreferrer" class="">AWS Bedrock 料金 – Amazon Web Services</a></li>
<li class=""><a href="https://cloud.google.com/vertex-ai/generative-ai/pricing" target="_blank" rel="noopener noreferrer" class="">Vertex AI 料金 – Google Cloud</a></li>
<li class=""><a href="https://platform.claude.com/docs/en/build-with-claude/claude-in-microsoft-foundry" target="_blank" rel="noopener noreferrer" class="">Claude in Microsoft Azure AI Foundry – Claude API Docs</a></li>
</ul>]]></content:encoded>
            <category>AI</category>
            <category>AWS</category>
            <category>Claude</category>
        </item>
        <item>
            <title><![CDATA[明朝体の文章でも太字はゴシック体になる理由]]></title>
            <link>https://www.hikari-dev.com/blog/2026/03/29/japanese-bold-serif-gothic</link>
            <guid>https://www.hikari-dev.com/blog/2026/03/29/japanese-bold-serif-gothic</guid>
            <pubDate>Sun, 29 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[明朝体やセリフ体で書かれた文章でも、太字はゴシック体で表示されることが多い。これはデザイン上の意図的な選択であり、可読性・視認性・歴史的慣習の 3 つの理由がある。]]></description>
            <content:encoded><![CDATA[<p>明朝体やセリフ体で書かれた文章でも、<strong>太字はゴシック体</strong>で表示されることが多い。これはデザイン上の意図的な選択であり、可読性・視認性・歴史的慣習の 3 つの理由がある。</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="可読性の維持">可読性の維持<a href="https://www.hikari-dev.com/blog/2026/03/29/japanese-bold-serif-gothic#%E5%8F%AF%E8%AA%AD%E6%80%A7%E3%81%AE%E7%B6%AD%E6%8C%81" class="hash-link" aria-label="可読性の維持 への直接リンク" title="可読性の維持 への直接リンク" translate="no">​</a></h2>
<p>明朝体を単純に太くすると、セリフ（ウロコ）と主ストロークの対比が大きくなりすぎ、文字の内側にある<strong>カウンター</strong>（空白部分）が失われやすくなる。特に Web やモニタでの小サイズ表示では顕著で、文字が潰れて判読しにくくなる。</p>
<p>ゴシック体はもともとセリフがないため、ウェイトを上げてもカウンターが保たれ、読みやすさが低下しない。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="強調意図の明確性">強調意図の明確性<a href="https://www.hikari-dev.com/blog/2026/03/29/japanese-bold-serif-gothic#%E5%BC%B7%E8%AA%BF%E6%84%8F%E5%9B%B3%E3%81%AE%E6%98%8E%E7%A2%BA%E6%80%A7" class="hash-link" aria-label="強調意図の明確性 への直接リンク" title="強調意図の明確性 への直接リンク" translate="no">​</a></h2>
<p>フォントファミリー自体を変えることで、「ここは強調されている」という意図が視覚的に即座に伝わる。明朝体を単に濃くした場合と比べ、ゴシック体への切り替えは人間の視覚系に対してより明確な「異なる情報」として処理される。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="歴史的文化的背景">歴史的・文化的背景<a href="https://www.hikari-dev.com/blog/2026/03/29/japanese-bold-serif-gothic#%E6%AD%B4%E5%8F%B2%E7%9A%84%E6%96%87%E5%8C%96%E7%9A%84%E8%83%8C%E6%99%AF" class="hash-link" aria-label="歴史的・文化的背景 への直接リンク" title="歴史的・文化的背景 への直接リンク" translate="no">​</a></h2>
<p>日本の活字印刷の時代から、<strong>強調には別書体を使う</strong>という慣習があった。明朝体を太くすると活字の鋳造上の問題が生じるため、ゴシック体という全く異なる書体を使って強調を表現していた。その慣習がデジタル組版、そして Web にそのまま引き継がれている。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="css-での実装">CSS での実装<a href="https://www.hikari-dev.com/blog/2026/03/29/japanese-bold-serif-gothic#css-%E3%81%A7%E3%81%AE%E5%AE%9F%E8%A3%85" class="hash-link" aria-label="CSS での実装 への直接リンク" title="CSS での実装 への直接リンク" translate="no">​</a></h2>
<p>Web で明朝体をベース書体に使う場合、以下のようなスタイルで太字をゴシック体に切り替える。</p>
<div class="language-css codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-css codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token selector" style="color:#00009f">body</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token property" style="color:#36acaa">font-family</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Noto Serif JP"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> serif</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token selector" style="color:#00009f">strong</span><span class="token selector punctuation" style="color:#393A34">,</span><span class="token selector" style="color:#00009f"> b</span><span class="token selector punctuation" style="color:#393A34">,</span><span class="token selector" style="color:#00009f"> h1</span><span class="token selector punctuation" style="color:#393A34">,</span><span class="token selector" style="color:#00009f"> h2</span><span class="token selector punctuation" style="color:#393A34">,</span><span class="token selector" style="color:#00009f"> h3</span><span class="token selector punctuation" style="color:#393A34">,</span><span class="token selector" style="color:#00009f"> h4</span><span class="token selector punctuation" style="color:#393A34">,</span><span class="token selector" style="color:#00009f"> h5</span><span class="token selector punctuation" style="color:#393A34">,</span><span class="token selector" style="color:#00009f"> h6</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token property" style="color:#36acaa">font-family</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Noto Sans JP"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> sans-serif</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token property" style="color:#36acaa">font-weight</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">700</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span></span><br></div></code></pre></div></div>
<p>このアプローチには実装上の利点もある。明朝体の複数ウェイトをすべて読み込む必要がなく、本文の Regular とゴシックの Bold だけを配信すれば済むため、ページの読み込みコストを抑えられる。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="まとめ">まとめ<a href="https://www.hikari-dev.com/blog/2026/03/29/japanese-bold-serif-gothic#%E3%81%BE%E3%81%A8%E3%82%81" class="hash-link" aria-label="まとめ への直接リンク" title="まとめ への直接リンク" translate="no">​</a></h2>
<p>日本語の太字がゴシック体になる理由は 3 点に集約される。</p>
<ol>
<li class=""><strong>可読性</strong>: ゴシック体はウェイトを上げてもカウンターが保たれ、読みやすさを維持できる</li>
<li class=""><strong>視認性</strong>: フォントファミリーの変更は、単なる太字よりも強調を明確に伝える</li>
<li class=""><strong>慣習</strong>: 活字印刷時代からの「強調には別書体」という慣習がそのまま引き継がれている</li>
</ol>
<p>Web でも同様の理由からこの組み合わせが使われており、デザイン上も実装上も合理的な選択である。</p>]]></content:encoded>
            <category>デザイン</category>
            <category>CSS</category>
        </item>
        <item>
            <title><![CDATA[Docusaurus ブログで PageSpeed Insights ほぼ満点を達成した方法 — SEO・パフォーマンス・アクセシビリティ]]></title>
            <link>https://www.hikari-dev.com/blog/2026/03/28/lighthouse-seo-performance</link>
            <guid>https://www.hikari-dev.com/blog/2026/03/28/lighthouse-seo-performance</guid>
            <pubDate>Sat, 28 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[このブログのモバイル PageSpeed Insights スコアを Performance 99、Accessibility 100、Best Practices 100、SEO 100 まで改善した。SEO・パフォーマンス・アクセシビリティの各観点から、実施した変更をまとめる。]]></description>
            <content:encoded><![CDATA[<p>このブログのモバイル PageSpeed Insights スコアを <strong>Performance 99、Accessibility 100、Best Practices 100、SEO 100</strong> まで改善した。SEO・パフォーマンス・アクセシビリティの各観点から、実施した変更をまとめる。</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="改善前の課題">改善前の課題<a href="https://www.hikari-dev.com/blog/2026/03/28/lighthouse-seo-performance#%E6%94%B9%E5%96%84%E5%89%8D%E3%81%AE%E8%AA%B2%E9%A1%8C" class="hash-link" aria-label="改善前の課題 への直接リンク" title="改善前の課題 への直接リンク" translate="no">​</a></h2>
<p>素の Docusaurus ブログで PageSpeed Insights を実行すると、いくつかの問題が見つかった。</p>
<ul>
<li class=""><strong>SEO</strong>: meta description なし、OGP/Twitter Cards なし、構造化データなし、サイトマップの priority 未設定</li>
<li class=""><strong>パフォーマンス</strong>: Google Tag Manager (GTM) の同期読み込みによる未使用 JS の肥大化、外部 CDN からのアバター取得がボトルネック</li>
<li class=""><strong>アクセシビリティ</strong>: プライマリカラーのコントラスト比が WCAG AA 基準を未達</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="seo-の改善">SEO の改善<a href="https://www.hikari-dev.com/blog/2026/03/28/lighthouse-seo-performance#seo-%E3%81%AE%E6%94%B9%E5%96%84" class="hash-link" aria-label="SEO の改善 への直接リンク" title="SEO の改善 への直接リンク" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="meta-descriptionogptwitter-cards-の追加">meta description・OGP・Twitter Cards の追加<a href="https://www.hikari-dev.com/blog/2026/03/28/lighthouse-seo-performance#meta-descriptionogptwitter-cards-%E3%81%AE%E8%BF%BD%E5%8A%A0" class="hash-link" aria-label="meta description・OGP・Twitter Cards の追加 への直接リンク" title="meta description・OGP・Twitter Cards の追加 への直接リンク" translate="no">​</a></h3>
<p><code>docusaurus.config.ts</code> の <code>themeConfig.metadata</code> にサイト共通のメタデータを追加した。</p>
<div class="language-ts codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-ts codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">themeConfig</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  metadata</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> name</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'description'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> content</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ひかりの技術メモ..."</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> property</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'og:locale'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> content</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'ja_JP'</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> name</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'twitter:card'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> content</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'summary_large_image'</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> name</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'twitter:site'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> content</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@ptrqr'</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span></span><br></div></code></pre></div></div>
<p>また、<code>src/theme/Layout/index.tsx</code> を Swizzle して、独自の description を持たないページ（ブログ一覧、タグページなど）にロケール別のフォールバック description を設定している。</p>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="robotstxt-の追加">robots.txt の追加<a href="https://www.hikari-dev.com/blog/2026/03/28/lighthouse-seo-performance#robotstxt-%E3%81%AE%E8%BF%BD%E5%8A%A0" class="hash-link" aria-label="robots.txt の追加 への直接リンク" title="robots.txt の追加 への直接リンク" translate="no">​</a></h3>
<p><code>static/robots.txt</code> を追加し、クローラーにサイトマップの場所を明示した。</p>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="blogposting-json-ld構造化データ">BlogPosting JSON-LD（構造化データ）<a href="https://www.hikari-dev.com/blog/2026/03/28/lighthouse-seo-performance#blogposting-json-ld%E6%A7%8B%E9%80%A0%E5%8C%96%E3%83%87%E3%83%BC%E3%82%BF" class="hash-link" aria-label="BlogPosting JSON-LD（構造化データ） への直接リンク" title="BlogPosting JSON-LD（構造化データ） への直接リンク" translate="no">​</a></h3>
<p><code>src/theme/BlogPostItem/index.tsx</code> を Swizzle して、記事ページに <code>headline</code>・<code>datePublished</code>・<code>dateModified</code>・<code>author</code> を含む <code>BlogPosting</code> JSON-LD を出力していた。</p>
<p>しかし、Docusaurus 組み込みの <code>BlogPostPage/StructuredData</code> が同等のデータを出力していることが判明。カスタム JSON-LD を削除し、代わりに組み込みコンポーネントに <code>keywords</code> のフォールバック（<code>frontMatter.keywords</code> → <code>tags</code>）を追加した。構造化データの重複は SEO に悪影響を与えるため、この整理は重要であった。</p>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="website-json-ld">WebSite JSON-LD<a href="https://www.hikari-dev.com/blog/2026/03/28/lighthouse-seo-performance#website-json-ld" class="hash-link" aria-label="WebSite JSON-LD への直接リンク" title="WebSite JSON-LD への直接リンク" translate="no">​</a></h3>
<p><code>docusaurus.config.ts</code> の <code>headTags</code> に <code>WebSite</code> タイプの JSON-LD を追加し、Google がサイト名を正しく認識できるようにした。</p>
<div class="language-ts codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-ts codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">headTags</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    tagName</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'script'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    attributes</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> type</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'application/ld+json'</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    innerHTML</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">JSON</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">stringify</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'@context'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'https://schema.org'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'@type'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'WebSite'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">      name</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'ひかりの備忘録'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">      url</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'https://www.hikari-dev.com/'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span></span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="全記事への-ogp-画像自動生成">全記事への OGP 画像自動生成<a href="https://www.hikari-dev.com/blog/2026/03/28/lighthouse-seo-performance#%E5%85%A8%E8%A8%98%E4%BA%8B%E3%81%B8%E3%81%AE-ogp-%E7%94%BB%E5%83%8F%E8%87%AA%E5%8B%95%E7%94%9F%E6%88%90" class="hash-link" aria-label="全記事への OGP 画像自動生成 への直接リンク" title="全記事への OGP 画像自動生成 への直接リンク" translate="no">​</a></h3>
<p><code>scripts/generate-ogp.js</code> を作成し、タグに応じたグラデーション背景の OGP 画像を自動生成するようにした。これにより、SNS でシェアされた際にすべての記事が目を引く画像付きで表示される。全記事のフロントマターに <code>image:</code> フィールドを設定し、記事固有の画像がある場合はそちらを優先する。</p>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="サイトマップの改善">サイトマップの改善<a href="https://www.hikari-dev.com/blog/2026/03/28/lighthouse-seo-performance#%E3%82%B5%E3%82%A4%E3%83%88%E3%83%9E%E3%83%83%E3%83%97%E3%81%AE%E6%94%B9%E5%96%84" class="hash-link" aria-label="サイトマップの改善 への直接リンク" title="サイトマップの改善 への直接リンク" translate="no">​</a></h3>
<p><code>createSitemapItems</code> コールバックを使って、トップページの priority を <code>1.0</code>、ブログ記事を <code>0.8</code> に設定した。また、URL に含まれる日付から <code>lastmod</code> を自動抽出している。</p>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="hreflang-x-default">hreflang x-default<a href="https://www.hikari-dev.com/blog/2026/03/28/lighthouse-seo-performance#hreflang-x-default" class="hash-link" aria-label="hreflang x-default への直接リンク" title="hreflang x-default への直接リンク" translate="no">​</a></h3>
<p><code>src/theme/Root.tsx</code> で、すべてのページに <code>hreflang="x-default"</code> の <code>&lt;link&gt;</code> タグを注入し、英語ページ（<code>/en/...</code>）をデフォルト（日本語）の URL にマッピングしている。これにより、検索エンジンが言語バリアントを正しく識別できる。</p>
<div class="language-tsx codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-tsx codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> defaultPath </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> pathname</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">replace</span><span class="token punctuation" style="color:#393A34">(</span><span class="token regex regex-delimiter" style="color:#36acaa">/</span><span class="token regex regex-source language-regex anchor function" style="color:#d73a49">^</span><span class="token regex regex-source language-regex escape" style="color:#36acaa">\/</span><span class="token regex regex-source language-regex" style="color:#36acaa">en</span><span class="token regex regex-source language-regex group punctuation" style="color:#393A34">(?=</span><span class="token regex regex-source language-regex escape" style="color:#36acaa">\/</span><span class="token regex regex-source language-regex alternation keyword" style="color:#00009f">|</span><span class="token regex regex-source language-regex anchor function" style="color:#d73a49">$</span><span class="token regex regex-source language-regex group punctuation" style="color:#393A34">)</span><span class="token regex regex-delimiter" style="color:#36acaa">/</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">''</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">||</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'/'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> xDefaultUrl </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">siteConfig</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation">url</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">defaultPath</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag class-name" style="color:#00009f">Head</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain-text">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">link</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">rel</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">alternate</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">hreflang</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">x-default</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">href</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#393A34">=</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript" style="color:#00009f">xDefaultUrl</span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag" style="color:#00009f"> </span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token plain-text"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain-text"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag class-name" style="color:#00009f">Head</span><span class="token tag punctuation" style="color:#393A34">&gt;</span></span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="パフォーマンスの改善">パフォーマンスの改善<a href="https://www.hikari-dev.com/blog/2026/03/28/lighthouse-seo-performance#%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9%E3%81%AE%E6%94%B9%E5%96%84" class="hash-link" aria-label="パフォーマンスの改善 への直接リンク" title="パフォーマンスの改善 への直接リンク" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="gtm-の遅延読み込み">GTM の遅延読み込み<a href="https://www.hikari-dev.com/blog/2026/03/28/lighthouse-seo-performance#gtm-%E3%81%AE%E9%81%85%E5%BB%B6%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF" class="hash-link" aria-label="GTM の遅延読み込み への直接リンク" title="GTM の遅延読み込み への直接リンク" translate="no">​</a></h3>
<p><code>@docusaurus/plugin-google-gtag</code> を廃止し、<code>src/clientModules/gtag.js</code> で <code>window.load</code> イベント後に GTM スクリプトを動的注入するようにした。これにより、初期レンダリングをブロックする未使用 JS を大幅に削減できた。</p>
<div class="language-js codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-js codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">loadGtag</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> script </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token dom variable" style="color:#36acaa">document</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">createElement</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'script'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  script</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">async</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  script</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">src</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">https://www.googletagmanager.com/gtag/js?id=</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation constant" style="color:#36acaa">GA_ID</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token dom variable" style="color:#36acaa">document</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">head</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">appendChild</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">script</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token dom variable" style="color:#36acaa">window</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">addEventListener</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'load'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> loadGtag</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">once</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span></span><br></div></code></pre></div></div>
<p>SPA のページ遷移では Docusaurus の <code>onRouteDidUpdate</code> フックを使い、手動で <code>window.gtag</code> を呼び出している。さらに <code>requestIdleCallback</code> を利用してアイドル時に読み込むよう改善した。</p>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="アバターのセルフホスト化と-webp-変換">アバターのセルフホスト化と WebP 変換<a href="https://www.hikari-dev.com/blog/2026/03/28/lighthouse-seo-performance#%E3%82%A2%E3%83%90%E3%82%BF%E3%83%BC%E3%81%AE%E3%82%BB%E3%83%AB%E3%83%95%E3%83%9B%E3%82%B9%E3%83%88%E5%8C%96%E3%81%A8-webp-%E5%A4%89%E6%8F%9B" class="hash-link" aria-label="アバターのセルフホスト化と WebP 変換 への直接リンク" title="アバターのセルフホスト化と WebP 変換 への直接リンク" translate="no">​</a></h3>
<p>アバター画像を GitHub CDN（<code>avatars.githubusercontent.com</code>）からセルフホストに移行した。GitHub CDN はキャッシュ TTL が 5 分と短く、PageSpeed Insights で毎回外部リクエストとして指摘されていた。</p>
<p>アバターを WebP 形式に変換し、ファイルサイズを 34 KB（PNG）から 3.5 KB へ、約 90% 削減した。</p>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="画像サイズの最適化と-cls-の修正">画像サイズの最適化と CLS の修正<a href="https://www.hikari-dev.com/blog/2026/03/28/lighthouse-seo-performance#%E7%94%BB%E5%83%8F%E3%82%B5%E3%82%A4%E3%82%BA%E3%81%AE%E6%9C%80%E9%81%A9%E5%8C%96%E3%81%A8-cls-%E3%81%AE%E4%BF%AE%E6%AD%A3" class="hash-link" aria-label="画像サイズの最適化と CLS の修正 への直接リンク" title="画像サイズの最適化と CLS の修正 への直接リンク" translate="no">​</a></h3>
<ul>
<li class="">GitHub アバター URL に <code>?size=64</code> を追加し、460 px → 64 px に縮小（33 KB 削減）</li>
<li class="">ナビバーのロゴに <code>width</code>/<code>height</code> 属性を追加して CLS（Cumulative Layout Shift）を修正</li>
<li class=""><code>&lt;img&gt;</code> タグに <code>loading="lazy"</code> を追加</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="rspack--swc-の導入">rspack / SWC の導入<a href="https://www.hikari-dev.com/blog/2026/03/28/lighthouse-seo-performance#rspack--swc-%E3%81%AE%E5%B0%8E%E5%85%A5" class="hash-link" aria-label="rspack / SWC の導入 への直接リンク" title="rspack / SWC の導入 への直接リンク" translate="no">​</a></h3>
<p><code>@docusaurus/faster</code> を導入し、webpack を rspack + SWC + lightningCSS に置き換えた。</p>
<div class="language-ts codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-ts codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">future</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  v4</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  experimental_faster</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span></span><br></div></code></pre></div></div>
<p>ビルド速度とバンドルサイズの両方が改善された。</p>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="未使用プラグインの無効化">未使用プラグインの無効化<a href="https://www.hikari-dev.com/blog/2026/03/28/lighthouse-seo-performance#%E6%9C%AA%E4%BD%BF%E7%94%A8%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%AE%E7%84%A1%E5%8A%B9%E5%8C%96" class="hash-link" aria-label="未使用プラグインの無効化 への直接リンク" title="未使用プラグインの無効化 への直接リンク" translate="no">​</a></h3>
<p>使用していない docs プラグインを無効化し、不要な JS がクライアントに配信されないようにした。</p>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="モバイル限定の-google-fonts-読み込み">モバイル限定の Google Fonts 読み込み<a href="https://www.hikari-dev.com/blog/2026/03/28/lighthouse-seo-performance#%E3%83%A2%E3%83%90%E3%82%A4%E3%83%AB%E9%99%90%E5%AE%9A%E3%81%AE-google-fonts-%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF" class="hash-link" aria-label="モバイル限定の Google Fonts 読み込み への直接リンク" title="モバイル限定の Google Fonts 読み込み への直接リンク" translate="no">​</a></h3>
<p>Google Fonts（Noto Sans JP）はモバイルでのみ必要であった。<code>matchMedia</code> を使い、モバイル端末でのみフォントのスタイルシートを動的注入するようにしたことで、デスクトップで約 130 KB の未使用 CSS を削減した。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="アクセシビリティの改善">アクセシビリティの改善<a href="https://www.hikari-dev.com/blog/2026/03/28/lighthouse-seo-performance#%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B7%E3%83%93%E3%83%AA%E3%83%86%E3%82%A3%E3%81%AE%E6%94%B9%E5%96%84" class="hash-link" aria-label="アクセシビリティの改善 への直接リンク" title="アクセシビリティの改善 への直接リンク" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="コントラスト比の修正">コントラスト比の修正<a href="https://www.hikari-dev.com/blog/2026/03/28/lighthouse-seo-performance#%E3%82%B3%E3%83%B3%E3%83%88%E3%83%A9%E3%82%B9%E3%83%88%E6%AF%94%E3%81%AE%E4%BF%AE%E6%AD%A3" class="hash-link" aria-label="コントラスト比の修正 への直接リンク" title="コントラスト比の修正 への直接リンク" translate="no">​</a></h3>
<p>プライマリカラーを <code>#F15EB4</code> から <code>#C82273</code> に変更し、白背景に対して<strong>コントラスト比 5.3:1</strong> を達成した（WCAG AA 準拠）。ダークモードでは <code>#F36AB2</code>（暗背景に対して 7.0:1）を使用している。</p>
<p>記事の日付テキストの色は CSS 変数 <code>--post-date-color</code> で管理し、ライトモードは <code>#595959</code>（7.0:1）、ダークモードは <code>#9e9e9e</code> とした。</p>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="フォントの統一">フォントの統一<a href="https://www.hikari-dev.com/blog/2026/03/28/lighthouse-seo-performance#%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88%E3%81%AE%E7%B5%B1%E4%B8%80" class="hash-link" aria-label="フォントの統一 への直接リンク" title="フォントの統一 への直接リンク" translate="no">​</a></h3>
<p>見出しと <code>&lt;strong&gt;</code> のフォントを Noto Serif JP から Noto Sans JP に変更し、本文との統一感を持たせた。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="結果">結果<a href="https://www.hikari-dev.com/blog/2026/03/28/lighthouse-seo-performance#%E7%B5%90%E6%9E%9C" class="hash-link" aria-label="結果 への直接リンク" title="結果 への直接リンク" translate="no">​</a></h2>
<table><thead><tr><th>カテゴリ</th><th>スコア</th></tr></thead><tbody><tr><td>Performance</td><td><strong>99</strong></td></tr><tr><td>Accessibility</td><td><strong>100</strong></td></tr><tr><td>Best Practices</td><td><strong>100</strong></td></tr><tr><td>SEO</td><td><strong>100</strong></td></tr></tbody></table>
<p>モバイルでほぼ満点を達成した。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="まとめ">まとめ<a href="https://www.hikari-dev.com/blog/2026/03/28/lighthouse-seo-performance#%E3%81%BE%E3%81%A8%E3%82%81" class="hash-link" aria-label="まとめ への直接リンク" title="まとめ への直接リンク" translate="no">​</a></h2>
<p>最もインパクトが大きかった変更は以下の 3 つである。</p>
<ol>
<li class=""><strong>GTM の遅延読み込み</strong>: 未使用 JS を大幅に削減し、パフォーマンススコアが大きく向上した</li>
<li class=""><strong>OGP・構造化データの整備</strong>: SEO 100 を達成し、SNS シェア時の見栄えも改善された</li>
<li class=""><strong>コントラスト比の修正</strong>: WCAG AA 準拠によりアクセシビリティが 100 になった</li>
</ol>
<p>Docusaurus はデフォルトでも高品質なサイトを生成するが、PageSpeed Insights でほぼ満点を目指すには GTM の読み込み戦略、メタデータ、アクセシビリティの細部を調整する必要がある。同じような改善に取り組む方の参考になれば幸いである。</p>]]></content:encoded>
            <category>Web</category>
            <category>SEO</category>
        </item>
        <item>
            <title><![CDATA[pLaTeX を使用して日本語 PDF を作成する方法]]></title>
            <link>https://www.hikari-dev.com/blog/2026/03/28/platex</link>
            <guid>https://www.hikari-dev.com/blog/2026/03/28/platex</guid>
            <pubDate>Sat, 28 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[pLaTeX を使って日本語の PDF 文書を作る手順をまとめた。ひな型の構成からコンパイル、よくあるエラーの対処まで解説する。]]></description>
            <content:encoded><![CDATA[<p>pLaTeX を使って日本語の PDF 文書を作る手順をまとめた。ひな型の構成からコンパイル、よくあるエラーの対処まで解説する。</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="platex-とは">pLaTeX とは<a href="https://www.hikari-dev.com/blog/2026/03/28/platex#platex-%E3%81%A8%E3%81%AF" class="hash-link" aria-label="pLaTeX とは への直接リンク" title="pLaTeX とは への直接リンク" translate="no">​</a></h2>
<p>pLaTeX は日本語組版に対応した LaTeX の実装である。<code>platex</code> コマンドで <code>.tex</code> ファイルをコンパイルし、<code>dvipdfmx</code> で PDF に変換する。</p>
<p>TeX Live に含まれているため、インストール済みであればすぐに使える。TeX Live のインストール手順は「<a class="" href="https://www.hikari-dev.com/blog/2026/03/27/install-texlive-2026-rocky-linux">Linux に TeX Live 2026 をインストールする</a>」を参照。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="文書クラスの選び方">文書クラスの選び方<a href="https://www.hikari-dev.com/blog/2026/03/28/platex#%E6%96%87%E6%9B%B8%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AE%E9%81%B8%E3%81%B3%E6%96%B9" class="hash-link" aria-label="文書クラスの選び方 への直接リンク" title="文書クラスの選び方 への直接リンク" translate="no">​</a></h2>
<p>日本語文書では以下のクラスを使う。</p>
<table><thead><tr><th>クラス</th><th>用途</th></tr></thead><tbody><tr><td><code>jarticle</code></td><td>論文・レポートなど短い文書</td></tr><tr><td><code>jbook</code></td><td>書籍・章立てのある長い文書</td></tr><tr><td><code>jreport</code></td><td>技術報告書（abstract + chapter 構成）</td></tr><tr><td><code>beamer</code></td><td>プレゼンテーション</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="ひな型jarticle">ひな型（jarticle）<a href="https://www.hikari-dev.com/blog/2026/03/28/platex#%E3%81%B2%E3%81%AA%E5%9E%8Bjarticle" class="hash-link" aria-label="ひな型（jarticle） への直接リンク" title="ひな型（jarticle） への直接リンク" translate="no">​</a></h2>
<p><code>jarticle</code> を使った基本的なサンプルは以下のとおり。</p>
<details class="details_rvcR alert alert--info details_Kt6x" data-collapsed="true"><summary>サンプルコードを表示する</summary><div><div class="collapsibleContent_IDV4"><div class="language-latex codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-latex codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token comment" style="color:#999988;font-style:italic">% pLaTeX サンプル文書 — 主要機能を網羅</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\documentclass</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">a4paper,12pt</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">jarticle</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">%% ========== パッケージ ==========</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\usepackage</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">amsmath, amssymb</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">% 数式強化</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\usepackage</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">graphicx</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">              </span><span class="token comment" style="color:#999988;font-style:italic">% 図の取り込み</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\usepackage</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">color</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">                 </span><span class="token comment" style="color:#999988;font-style:italic">% 色指定</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\usepackage</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">fancyhdr</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">              </span><span class="token comment" style="color:#999988;font-style:italic">% ヘッダ・フッタ</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\usepackage</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">geometry</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">              </span><span class="token comment" style="color:#999988;font-style:italic">% ページレイアウト</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\usepackage</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">enumerate</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">             </span><span class="token comment" style="color:#999988;font-style:italic">% 列挙カスタマイズ</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\usepackage</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">url</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">                   </span><span class="token comment" style="color:#999988;font-style:italic">% URL 表示</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\usepackage</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">multicol</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">              </span><span class="token comment" style="color:#999988;font-style:italic">% 段組み</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\usepackage</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">booktabs</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">              </span><span class="token comment" style="color:#999988;font-style:italic">% 高品質な表罫線</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\usepackage</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">array</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">                 </span><span class="token comment" style="color:#999988;font-style:italic">% 表列書式拡張</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\usepackage</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">verbatim</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">              </span><span class="token comment" style="color:#999988;font-style:italic">% verbatim 環境</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\usepackage</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">ascmac</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">                </span><span class="token comment" style="color:#999988;font-style:italic">% 囲み環境（screen, itembox など）</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\usepackage</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">okumacro</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">              </span><span class="token comment" style="color:#999988;font-style:italic">% ルビ・圏点など（pLaTeX 定番）</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\usepackage</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">setspace</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">              </span><span class="token comment" style="color:#999988;font-style:italic">% 行間調整</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\usepackage</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">listings</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">              </span><span class="token comment" style="color:#999988;font-style:italic">% ソースコードリスト</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\usepackage</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">xcolor</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">                </span><span class="token comment" style="color:#999988;font-style:italic">% 色（listings 用）</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\usepackage</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">caption</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">               </span><span class="token comment" style="color:#999988;font-style:italic">% キャプション書式</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">%% ========== ページレイアウト ==========</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\geometry</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">top=25mm, bottom=25mm, left=25mm, right=25mm</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\setlength</span><span class="token punctuation" style="color:#393A34">{</span><span class="token function selector" style="color:#00009f">\headheight</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">17pt</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\addtolength</span><span class="token punctuation" style="color:#393A34">{</span><span class="token function selector" style="color:#00009f">\topmargin</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">-5pt</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">%% ========== ヘッダ・フッタ ==========</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\pagestyle</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">fancy</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\fancyhf</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\lhead</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">pLaTeX サンプル文書</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\rhead</span><span class="token punctuation" style="color:#393A34">{</span><span class="token function selector" style="color:#00009f">\today</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\cfoot</span><span class="token punctuation" style="color:#393A34">{</span><span class="token function selector" style="color:#00009f">\thepage</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\renewcommand</span><span class="token punctuation" style="color:#393A34">{</span><span class="token function selector" style="color:#00009f">\headrulewidth</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">0.4pt</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">%% ========== listings 設定 ==========</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\lstset</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  basicstyle=</span><span class="token function selector" style="color:#00009f">\ttfamily</span><span class="token function selector" style="color:#00009f">\small</span><span class="token plain">,</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  keywordstyle=</span><span class="token function selector" style="color:#00009f">\color</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">blue</span><span class="token punctuation" style="color:#393A34">}</span><span class="token function selector" style="color:#00009f">\bfseries</span><span class="token plain">,</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  commentstyle=</span><span class="token function selector" style="color:#00009f">\color</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">green!50!black</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">,</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  stringstyle=</span><span class="token function selector" style="color:#00009f">\color</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">red!70!black</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">,</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  numbers=left,</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  numberstyle=</span><span class="token function selector" style="color:#00009f">\tiny</span><span class="token function selector" style="color:#00009f">\color</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">gray</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">,</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  frame=single,</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  breaklines=true,</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  tabsize=4,</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">%% ========== タイトル情報 ==========</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\title</span><span class="token punctuation" style="color:#393A34">{</span><span class="token function selector" style="color:#00009f">\textbf</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">pLaTeX 主要機能サンプル</span><span class="token punctuation" style="color:#393A34">}</span><span class="token function selector" style="color:#00009f">\\</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">5pt</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">       </span><span class="token function selector" style="color:#00009f">\large</span><span class="token plain"> --- 日本語 </span><span class="token function selector" style="color:#00009f">\LaTeX</span><span class="token plain"> の典型的な使い方 ---</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\author</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">サンプル太郎</span><span class="token function selector" style="color:#00009f">\thanks</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">サンプル大学 情報工学部</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">        </span><span class="token function selector" style="color:#00009f">\and</span><span class="token plain"> サンプル花子</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\date</span><span class="token punctuation" style="color:#393A34">{</span><span class="token function selector" style="color:#00009f">\today</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">%% ================================================================</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\begin</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">document</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">%% ================================================================</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\maketitle</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\thispagestyle</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">fancy</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\begin</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">abstract</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">本文書は pLaTeX の主要機能を一通り示すサンプルである。</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">文書クラス・パッケージの読み込み、日本語組版特有の機能、</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">数式、表、図、相互参照、脚注、ルビ、圏点、</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">ソースコードリスト、段組み、カスタムコマンドなど</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">を順を追って解説する。</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\end</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">abstract</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\tableofcontents</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\newpage</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">%% ================================================================</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\section</span><span class="token punctuation" style="color:#393A34">{</span><span class="token headline class-name">日本語組版の基本</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">%% ================================================================</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\subsection</span><span class="token punctuation" style="color:#393A34">{</span><span class="token headline class-name">和文・欧文の混在</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">pLaTeX は日本語と欧文を自然に混在させることができる。</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">たとえば「Hello, World!」や </span><span class="token function selector" style="color:#00009f">\texttt</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">LaTeX2e</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> のような</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">ASCII 文字は自動的に適切なスペースが挿入される。</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">全角文字と半角文字の間隔調整は pLaTeX が自動で行う：</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">日本語English日本語、数字123日本語、記号\</span><span class="token comment" style="color:#999988;font-style:italic">%日本語。</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\subsection</span><span class="token punctuation" style="color:#393A34">{</span><span class="token headline class-name">ルビ（振り仮名）</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\texttt</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">okumacro</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> パッケージの </span><span class="token function selector" style="color:#00009f">\verb</span><span class="token plain">|</span><span class="token function selector" style="color:#00009f">\ruby</span><span class="token plain">| コマンドでルビを振れる。</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\begin</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">center</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token function selector" style="color:#00009f">\ruby</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">漢字</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">かんじ</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">、</span><span class="token function selector" style="color:#00009f">\ruby</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">情報処理</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">じょうほうしょり</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">、</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token function selector" style="color:#00009f">\ruby</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">自然言語</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">しぜんげんご</span><span class="token punctuation" style="color:#393A34">}</span><span class="token function selector" style="color:#00009f">\ruby</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">処理</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">しょり</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\end</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">center</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\subsection</span><span class="token punctuation" style="color:#393A34">{</span><span class="token headline class-name">圏点</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\texttt</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">okumacro</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> の </span><span class="token function selector" style="color:#00009f">\verb</span><span class="token plain">|</span><span class="token function selector" style="color:#00009f">\kenten</span><span class="token plain">| で圏点（傍点）を付ける。</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\begin</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">center</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token function selector" style="color:#00009f">\kenten</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">重要な箇所</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">には圏点を打つことができる。</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\end</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">center</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\subsection</span><span class="token punctuation" style="color:#393A34">{</span><span class="token headline class-name">文字サイズ</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token function selector" style="color:#00009f">\tiny</span><span class="token plain"> 極小</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token function selector" style="color:#00009f">\scriptsize</span><span class="token plain"> 脚注</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token function selector" style="color:#00009f">\footnotesize</span><span class="token plain"> 小</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token function selector" style="color:#00009f">\small</span><span class="token plain"> やや小</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token function selector" style="color:#00009f">\normalsize</span><span class="token plain"> 標準</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token function selector" style="color:#00009f">\large</span><span class="token plain"> やや大</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token function selector" style="color:#00009f">\Large</span><span class="token plain"> 大</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token function selector" style="color:#00009f">\LARGE</span><span class="token plain"> 特大</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token function selector" style="color:#00009f">\huge</span><span class="token plain"> 超大</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token function selector" style="color:#00009f">\Huge</span><span class="token plain"> 最大</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\subsection</span><span class="token punctuation" style="color:#393A34">{</span><span class="token headline class-name">文字装飾</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\begin</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">itemize</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token function selector" style="color:#00009f">\item</span><span class="token plain"> </span><span class="token function selector" style="color:#00009f">\textbf</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">ボールド（太字）</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token function selector" style="color:#00009f">\item</span><span class="token plain"> </span><span class="token function selector" style="color:#00009f">\textit</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">イタリック（欧文）</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token function selector" style="color:#00009f">\item</span><span class="token plain"> </span><span class="token function selector" style="color:#00009f">\textsl</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">スラント</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token function selector" style="color:#00009f">\item</span><span class="token plain"> </span><span class="token function selector" style="color:#00009f">\textsc</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">Small Caps</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token function selector" style="color:#00009f">\item</span><span class="token plain"> </span><span class="token function selector" style="color:#00009f">\texttt</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">タイプライタ体（等幅）</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token function selector" style="color:#00009f">\item</span><span class="token plain"> </span><span class="token function selector" style="color:#00009f">\underline</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">下線付きテキスト</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token function selector" style="color:#00009f">\item</span><span class="token plain"> </span><span class="token function selector" style="color:#00009f">\textcolor</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">red</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">赤色テキスト</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token function selector" style="color:#00009f">\item</span><span class="token plain"> </span><span class="token function selector" style="color:#00009f">\textcolor</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">blue!70!black</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">青色テキスト</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token function selector" style="color:#00009f">\item</span><span class="token plain"> </span><span class="token function selector" style="color:#00009f">\colorbox</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">yellow</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">ハイライト背景</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\end</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">itemize</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">%% ================================================================</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\section</span><span class="token punctuation" style="color:#393A34">{</span><span class="token headline class-name">文書構造</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">%% ================================================================</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\subsection</span><span class="token punctuation" style="color:#393A34">{</span><span class="token headline class-name">見出し階層</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">pLaTeX（</span><span class="token function selector" style="color:#00009f">\texttt</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">jarticle</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">）では以下の見出し階層が使える：</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\verb</span><span class="token plain">|</span><span class="token function selector" style="color:#00009f">\section</span><span class="token plain">|、</span><span class="token function selector" style="color:#00009f">\verb</span><span class="token plain">|</span><span class="token function selector" style="color:#00009f">\subsection</span><span class="token plain">|、</span><span class="token function selector" style="color:#00009f">\verb</span><span class="token plain">|</span><span class="token function selector" style="color:#00009f">\subsubsection</span><span class="token plain">|、</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\verb</span><span class="token plain">|</span><span class="token function selector" style="color:#00009f">\paragraph</span><span class="token plain">|、</span><span class="token function selector" style="color:#00009f">\verb</span><span class="token plain">|</span><span class="token function selector" style="color:#00009f">\subparagraph</span><span class="token plain">|。</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\subsubsection</span><span class="token punctuation" style="color:#393A34">{</span><span class="token headline class-name">サブサブセクション例</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">これはサブサブセクションである。</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\paragraph</span><span class="token punctuation" style="color:#393A34">{</span><span class="token headline class-name">パラグラフ見出し</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">これはパラグラフ見出しの例。インデントなしで本文が続く。</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\subsection</span><span class="token punctuation" style="color:#393A34">{</span><span class="token headline class-name">脚注</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">本文中に脚注</span><span class="token function selector" style="color:#00009f">\footnote</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">これが脚注のテキストである。ページ下部に自動配置される。</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">を付けることができる。複数の脚注</span><span class="token function selector" style="color:#00009f">\footnote</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">2つ目の脚注。番号は自動採番される。</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">も使える。</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\subsection</span><span class="token punctuation" style="color:#393A34">{</span><span class="token headline class-name">相互参照</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\verb</span><span class="token plain">|</span><span class="token function selector" style="color:#00009f">\label</span><span class="token plain">| を付けると、</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\verb</span><span class="token plain">|</span><span class="token function selector" style="color:#00009f">\ref</span><span class="token plain">| や </span><span class="token function selector" style="color:#00009f">\verb</span><span class="token plain">|</span><span class="token function selector" style="color:#00009f">\pageref</span><span class="token plain">| で参照できる。</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">例：次節は第~</span><span class="token function selector" style="color:#00009f">\ref</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">sec:math</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">~節（</span><span class="token function selector" style="color:#00009f">\pageref</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">sec:math</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">~ページ）。</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">%% ================================================================</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\section</span><span class="token punctuation" style="color:#393A34">{</span><span class="token headline class-name">数式環境</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\label</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">sec:math</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">%% ================================================================</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\subsection</span><span class="token punctuation" style="color:#393A34">{</span><span class="token headline class-name">インライン数式とディスプレイ数式</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">インライン数式：</span><span class="token equation string" style="color:#e3116c">$E = mc^2$</span><span class="token plain">、</span><span class="token equation string" style="color:#e3116c">$</span><span class="token equation string equation-command regex" style="color:#36acaa">\alpha</span><span class="token equation string" style="color:#e3116c"> + </span><span class="token equation string equation-command regex" style="color:#36acaa">\beta</span><span class="token equation string" style="color:#e3116c"> = </span><span class="token equation string equation-command regex" style="color:#36acaa">\gamma</span><span class="token equation string" style="color:#e3116c">$</span><span class="token plain">、</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token equation string" style="color:#e3116c">$</span><span class="token equation string equation-command regex" style="color:#36acaa">\sum</span><span class="token equation string" style="color:#e3116c">_{i=1}^{n} i = </span><span class="token equation string equation-command regex" style="color:#36acaa">\frac</span><span class="token equation string" style="color:#e3116c">{n(n+1)}{2}$</span><span class="token plain">。</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">ディスプレイ数式：</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token equation string" style="color:#e3116c">\[</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token equation string" style="color:#e3116c">  </span><span class="token equation string equation-command regex" style="color:#36acaa">\int</span><span class="token equation string" style="color:#e3116c">_{-</span><span class="token equation string equation-command regex" style="color:#36acaa">\infty</span><span class="token equation string" style="color:#e3116c">}^{</span><span class="token equation string equation-command regex" style="color:#36acaa">\infty</span><span class="token equation string" style="color:#e3116c">} e^{-x^2}</span><span class="token equation string equation-command regex" style="color:#36acaa">\,</span><span class="token equation string" style="color:#e3116c">dx = </span><span class="token equation string equation-command regex" style="color:#36acaa">\sqrt</span><span class="token equation string" style="color:#e3116c">{</span><span class="token equation string equation-command regex" style="color:#36acaa">\pi</span><span class="token equation string" style="color:#e3116c">}</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token equation string" style="color:#e3116c">\]</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\subsection</span><span class="token punctuation" style="color:#393A34">{</span><span class="token headline class-name">equation・align 環境</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">番号付き数式（</span><span class="token function selector" style="color:#00009f">\texttt</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">equation</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">）：</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\begin</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">equation</span><span class="token punctuation" style="color:#393A34">}</span><span class="token equation string" style="color:#e3116c"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token equation string" style="color:#e3116c">  </span><span class="token equation string equation-command regex" style="color:#36acaa">\label</span><span class="token equation string" style="color:#e3116c">{eq:euler}</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token equation string" style="color:#e3116c">  e^{i</span><span class="token equation string equation-command regex" style="color:#36acaa">\pi</span><span class="token equation string" style="color:#e3116c">} + 1 = 0</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token equation string" style="color:#e3116c"></span><span class="token function selector" style="color:#00009f">\end</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">equation</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">式~</span><span class="token function selector" style="color:#00009f">\eqref</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">eq:euler</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> はオイラーの等式である。</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">複数行の整列（</span><span class="token function selector" style="color:#00009f">\texttt</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">align</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">）：</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\begin</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">align</span><span class="token punctuation" style="color:#393A34">}</span><span class="token equation string" style="color:#e3116c"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token equation string" style="color:#e3116c">  (a+b)^2 &amp;= a^2 + 2ab + b^2 </span><span class="token equation string equation-command regex" style="color:#36acaa">\\</span><span class="token equation string" style="color:#e3116c"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token equation string" style="color:#e3116c">  (a-b)^2 &amp;= a^2 - 2ab + b^2 </span><span class="token equation string equation-command regex" style="color:#36acaa">\\</span><span class="token equation string" style="color:#e3116c"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token equation string" style="color:#e3116c">  (a+b)(a-b) &amp;= a^2 - b^2</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token equation string" style="color:#e3116c"></span><span class="token function selector" style="color:#00009f">\end</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">align</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\subsection</span><span class="token punctuation" style="color:#393A34">{</span><span class="token headline class-name">行列・ベクトル</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\begin</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">equation</span><span class="token punctuation" style="color:#393A34">}</span><span class="token equation string" style="color:#e3116c"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token equation string" style="color:#e3116c">  A = </span><span class="token equation string equation-command regex" style="color:#36acaa">\begin</span><span class="token equation string" style="color:#e3116c">{pmatrix} a_{11} &amp; a_{12} </span><span class="token equation string equation-command regex" style="color:#36acaa">\\</span><span class="token equation string" style="color:#e3116c"> a_{21} &amp; a_{22} </span><span class="token equation string equation-command regex" style="color:#36acaa">\end</span><span class="token equation string" style="color:#e3116c">{pmatrix},</span><span class="token equation string equation-command regex" style="color:#36acaa">\quad</span><span class="token equation string" style="color:#e3116c"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token equation string" style="color:#e3116c">  </span><span class="token equation string equation-command regex" style="color:#36acaa">\det</span><span class="token equation string" style="color:#e3116c">(A) = a_{11}a_{22} - a_{12}a_{21}</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token equation string" style="color:#e3116c"></span><span class="token function selector" style="color:#00009f">\end</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">equation</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\subsection</span><span class="token punctuation" style="color:#393A34">{</span><span class="token headline class-name">場合分け・分数・極限</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\begin</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">equation</span><span class="token punctuation" style="color:#393A34">}</span><span class="token equation string" style="color:#e3116c"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token equation string" style="color:#e3116c">  f(x) = </span><span class="token equation string equation-command regex" style="color:#36acaa">\begin</span><span class="token equation string" style="color:#e3116c">{cases}</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token equation string" style="color:#e3116c">    x^2       &amp; (x </span><span class="token equation string equation-command regex" style="color:#36acaa">\geq</span><span class="token equation string" style="color:#e3116c"> 0) </span><span class="token equation string equation-command regex" style="color:#36acaa">\\</span><span class="token equation string" style="color:#e3116c"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token equation string" style="color:#e3116c">    -x^2      &amp; (x &lt; 0)</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token equation string" style="color:#e3116c">  </span><span class="token equation string equation-command regex" style="color:#36acaa">\end</span><span class="token equation string" style="color:#e3116c">{cases}, </span><span class="token equation string equation-command regex" style="color:#36acaa">\qquad</span><span class="token equation string" style="color:#e3116c"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token equation string" style="color:#e3116c">  </span><span class="token equation string equation-command regex" style="color:#36acaa">\lim</span><span class="token equation string" style="color:#e3116c">_{n</span><span class="token equation string equation-command regex" style="color:#36acaa">\to</span><span class="token equation string equation-command regex" style="color:#36acaa">\infty</span><span class="token equation string" style="color:#e3116c">} </span><span class="token equation string equation-command regex" style="color:#36acaa">\left</span><span class="token equation string" style="color:#e3116c">(1 + </span><span class="token equation string equation-command regex" style="color:#36acaa">\frac</span><span class="token equation string" style="color:#e3116c">{1}{n}</span><span class="token equation string equation-command regex" style="color:#36acaa">\right</span><span class="token equation string" style="color:#e3116c">)^n = e</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token equation string" style="color:#e3116c"></span><span class="token function selector" style="color:#00009f">\end</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">equation</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">%% ================================================================</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\section</span><span class="token punctuation" style="color:#393A34">{</span><span class="token headline class-name">表（tabular 環境）</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">%% ================================================================</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\subsection</span><span class="token punctuation" style="color:#393A34">{</span><span class="token headline class-name">基本的な表</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\begin</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">table</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">h</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token function selector" style="color:#00009f">\centering</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token function selector" style="color:#00009f">\caption</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">都市別気温データ（仮）</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token function selector" style="color:#00009f">\label</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">tab:temp</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token function selector" style="color:#00009f">\begin</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">tabular</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">lrrr</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token function selector" style="color:#00009f">\toprule</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    都市   </span><span class="token punctuation" style="color:#393A34">&amp;</span><span class="token plain"> 最高気温 (°C) </span><span class="token punctuation" style="color:#393A34">&amp;</span><span class="token plain"> 最低気温 (°C) </span><span class="token punctuation" style="color:#393A34">&amp;</span><span class="token plain"> 平均気温 (°C) </span><span class="token function selector" style="color:#00009f">\\</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token function selector" style="color:#00009f">\midrule</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    東京   </span><span class="token punctuation" style="color:#393A34">&amp;</span><span class="token plain"> 35.2 </span><span class="token punctuation" style="color:#393A34">&amp;</span><span class="token plain"> 25.1 </span><span class="token punctuation" style="color:#393A34">&amp;</span><span class="token plain"> 29.8 </span><span class="token function selector" style="color:#00009f">\\</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    大阪   </span><span class="token punctuation" style="color:#393A34">&amp;</span><span class="token plain"> 36.4 </span><span class="token punctuation" style="color:#393A34">&amp;</span><span class="token plain"> 26.3 </span><span class="token punctuation" style="color:#393A34">&amp;</span><span class="token plain"> 31.0 </span><span class="token function selector" style="color:#00009f">\\</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    札幌   </span><span class="token punctuation" style="color:#393A34">&amp;</span><span class="token plain"> 28.7 </span><span class="token punctuation" style="color:#393A34">&amp;</span><span class="token plain"> 19.5 </span><span class="token punctuation" style="color:#393A34">&amp;</span><span class="token plain"> 23.9 </span><span class="token function selector" style="color:#00009f">\\</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    那覇   </span><span class="token punctuation" style="color:#393A34">&amp;</span><span class="token plain"> 32.1 </span><span class="token punctuation" style="color:#393A34">&amp;</span><span class="token plain"> 27.4 </span><span class="token punctuation" style="color:#393A34">&amp;</span><span class="token plain"> 29.8 </span><span class="token function selector" style="color:#00009f">\\</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token function selector" style="color:#00009f">\bottomrule</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token function selector" style="color:#00009f">\end</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">tabular</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\end</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">table</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\subsection</span><span class="token punctuation" style="color:#393A34">{</span><span class="token headline class-name">複雑な表（\texttt{array</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> 拡張・セル結合）</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\begin</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">table</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">h</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token function selector" style="color:#00009f">\centering</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token function selector" style="color:#00009f">\caption</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">プログラミング言語比較</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token function selector" style="color:#00009f">\label</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">tab:lang</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token function selector" style="color:#00009f">\begin</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">tabular</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">|l|c|c|c|</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token function selector" style="color:#00009f">\hline</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    言語       </span><span class="token punctuation" style="color:#393A34">&amp;</span><span class="token plain"> 型付け   </span><span class="token punctuation" style="color:#393A34">&amp;</span><span class="token plain"> パラダイム       </span><span class="token punctuation" style="color:#393A34">&amp;</span><span class="token plain"> 主な用途 </span><span class="token function selector" style="color:#00009f">\\</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token function selector" style="color:#00009f">\hline</span><span class="token function selector" style="color:#00009f">\hline</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    Python     </span><span class="token punctuation" style="color:#393A34">&amp;</span><span class="token plain"> 動的     </span><span class="token punctuation" style="color:#393A34">&amp;</span><span class="token plain"> マルチ           </span><span class="token punctuation" style="color:#393A34">&amp;</span><span class="token plain"> AI/データ分析 </span><span class="token function selector" style="color:#00009f">\\</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    Rust       </span><span class="token punctuation" style="color:#393A34">&amp;</span><span class="token plain"> 静的     </span><span class="token punctuation" style="color:#393A34">&amp;</span><span class="token plain"> システム         </span><span class="token punctuation" style="color:#393A34">&amp;</span><span class="token plain"> システム開発 </span><span class="token function selector" style="color:#00009f">\\</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    Haskell    </span><span class="token punctuation" style="color:#393A34">&amp;</span><span class="token plain"> 静的     </span><span class="token punctuation" style="color:#393A34">&amp;</span><span class="token plain"> 関数型           </span><span class="token punctuation" style="color:#393A34">&amp;</span><span class="token plain"> 研究・金融 </span><span class="token function selector" style="color:#00009f">\\</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    JavaScript </span><span class="token punctuation" style="color:#393A34">&amp;</span><span class="token plain"> 動的     </span><span class="token punctuation" style="color:#393A34">&amp;</span><span class="token plain"> マルチ           </span><span class="token punctuation" style="color:#393A34">&amp;</span><span class="token plain"> Web フロント </span><span class="token function selector" style="color:#00009f">\\</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token function selector" style="color:#00009f">\hline</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token function selector" style="color:#00009f">\end</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">tabular</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\end</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">table</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">表~</span><span class="token function selector" style="color:#00009f">\ref</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">tab:temp</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> と表~</span><span class="token function selector" style="color:#00009f">\ref</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">tab:lang</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> のように </span><span class="token function selector" style="color:#00009f">\verb</span><span class="token plain">|</span><span class="token function selector" style="color:#00009f">\label</span><span class="token plain">/</span><span class="token function selector" style="color:#00009f">\ref</span><span class="token plain">| で参照できる。</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">%% ================================================================</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\section</span><span class="token punctuation" style="color:#393A34">{</span><span class="token headline class-name">リスト環境</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">%% ================================================================</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\subsection</span><span class="token punctuation" style="color:#393A34">{</span><span class="token headline class-name">箇条書き（itemize）</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\begin</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">itemize</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token function selector" style="color:#00009f">\item</span><span class="token plain"> 第一の項目</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token function selector" style="color:#00009f">\item</span><span class="token plain"> 第二の項目</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token function selector" style="color:#00009f">\begin</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">itemize</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">      </span><span class="token function selector" style="color:#00009f">\item</span><span class="token plain"> 入れ子の項目 A</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">      </span><span class="token function selector" style="color:#00009f">\item</span><span class="token plain"> 入れ子の項目 B</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token function selector" style="color:#00009f">\end</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">itemize</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token function selector" style="color:#00009f">\item</span><span class="token plain"> 第三の項目</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\end</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">itemize</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\subsection</span><span class="token punctuation" style="color:#393A34">{</span><span class="token headline class-name">番号付きリスト（enumerate）</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\begin</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">enumerate</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">(1)</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain">   </span><span class="token comment" style="color:#999988;font-style:italic">% enumerate パッケージで書式指定</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token function selector" style="color:#00009f">\item</span><span class="token plain"> 最初のステップ</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token function selector" style="color:#00009f">\item</span><span class="token plain"> 次のステップ</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token function selector" style="color:#00009f">\item</span><span class="token plain"> 最後のステップ</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\end</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">enumerate</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\subsection</span><span class="token punctuation" style="color:#393A34">{</span><span class="token headline class-name">説明リスト（description）</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\begin</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">description</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token function selector" style="color:#00009f">\item</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">pLaTeX</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> 日本語対応の </span><span class="token function selector" style="color:#00009f">\LaTeX</span><span class="token plain"> 処理系</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token function selector" style="color:#00009f">\item</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">upLaTeX</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> Unicode 対応の pLaTeX 後継版</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token function selector" style="color:#00009f">\item</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">LuaLaTeX</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> Lua スクリプトが使える </span><span class="token function selector" style="color:#00009f">\LaTeX</span><span class="token plain"> 処理系</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\end</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">description</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">%% ================================================================</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\section</span><span class="token punctuation" style="color:#393A34">{</span><span class="token headline class-name">verbatim・ソースコード</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">%% ================================================================</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\subsection</span><span class="token punctuation" style="color:#393A34">{</span><span class="token headline class-name">verbatim 環境</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\begin</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">verbatim</span><span class="token punctuation" style="color:#393A34">}</span><span class="token cdata" style="color:#999988;font-style:italic"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token cdata" style="color:#999988;font-style:italic">#include &lt;stdio.h&gt;</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token cdata" style="color:#999988;font-style:italic">int main(void) {</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token cdata" style="color:#999988;font-style:italic">    printf("Hello, pLaTeX!\n");</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token cdata" style="color:#999988;font-style:italic">    return 0;</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token cdata" style="color:#999988;font-style:italic">}</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token cdata" style="color:#999988;font-style:italic"></span><span class="token function selector" style="color:#00009f">\end</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">verbatim</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\subsection</span><span class="token punctuation" style="color:#393A34">{</span><span class="token headline class-name">listings によるシンタックスハイライト</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\begin</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">lstlisting</span><span class="token punctuation" style="color:#393A34">}</span><span class="token cdata" style="color:#999988;font-style:italic">[language=Python, caption={フィボナッチ数列（Python）}]</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token cdata" style="color:#999988;font-style:italic">def fibonacci(n: int) -&gt; int:</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token cdata" style="color:#999988;font-style:italic">    """再帰でフィボナッチ数を計算する"""</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token cdata" style="color:#999988;font-style:italic">    if n &lt;= 1:</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token cdata" style="color:#999988;font-style:italic">        return n</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token cdata" style="color:#999988;font-style:italic">    return fibonacci(n - 1) + fibonacci(n - 2)</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token cdata" style="color:#999988;font-style:italic"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token cdata" style="color:#999988;font-style:italic"># 最初の 10 項を出力</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token cdata" style="color:#999988;font-style:italic">for i in range(10):</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token cdata" style="color:#999988;font-style:italic">    print(f"F({i}) = {fibonacci(i)}")</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token cdata" style="color:#999988;font-style:italic"></span><span class="token function selector" style="color:#00009f">\end</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">lstlisting</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">%% ================================================================</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\section</span><span class="token punctuation" style="color:#393A34">{</span><span class="token headline class-name">囲み・強調ボックス</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">%% ================================================================</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\texttt</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">ascmac</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> パッケージの </span><span class="token function selector" style="color:#00009f">\texttt</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">itembox</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">、</span><span class="token function selector" style="color:#00009f">\texttt</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">screen</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> 等を活用できる。</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\begin</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">itembox</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">l</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">重要なポイント</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token function selector" style="color:#00009f">\begin</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">itemize</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token function selector" style="color:#00009f">\item</span><span class="token plain"> pLaTeX は </span><span class="token function selector" style="color:#00009f">\texttt</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">jarticle</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> / </span><span class="token function selector" style="color:#00009f">\texttt</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">jbook</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> 文書クラスを使う</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token function selector" style="color:#00009f">\item</span><span class="token plain"> </span><span class="token function selector" style="color:#00009f">\texttt</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">okumacro</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> でルビ・圏点が使える</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token function selector" style="color:#00009f">\item</span><span class="token plain"> </span><span class="token function selector" style="color:#00009f">\texttt</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">platex + dvipdfmx</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> で PDF を生成する</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token function selector" style="color:#00009f">\end</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">itemize</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\end</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">itembox</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\vspace</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">5pt</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\begin</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">screen</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\texttt</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">screen</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> 環境：端末表示風の囲み枠。ソース例や出力例の表示に使う。</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\end</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">screen</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">%% ================================================================</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\section</span><span class="token punctuation" style="color:#393A34">{</span><span class="token headline class-name">段組み</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">%% ================================================================</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\texttt</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">multicol</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> パッケージで途中から 2 段組みに切り替えられる。</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\begin</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">multicols</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">2</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token function selector" style="color:#00009f">\noindent</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  これは 2 段組みの左カラムである。</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  日本語の段組みも pLaTeX は自然に処理する。</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  長い文章でも自動的に均等に振り分けられるため、</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  新聞・雑誌スタイルの組版に適している。</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token function selector" style="color:#00009f">\columnbreak</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token function selector" style="color:#00009f">\noindent</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  こちらが右カラムである。</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token function selector" style="color:#00009f">\verb</span><span class="token plain">|</span><span class="token function selector" style="color:#00009f">\columnbreak</span><span class="token plain">| で強制的に段を切り替えることもできる。</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  数式 </span><span class="token equation string" style="color:#e3116c">$x = </span><span class="token equation string equation-command regex" style="color:#36acaa">\frac</span><span class="token equation string" style="color:#e3116c">{-b </span><span class="token equation string equation-command regex" style="color:#36acaa">\pm</span><span class="token equation string" style="color:#e3116c"> </span><span class="token equation string equation-command regex" style="color:#36acaa">\sqrt</span><span class="token equation string" style="color:#e3116c">{b^2 - 4ac}}{2a}$</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  もインラインで使える。</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\end</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">multicols</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">%% ================================================================</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\section</span><span class="token punctuation" style="color:#393A34">{</span><span class="token headline class-name">行間・スペーシング調整</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">%% ================================================================</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\subsection</span><span class="token punctuation" style="color:#393A34">{</span><span class="token headline class-name">水平スペース</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">単語間の空白：a</span><span class="token function selector" style="color:#00009f">\,</span><span class="token plain">b（</span><span class="token function selector" style="color:#00009f">\verb</span><span class="token plain">|</span><span class="token function selector" style="color:#00009f">\,</span><span class="token plain">| 細空白）、</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">a</span><span class="token function selector" style="color:#00009f">\enspace</span><span class="token plain"> b（</span><span class="token function selector" style="color:#00009f">\verb</span><span class="token plain">|</span><span class="token function selector" style="color:#00009f">\enspace</span><span class="token plain">|）、</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">a</span><span class="token function selector" style="color:#00009f">\quad</span><span class="token plain"> b（</span><span class="token function selector" style="color:#00009f">\verb</span><span class="token plain">|</span><span class="token function selector" style="color:#00009f">\quad</span><span class="token plain">|）、</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">a</span><span class="token function selector" style="color:#00009f">\qquad</span><span class="token plain"> b（</span><span class="token function selector" style="color:#00009f">\verb</span><span class="token plain">|</span><span class="token function selector" style="color:#00009f">\qquad</span><span class="token plain">|）。</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\subsection</span><span class="token punctuation" style="color:#393A34">{</span><span class="token headline class-name">垂直スペース</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\verb</span><span class="token plain">|</span><span class="token function selector" style="color:#00009f">\vspace</span><span class="token plain">| で垂直スペースを追加できる。</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\vspace</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">5mm</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">上から 5mm の垂直スペースを挿入した後のテキスト。</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\vspace</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">5mm</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\subsection</span><span class="token punctuation" style="color:#393A34">{</span><span class="token headline class-name">行間</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token function selector" style="color:#00009f">\setstretch</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">1.8</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">この段落は </span><span class="token function selector" style="color:#00009f">\texttt</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">setspace</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> パッケージの</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\texttt</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">setstretch</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> で行間を 1.8 倍に広げている。</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">日本語文書では 1.5〜2.0 程度の行間が読みやすいとされる。</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">%% ================================================================</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\section</span><span class="token punctuation" style="color:#393A34">{</span><span class="token headline class-name">カスタムコマンドと環境</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">%% ================================================================</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\subsection</span><span class="token punctuation" style="color:#393A34">{</span><span class="token headline class-name">カスタムコマンド定義</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\newcommand</span><span class="token punctuation" style="color:#393A34">{</span><span class="token function selector" style="color:#00009f">\R</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">{</span><span class="token function selector" style="color:#00009f">\mathbb</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">R</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\newcommand</span><span class="token punctuation" style="color:#393A34">{</span><span class="token function selector" style="color:#00009f">\N</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">{</span><span class="token function selector" style="color:#00009f">\mathbb</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">N</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\newcommand</span><span class="token punctuation" style="color:#393A34">{</span><span class="token function selector" style="color:#00009f">\highlight</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">{</span><span class="token function selector" style="color:#00009f">\colorbox</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">yellow!60</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">#1</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\newcommand</span><span class="token punctuation" style="color:#393A34">{</span><span class="token function selector" style="color:#00009f">\term</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">{</span><span class="token function selector" style="color:#00009f">\textbf</span><span class="token punctuation" style="color:#393A34">{</span><span class="token function selector" style="color:#00009f">\textit</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">#1</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">% 用語強調</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">定義した例：</span><span class="token equation string" style="color:#e3116c">$</span><span class="token equation string equation-command regex" style="color:#36acaa">\R</span><span class="token equation string" style="color:#e3116c">$</span><span class="token plain">（実数体）、</span><span class="token equation string" style="color:#e3116c">$</span><span class="token equation string equation-command regex" style="color:#36acaa">\N</span><span class="token equation string" style="color:#e3116c">$</span><span class="token plain">（自然数）。</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\highlight</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">ハイライトされたテキスト</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">。</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\term</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">機械学習</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">（Machine Learning）は人工知能の一分野である。</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\subsection</span><span class="token punctuation" style="color:#393A34">{</span><span class="token headline class-name">カスタム環境定義</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\newenvironment</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">mybox</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">{</span><span class="token comment" style="color:#999988;font-style:italic">%</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token function selector" style="color:#00009f">\begin</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">center</span><span class="token punctuation" style="color:#393A34">}</span><span class="token function selector" style="color:#00009f">\begin</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">tabular</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">|p</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">0.85</span><span class="token function selector" style="color:#00009f">\linewidth</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">|</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token function selector" style="color:#00009f">\hline</span><span class="token function selector" style="color:#00009f">\vspace</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">1pt</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token function selector" style="color:#00009f">\textbf</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">#1</span><span class="token punctuation" style="color:#393A34">}</span><span class="token function selector" style="color:#00009f">\\</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">2pt</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">{</span><span class="token comment" style="color:#999988;font-style:italic">%</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token function selector" style="color:#00009f">\\</span><span class="token function selector" style="color:#00009f">\hline</span><span class="token function selector" style="color:#00009f">\end</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">tabular</span><span class="token punctuation" style="color:#393A34">}</span><span class="token function selector" style="color:#00009f">\end</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">center</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\begin</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">mybox</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">自作の囲み枠</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token function selector" style="color:#00009f">\verb</span><span class="token plain">|</span><span class="token function selector" style="color:#00009f">\newenvironment</span><span class="token plain">| を使って独自の環境を定義できる。</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  引数も受け取れるので柔軟な再利用が可能。</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\end</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">mybox</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">%% ================================================================</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\section</span><span class="token punctuation" style="color:#393A34">{</span><span class="token headline class-name">参考文献</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">%% ================================================================</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">文献引用は </span><span class="token function selector" style="color:#00009f">\verb</span><span class="token plain">|</span><span class="token function selector" style="color:#00009f">\cite</span><span class="token plain">| コマンドで行う~</span><span class="token function selector" style="color:#00009f">\cite</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">knuth1984,lamport1994,okumura2020</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">。</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">文末に参考文献リストが出力される。</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">%% ================================================================</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">%% 参考文献リスト（thebibliography 環境）</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">%% ================================================================</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\begin</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">thebibliography</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">99</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\bibitem</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">knuth1984</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  D.~E. Knuth,</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token function selector" style="color:#00009f">\textit</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">The </span><span class="token function selector" style="color:#00009f">\TeX</span><span class="token plain"> book</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">,</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  Addison-Wesley, 1984.</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\bibitem</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">lamport1994</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  L.~Lamport,</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token function selector" style="color:#00009f">\textit</span><span class="token punctuation" style="color:#393A34">{</span><span class="token function selector" style="color:#00009f">\LaTeX</span><span class="token plain">: A Document Preparation System</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">, 2nd ed.,</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  Addison-Wesley, 1994.</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\bibitem</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">okumura2020</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  奥村晴彦・黒木裕介,</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  『</span><span class="token function selector" style="color:#00009f">\LaTeXe</span><span class="token plain"> 美文書作成入門』第 8 版,</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  技術評論社, 2020.</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\end</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">thebibliography</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function selector" style="color:#00009f">\end</span><span class="token punctuation" style="color:#393A34">{</span><span class="token keyword" style="color:#00009f">document</span><span class="token punctuation" style="color:#393A34">}</span></span><br></div></code></pre></div></div></div></div></details>
<iframe src="/img/blog/2026-03-28-platex/sample.pdf" width="100%" height="600px" style="border:none"></iframe>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="コンパイル手順">コンパイル手順<a href="https://www.hikari-dev.com/blog/2026/03/28/platex#%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E6%89%8B%E9%A0%86" class="hash-link" aria-label="コンパイル手順 への直接リンク" title="コンパイル手順 への直接リンク" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="基本platex--dvipdfmx">基本（platex + dvipdfmx）<a href="https://www.hikari-dev.com/blog/2026/03/28/platex#%E5%9F%BA%E6%9C%ACplatex--dvipdfmx" class="hash-link" aria-label="基本（platex + dvipdfmx） への直接リンク" title="基本（platex + dvipdfmx） への直接リンク" translate="no">​</a></h3>
<p>相互参照や目次を正しく解決するため、<code>platex</code> を 2 回実行してから <code>dvipdfmx</code> で PDF 化する。</p>
<div class="language-bash codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-bash codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">platex </span><span class="token parameter variable" style="color:#36acaa">-interaction</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">nonstopmode </span><span class="token parameter variable" style="color:#36acaa">-kanji</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">utf8 document.tex</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">platex </span><span class="token parameter variable" style="color:#36acaa">-interaction</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">nonstopmode </span><span class="token parameter variable" style="color:#36acaa">-kanji</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">utf8 document.tex</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">dvipdfmx document.dvi</span></span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="ptex2pdf">ptex2pdf<a href="https://www.hikari-dev.com/blog/2026/03/28/platex#ptex2pdf" class="hash-link" aria-label="ptex2pdf への直接リンク" title="ptex2pdf への直接リンク" translate="no">​</a></h3>
<p><code>platex</code> + <code>dvipdfmx</code> の 2 ステップを 1 コマンドにまとめた <code>ptex2pdf</code> を使う方法もある。</p>
<h4 class="anchor anchorTargetStickyNavbar_DVDF" id="基本コマンド">基本コマンド<a href="https://www.hikari-dev.com/blog/2026/03/28/platex#%E5%9F%BA%E6%9C%AC%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89" class="hash-link" aria-label="基本コマンド への直接リンク" title="基本コマンド への直接リンク" translate="no">​</a></h4>
<div class="language-bash codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-bash codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">ptex2pdf </span><span class="token parameter variable" style="color:#36acaa">-l</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-ot</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"-kanji=utf8 -interaction=nonstopmode"</span><span class="token plain"> document.tex</span></span><br></div></code></pre></div></div>
<table><thead><tr><th>オプション</th><th>意味</th></tr></thead><tbody><tr><td><code>-l</code></td><td>latex ベースのエンジン（platex）を使用</td></tr><tr><td><code>-ot "..."</code></td><td>platex に渡すオプション</td></tr><tr><td><code>-kanji=utf8</code></td><td>入力エンコーディングを UTF-8 に指定</td></tr><tr><td><code>-interaction=nonstopmode</code></td><td>エラー時も停止せずに処理を続行</td></tr></tbody></table>
<h4 class="anchor anchorTargetStickyNavbar_DVDF" id="手順">手順<a href="https://www.hikari-dev.com/blog/2026/03/28/platex#%E6%89%8B%E9%A0%86" class="hash-link" aria-label="手順 への直接リンク" title="手順 への直接リンク" translate="no">​</a></h4>
<ol>
<li class="">
<p><strong>ptex2pdf を 2 回実行する</strong>（相互参照・目次の解決のため）</p>
<div class="language-bash codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-bash codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">ptex2pdf </span><span class="token parameter variable" style="color:#36acaa">-l</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-ot</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"-kanji=utf8 -interaction=nonstopmode"</span><span class="token plain"> document.tex</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">ptex2pdf </span><span class="token parameter variable" style="color:#36acaa">-l</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-ot</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"-kanji=utf8 -interaction=nonstopmode"</span><span class="token plain"> document.tex</span></span><br></div></code></pre></div></div>
</li>
<li class="">
<p><strong>結果を確認する</strong></p>
<ul>
<li class="">成功: <code>document.pdf</code> が生成される</li>
<li class="">エラー: <code>.log</code> の <code>!</code> で始まる行とその前後 3 行を確認する</li>
<li class="">警告のみ: Overfull/Underfull hbox、未定義参照などを確認する</li>
</ul>
</li>
<li class="">
<p><strong>BibTeX が必要な場合</strong>（<code>.bib</code> ファイルが存在する、または <code>\bibliography</code> コマンドが含まれる場合）</p>
<div class="language-bash codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-bash codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">ptex2pdf </span><span class="token parameter variable" style="color:#36acaa">-l</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-ot</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"-kanji=utf8 -interaction=nonstopmode"</span><span class="token plain"> document.tex</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">bibtex document</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">ptex2pdf </span><span class="token parameter variable" style="color:#36acaa">-l</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-ot</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"-kanji=utf8 -interaction=nonstopmode"</span><span class="token plain"> document.tex</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">ptex2pdf </span><span class="token parameter variable" style="color:#36acaa">-l</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-ot</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"-kanji=utf8 -interaction=nonstopmode"</span><span class="token plain"> document.tex</span></span><br></div></code></pre></div></div>
<p><code>bibtex</code> の後に <code>ptex2pdf</code> を 2 回実行するのは、参考文献リストと本文中の引用番号の相互参照を解決するためである。</p>
</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="よくあるエラーと対処">よくあるエラーと対処<a href="https://www.hikari-dev.com/blog/2026/03/28/platex#%E3%82%88%E3%81%8F%E3%81%82%E3%82%8B%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%A8%E5%AF%BE%E5%87%A6" class="hash-link" aria-label="よくあるエラーと対処 への直接リンク" title="よくあるエラーと対処 への直接リンク" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="undefined-control-sequence">Undefined control sequence<a href="https://www.hikari-dev.com/blog/2026/03/28/platex#undefined-control-sequence" class="hash-link" aria-label="Undefined control sequence への直接リンク" title="Undefined control sequence への直接リンク" translate="no">​</a></h3>
<div class="language-latex codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-latex codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">! Undefined control sequence.</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">l.42 </span><span class="token function selector" style="color:#00009f">\somecommand</span></span><br></div></code></pre></div></div>
<p>未定義のコマンドを使っている。パッケージの読み込み忘れか typo が原因である。</p>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="missing--inserted">Missing $ inserted<a href="https://www.hikari-dev.com/blog/2026/03/28/platex#missing--inserted" class="hash-link" aria-label="Missing $ inserted への直接リンク" title="Missing $ inserted への直接リンク" translate="no">​</a></h3>
<div class="language-latex codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-latex codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">! Missing $ inserted.</span></span><br></div></code></pre></div></div>
<p>数式モード外で <code>_</code>（下付き）や <code>^</code>（上付き）などの数式記号を使っている。<code>$...$</code> で囲む。</p>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="file-not-found">File not found<a href="https://www.hikari-dev.com/blog/2026/03/28/platex#file-not-found" class="hash-link" aria-label="File not found への直接リンク" title="File not found への直接リンク" translate="no">​</a></h3>
<div class="language-latex codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-latex codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">! LaTeX Error: File `image.png' not found.</span></span><br></div></code></pre></div></div>
<p><code>\includegraphics</code> で指定したファイルのパスが誤っている。<code>.tex</code> ファイルからの相対パスを確認する。</p>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="overfull-hbox">Overfull \hbox<a href="https://www.hikari-dev.com/blog/2026/03/28/platex#overfull-hbox" class="hash-link" aria-label="Overfull \hbox への直接リンク" title="Overfull \hbox への直接リンク" translate="no">​</a></h3>
<div class="language-latex codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-latex codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">Overfull </span><span class="token function selector" style="color:#00009f">\hbox</span><span class="token plain"> (12.3pt too wide) in paragraph at lines 55--60</span></span><br></div></code></pre></div></div>
<p>エラーではなく警告である。行が指定幅に収まっていない。長い URL や英単語が原因のことが多く、<code>\allowbreak</code> や <code>\url{}</code> パッケージで対処できる。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="ログの確認">ログの確認<a href="https://www.hikari-dev.com/blog/2026/03/28/platex#%E3%83%AD%E3%82%B0%E3%81%AE%E7%A2%BA%E8%AA%8D" class="hash-link" aria-label="ログの確認 への直接リンク" title="ログの確認 への直接リンク" translate="no">​</a></h2>
<p>コンパイル後に生成される <code>.log</code> ファイルにはエラーと警告の詳細が記録されている。エラーは <code>!</code> で始まる行、警告は <code>Warning</code> を含む行である。</p>
<div class="language-bash codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-bash codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token function" style="color:#d73a49">grep</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-n</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^!"</span><span class="token plain"> document.log        </span><span class="token comment" style="color:#999988;font-style:italic"># エラー行を抽出</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function" style="color:#d73a49">grep</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-n</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Warning"</span><span class="token plain"> document.log   </span><span class="token comment" style="color:#999988;font-style:italic"># 警告行を抽出</span></span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="中間ファイルの削除">中間ファイルの削除<a href="https://www.hikari-dev.com/blog/2026/03/28/platex#%E4%B8%AD%E9%96%93%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E5%89%8A%E9%99%A4" class="hash-link" aria-label="中間ファイルの削除 への直接リンク" title="中間ファイルの削除 への直接リンク" translate="no">​</a></h2>
<p>コンパイルで生成される中間ファイルは多い。PDF を残してクリーンアップするには以下を実行する。</p>
<div class="language-bash codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-bash codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token function" style="color:#d73a49">rm</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-f</span><span class="token plain"> document.aux document.log document.dvi </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">      document.toc document.lof document.lot </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">      document.out document.bbl document.blg </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">      document.synctex.gz</span></span><br></div></code></pre></div></div>
<p>すべて削除する場合は <code>.pdf</code> も加える。</p>]]></content:encoded>
            <category>LaTeX</category>
            <category>TeX</category>
            <category>Linux</category>
        </item>
        <item>
            <title><![CDATA[Linux に TeX Live 2026 をインストールする]]></title>
            <link>https://www.hikari-dev.com/blog/2026/03/27/install-texlive-2026-rocky-linux</link>
            <guid>https://www.hikari-dev.com/blog/2026/03/27/install-texlive-2026-rocky-linux</guid>
            <pubDate>Fri, 27 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Linux (RHEL 系) に ISO イメージを使って TeX Live 2026 をインストールする手順をまとめた。RHEL 系全般に適用できる。]]></description>
            <content:encoded><![CDATA[<p>Linux (RHEL 系) に ISO イメージを使って TeX Live 2026 をインストールする手順をまとめた。RHEL 系全般に適用できる。</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="前提条件">前提条件<a href="https://www.hikari-dev.com/blog/2026/03/27/install-texlive-2026-rocky-linux#%E5%89%8D%E6%8F%90%E6%9D%A1%E4%BB%B6" class="hash-link" aria-label="前提条件 への直接リンク" title="前提条件 への直接リンク" translate="no">​</a></h2>
<ul>
<li class=""><code>sudo</code> 権限があること</li>
<li class="">ディスク空き容量が 10 GB 以上あること（ISO 約 6.4 GB + インストール先 約 8 GB）</li>
<li class="">インターネット接続があること</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="step-1-iso-イメージのダウンロード">Step 1: ISO イメージのダウンロード<a href="https://www.hikari-dev.com/blog/2026/03/27/install-texlive-2026-rocky-linux#step-1-iso-%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%81%AE%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89" class="hash-link" aria-label="Step 1: ISO イメージのダウンロード への直接リンク" title="Step 1: ISO イメージのダウンロード への直接リンク" translate="no">​</a></h2>
<p>理化学研究所のミラーサイトから ISO をダウンロードする。</p>
<div class="language-bash codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-bash codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token builtin class-name">cd</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-C</span><span class="token plain"> - </span><span class="token parameter variable" style="color:#36acaa">-O</span><span class="token plain"> --progress-bar https://ftp.riken.jp/CTAN/systems/texlive/Images/texlive2026.iso</span></span><br></div></code></pre></div></div>
<p><code>-C -</code> はダウンロードが途中で止まった場合の再開オプションである。</p>
<p>ダウンロード完了後、ファイルサイズを確認する (約 6.4 GiB):</p>
<div class="language-bash codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-bash codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token function" style="color:#d73a49">ls</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-lh</span><span class="token plain"> ~/texlive2026.iso</span></span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="step-2-iso-イメージのマウント">Step 2: ISO イメージのマウント<a href="https://www.hikari-dev.com/blog/2026/03/27/install-texlive-2026-rocky-linux#step-2-iso-%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%81%AE%E3%83%9E%E3%82%A6%E3%83%B3%E3%83%88" class="hash-link" aria-label="Step 2: ISO イメージのマウント への直接リンク" title="Step 2: ISO イメージのマウント への直接リンク" translate="no">​</a></h2>
<p>マウントポイントを作成し、ISO をループ デバイスとしてマウントする。</p>
<div class="language-bash codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-bash codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">mkdir</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-p</span><span class="token plain"> /mnt/texlive</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">mount</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-o</span><span class="token plain"> loop,ro ~/texlive2026.iso /mnt/texlive</span></span><br></div></code></pre></div></div>
<p>マウント確認:</p>
<div class="language-bash codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-bash codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token function" style="color:#d73a49">ls</span><span class="token plain"> /mnt/texlive</span></span><br></div></code></pre></div></div>
<p>以下のようなファイルが表示されれば成功である：</p>
<div class="language-text codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-text codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">install-tl  archive  tlpkg  README  ...</span></span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="step-3-インストーラーの実行">Step 3: インストーラーの実行<a href="https://www.hikari-dev.com/blog/2026/03/27/install-texlive-2026-rocky-linux#step-3-%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%A9%E3%83%BC%E3%81%AE%E5%AE%9F%E8%A1%8C" class="hash-link" aria-label="Step 3: インストーラーの実行 への直接リンク" title="Step 3: インストーラーの実行 への直接リンク" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-bash codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> /mnt/texlive/install-tl</span></span><br></div></code></pre></div></div>
<p>テキスト UI のインタラクティブ メニューが起動する。</p>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="主な操作キー">主な操作キー<a href="https://www.hikari-dev.com/blog/2026/03/27/install-texlive-2026-rocky-linux#%E4%B8%BB%E3%81%AA%E6%93%8D%E4%BD%9C%E3%82%AD%E3%83%BC" class="hash-link" aria-label="主な操作キー への直接リンク" title="主な操作キー への直接リンク" translate="no">​</a></h3>
<table><thead><tr><th>キー</th><th>操作</th></tr></thead><tbody><tr><td><code>S</code></td><td>インストール スキームの選択</td></tr><tr><td><code>D</code></td><td>インストール先ディレクトリの変更</td></tr><tr><td><code>I</code></td><td>インストール開始</td></tr><tr><td><code>Q</code></td><td>終了（キャンセル）</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="推奨設定">推奨設定<a href="https://www.hikari-dev.com/blog/2026/03/27/install-texlive-2026-rocky-linux#%E6%8E%A8%E5%A5%A8%E8%A8%AD%E5%AE%9A" class="hash-link" aria-label="推奨設定 への直接リンク" title="推奨設定 への直接リンク" translate="no">​</a></h3>
<ul>
<li class=""><strong>スキーム</strong>: <code>scheme-full</code>（全パッケージ。日本語 LaTeX に必要な <code>collection-langjapanese</code> が含まれる）</li>
<li class=""><strong>インストール先</strong>: <code>/usr/local/texlive/2026</code>（デフォルト）</li>
</ul>
<p>設定確認後、<code>I</code> を入力してインストールを開始する。インストールには数十分かかる。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="step-4-path-の設定">Step 4: PATH の設定<a href="https://www.hikari-dev.com/blog/2026/03/27/install-texlive-2026-rocky-linux#step-4-path-%E3%81%AE%E8%A8%AD%E5%AE%9A" class="hash-link" aria-label="Step 4: PATH の設定 への直接リンク" title="Step 4: PATH の設定 への直接リンク" translate="no">​</a></h2>
<p><code>~/.bashrc</code> に TeX Live のバイナリ パスを追加する。</p>
<div class="language-bash codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-bash codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token builtin class-name">echo</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'export PATH="/usr/local/texlive/2026/bin/x86_64-linux:$PATH"'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;&gt;</span><span class="token plain"> ~/.bashrc</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token builtin class-name">source</span><span class="token plain"> ~/.bashrc</span></span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="step-5-ロケールの修正-rhel-系">Step 5: ロケールの修正 (RHEL 系)<a href="https://www.hikari-dev.com/blog/2026/03/27/install-texlive-2026-rocky-linux#step-5-%E3%83%AD%E3%82%B1%E3%83%BC%E3%83%AB%E3%81%AE%E4%BF%AE%E6%AD%A3-rhel-%E7%B3%BB" class="hash-link" aria-label="Step 5: ロケールの修正 (RHEL 系) への直接リンク" title="Step 5: ロケールの修正 (RHEL 系) への直接リンク" translate="no">​</a></h2>
<p>RHEL 系 Linux では locale が未設定の場合、<code>lualatex</code> 実行時にエラーが発生する。以下を実行する。</p>
<div class="language-bash codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-bash codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> dnf </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-y</span><span class="token plain"> glibc-langpack-en</span></span><br></div></code></pre></div></div>
<p>また、シェル起動時に locale を設定する：</p>
<div class="language-bash codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-bash codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token builtin class-name">echo</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'export LANG=C.UTF-8'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;&gt;</span><span class="token plain"> ~/.bashrc</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token builtin class-name">source</span><span class="token plain"> ~/.bashrc</span></span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="step-6-動作確認">Step 6: 動作確認<a href="https://www.hikari-dev.com/blog/2026/03/27/install-texlive-2026-rocky-linux#step-6-%E5%8B%95%E4%BD%9C%E7%A2%BA%E8%AA%8D" class="hash-link" aria-label="Step 6: 動作確認 への直接リンク" title="Step 6: 動作確認 への直接リンク" translate="no">​</a></h2>
<p>各コマンドのバージョンを確認する:</p>
<div class="language-bash codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-bash codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">tex </span><span class="token parameter variable" style="color:#36acaa">--version</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">lualatex </span><span class="token parameter variable" style="color:#36acaa">--version</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">platex </span><span class="token parameter variable" style="color:#36acaa">--version</span></span><br></div></code></pre></div></div>
<p>期待される出力例:</p>
<div class="language-text codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-text codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">TeX 3.141592653 (TeX Live 2026)</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">LuaHBTeX, Version 1.24.0 (TeX Live 2026)</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">e-upTeX 3.141592653-p4.1.2-u2.02 (TeX Live 2026)</span></span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="step-7-日本語コンパイルのテスト">Step 7: 日本語コンパイルのテスト<a href="https://www.hikari-dev.com/blog/2026/03/27/install-texlive-2026-rocky-linux#step-7-%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E3%81%AE%E3%83%86%E3%82%B9%E3%83%88" class="hash-link" aria-label="Step 7: 日本語コンパイルのテスト への直接リンク" title="Step 7: 日本語コンパイルのテスト への直接リンク" translate="no">​</a></h2>
<p>テスト ファイルを作成する:</p>
<div class="language-bash codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-bash codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token function" style="color:#d73a49">cat</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> /tmp/test.tex </span><span class="token operator" style="color:#393A34">&lt;&lt;</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'EOF'</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token string" style="color:#e3116c">\documentclass{jlreq}</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token string" style="color:#e3116c">\begin{document}</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token string" style="color:#e3116c">日本語のテスト。TeX Live 2026 による日本語組版のサンプルです。</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token string" style="color:#e3116c">\end{document}</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token string" style="color:#e3116c">EOF</span></span><br></div></code></pre></div></div>
<p>コンパイルする:</p>
<div class="language-bash codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-bash codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token builtin class-name">cd</span><span class="token plain"> /tmp </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> lualatex test.tex</span></span><br></div></code></pre></div></div>
<p><code>test.pdf</code> が生成されれば成功である。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="step-8-後片付け任意">Step 8: 後片付け（任意）<a href="https://www.hikari-dev.com/blog/2026/03/27/install-texlive-2026-rocky-linux#step-8-%E5%BE%8C%E7%89%87%E4%BB%98%E3%81%91%E4%BB%BB%E6%84%8F" class="hash-link" aria-label="Step 8: 後片付け（任意） への直接リンク" title="Step 8: 後片付け（任意） への直接リンク" translate="no">​</a></h2>
<p>インストール完了後、ISO とマウントポイントを削除できる:</p>
<div class="language-bash codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-bash codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">umount</span><span class="token plain"> /mnt/texlive</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function" style="color:#d73a49">rm</span><span class="token plain"> ~/texlive2026.iso</span></span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="ミラーサイト一覧">ミラーサイト一覧<a href="https://www.hikari-dev.com/blog/2026/03/27/install-texlive-2026-rocky-linux#%E3%83%9F%E3%83%A9%E3%83%BC%E3%82%B5%E3%82%A4%E3%83%88%E4%B8%80%E8%A6%A7" class="hash-link" aria-label="ミラーサイト一覧 への直接リンク" title="ミラーサイト一覧 への直接リンク" translate="no">​</a></h2>
<p>ダウンロードが遅い場合は他のミラーを試す:</p>
<table><thead><tr><th>ミラー</th><th>URL</th></tr></thead><tbody><tr><td>理化学研究所（推奨）</td><td><a href="https://ftp.riken.jp/CTAN/systems/texlive/Images/" target="_blank" rel="noopener noreferrer" class="">https://ftp.riken.jp/CTAN/systems/texlive/Images/</a></td></tr><tr><td>JAIST</td><td><a href="https://ftp.jaist.ac.jp/pub/CTAN/systems/texlive/Images/" target="_blank" rel="noopener noreferrer" class="">https://ftp.jaist.ac.jp/pub/CTAN/systems/texlive/Images/</a></td></tr><tr><td>山形大学</td><td><a href="https://ftp.yz.yamagata-u.ac.jp/pub/CTAN/systems/texlive/Images/" target="_blank" rel="noopener noreferrer" class="">https://ftp.yz.yamagata-u.ac.jp/pub/CTAN/systems/texlive/Images/</a></td></tr><tr><td>CTAN ミラー</td><td><a href="https://mirror.ctan.org/systems/texlive/Images/" target="_blank" rel="noopener noreferrer" class="">https://mirror.ctan.org/systems/texlive/Images/</a></td></tr></tbody></table>]]></content:encoded>
            <category>Linux</category>
            <category>TeX</category>
            <category>LaTeX</category>
        </item>
        <item>
            <title><![CDATA[AIエージェントのスキルとは何か？仕組みをわかりやすく解説]]></title>
            <link>https://www.hikari-dev.com/blog/2026/03/26/agent-skills</link>
            <guid>https://www.hikari-dev.com/blog/2026/03/26/agent-skills</guid>
            <pubDate>Thu, 26 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[AI エージェントに「スキル」を追加すると、まるでアプリに機能拡張をインストールするように、できることを増やせます。この記事では、Agent Skills の仕組みと、エージェントが内部でどのような処理をしているかを解説します。]]></description>
            <content:encoded><![CDATA[<p>AI エージェントに「スキル」を追加すると、まるでアプリに機能拡張をインストールするように、できることを増やせます。この記事では、Agent Skills の仕組みと、エージェントが内部でどのような処理をしているかを解説します。</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="ai-エージェントとは">AI エージェントとは<a href="https://www.hikari-dev.com/blog/2026/03/26/agent-skills#ai-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%A8%E3%81%AF" class="hash-link" aria-label="AI エージェントとは への直接リンク" title="AI エージェントとは への直接リンク" translate="no">​</a></h2>
<p>まず前提として、AI エージェントとは <strong>指示を受け取り、自律的にタスクをこなすAIプログラム</strong> のことです。</p>
<p>ChatGPT のような「質問して回答をもらうだけ」の AI と違い、エージェントは次のようなことができます。</p>
<ul>
<li class="">ファイルを読み書きする</li>
<li class="">コードを実行して結果を確認する</li>
<li class="">外部 API やツールを呼び出す</li>
<li class="">複数のステップを自分で判断しながら進める</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="スキルとは">スキルとは<a href="https://www.hikari-dev.com/blog/2026/03/26/agent-skills#%E3%82%B9%E3%82%AD%E3%83%AB%E3%81%A8%E3%81%AF" class="hash-link" aria-label="スキルとは への直接リンク" title="スキルとは への直接リンク" translate="no">​</a></h2>
<p><a href="https://agentskills.io/home" target="_blank" rel="noopener noreferrer" class="">Agent Skills</a> とは、<strong>エージェントに新しい能力や専門知識を追加するための仕組み</strong> です。</p>
<p>人間に例えると、「新しい仕事のマニュアルを渡す」ようなイメージです。マニュアル (スキル) を読んだエージェントは、そのタスクをどう進めればいいか理解して動けるようになります。</p>
<div class="language-text codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-text codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">スキルなし: 「ブログを書いて」→ エージェントが何となく書く</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">スキルあり: 「ブログを書いて」→ マニュアル通りの手順で、一定品質のブログを書く</span></span><br></div></code></pre></div></div>
<p>スキルは主に Markdown ファイル (<code>SKILL.md</code>) で記述されており、以下の要素を含められます。</p>
<ul>
<li class=""><strong>手順書</strong>: 何をどの順番でするか</li>
<li class=""><strong>スクリプト</strong>: 自動化したい処理</li>
<li class=""><strong>サンプルや設定</strong>: エージェントが参照するリソース</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="なぜスキルが必要なのか">なぜスキルが必要なのか<a href="https://www.hikari-dev.com/blog/2026/03/26/agent-skills#%E3%81%AA%E3%81%9C%E3%82%B9%E3%82%AD%E3%83%AB%E3%81%8C%E5%BF%85%E8%A6%81%E3%81%AA%E3%81%AE%E3%81%8B" class="hash-link" aria-label="なぜスキルが必要なのか への直接リンク" title="なぜスキルが必要なのか への直接リンク" translate="no">​</a></h2>
<p>AIエージェントは非常に高い能力を持っていますが、<strong>あなたのプロジェクト固有の知識は持っていません</strong>。</p>
<p>たとえば、</p>
<ul>
<li class="">「このチームではコミットメッセージをどう書くか」</li>
<li class="">「このブログのフロントマターはどう書くか」</li>
<li class="">「デプロイ手順はどのコマンドを使うか」</li>
</ul>
<p>こういった情報は、スキルとして渡さないとエージェントは知ることができません。スキルがあることで、エージェントは「正しいやり方」を知った上で動けます。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="エージェントがスキルを使うときの処理の流れ">エージェントがスキルを使うときの処理の流れ<a href="https://www.hikari-dev.com/blog/2026/03/26/agent-skills#%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%8C%E3%82%B9%E3%82%AD%E3%83%AB%E3%82%92%E4%BD%BF%E3%81%86%E3%81%A8%E3%81%8D%E3%81%AE%E5%87%A6%E7%90%86%E3%81%AE%E6%B5%81%E3%82%8C" class="hash-link" aria-label="エージェントがスキルを使うときの処理の流れ への直接リンク" title="エージェントがスキルを使うときの処理の流れ への直接リンク" translate="no">​</a></h2>
<p>では、エージェントが内部でどのように動いているか見てみましょう。</p>
<!-- -->
<p>ポイントは以下の通りです。</p>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="1-スキルの読み込み">1. スキルの読み込み<a href="https://www.hikari-dev.com/blog/2026/03/26/agent-skills#1-%E3%82%B9%E3%82%AD%E3%83%AB%E3%81%AE%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF" class="hash-link" aria-label="1. スキルの読み込み への直接リンク" title="1. スキルの読み込み への直接リンク" translate="no">​</a></h3>
<p>エージェントは最初にスキルを読み込みます。スキルの内容は LLM への入力 (プロンプト) の一部として渡されます。LLM はこれを読んで「このタスクの正しいやり方」を理解します。</p>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="2-タスクの分解">2. タスクの分解<a href="https://www.hikari-dev.com/blog/2026/03/26/agent-skills#2-%E3%82%BF%E3%82%B9%E3%82%AF%E3%81%AE%E5%88%86%E8%A7%A3" class="hash-link" aria-label="2. タスクの分解 への直接リンク" title="2. タスクの分解 への直接リンク" translate="no">​</a></h3>
<p>LLM は受け取った手順をもとに、タスクを小さなステップに分解します。「まず既存記事を3件読む」「次にファイル名を決める」「フロントマターを書く」…という具合です。</p>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="3-ツールの呼び出し">3. ツールの呼び出し<a href="https://www.hikari-dev.com/blog/2026/03/26/agent-skills#3-%E3%83%84%E3%83%BC%E3%83%AB%E3%81%AE%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97" class="hash-link" aria-label="3. ツールの呼び出し への直接リンク" title="3. ツールの呼び出し への直接リンク" translate="no">​</a></h3>
<p>各ステップで必要に応じてツールを呼び出します。ファイルを読む、ウェブを検索する、コードを実行するなど、スキルが定義した手順に従って進みます。</p>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="4-結果のフィードバック">4. 結果のフィードバック<a href="https://www.hikari-dev.com/blog/2026/03/26/agent-skills#4-%E7%B5%90%E6%9E%9C%E3%81%AE%E3%83%95%E3%82%A3%E3%83%BC%E3%83%89%E3%83%90%E3%83%83%E3%82%AF" class="hash-link" aria-label="4. 結果のフィードバック への直接リンク" title="4. 結果のフィードバック への直接リンク" translate="no">​</a></h3>
<p>ツールの実行結果は再び LLM に渡されます。LLM はその結果を見て「次に何をすべきか」を判断し、タスクが完了するまでループします。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="スキルコマンド">スキルコマンド<a href="https://www.hikari-dev.com/blog/2026/03/26/agent-skills#%E3%82%B9%E3%82%AD%E3%83%AB%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89" class="hash-link" aria-label="スキルコマンド への直接リンク" title="スキルコマンド への直接リンク" translate="no">​</a></h2>
<p>スキルはスラッシュコマンド (<code>/コマンド名</code>) として呼び出せます。</p>
<p>コマンドが呼ばれると、対応する Markdown ファイルの内容がプロンプトとして展開され、エージェントがその手順を実行し始めます。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="スキルの広がり">スキルの広がり<a href="https://www.hikari-dev.com/blog/2026/03/26/agent-skills#%E3%82%B9%E3%82%AD%E3%83%AB%E3%81%AE%E5%BA%83%E3%81%8C%E3%82%8A" class="hash-link" aria-label="スキルの広がり への直接リンク" title="スキルの広がり への直接リンク" translate="no">​</a></h2>
<p>Agent Skills のフォーマットは <a href="https://agentskills.io/home" target="_blank" rel="noopener noreferrer" class="">Anthropic が開発しオープン化したもの</a> で、現在は多くのツールに対応しています。</p>
<table><thead><tr><th>ツール</th><th>対応</th></tr></thead><tbody><tr><td>Claude Code</td><td>✅</td></tr><tr><td>GitHub Copilot</td><td>✅</td></tr><tr><td>Cursor</td><td>✅</td></tr><tr><td>Gemini CLI</td><td>✅</td></tr><tr><td>OpenAI Codex</td><td>✅</td></tr><tr><td>VS Code</td><td>✅</td></tr></tbody></table>
<p>同じスキルを複数のツールで使い回せるのが大きな利点です。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="まとめ">まとめ<a href="https://www.hikari-dev.com/blog/2026/03/26/agent-skills#%E3%81%BE%E3%81%A8%E3%82%81" class="hash-link" aria-label="まとめ への直接リンク" title="まとめ への直接リンク" translate="no">​</a></h2>
<ul>
<li class=""><strong>スキル</strong>は、エージェントに専門知識や手順を渡すための仕組みです</li>
<li class="">Markdown ファイル (<code>SKILL.md</code>) に手順やルールを書くだけで作れます</li>
<li class="">エージェントはスキルをプロンプトとして受け取り、LLM がそれを解釈してステップごとに実行します</li>
<li class="">Claude Code、Cursor、GitHub Copilot など多くのツールで共通して使えるオープンな標準フォーマットです</li>
</ul>
<p>スキルを活用することで、「AIに毎回同じことを説明する」手間がなくなり、エージェントが一貫した品質でタスクをこなせるようになります。</p>]]></content:encoded>
            <category>AI</category>
            <category>Claude</category>
        </item>
        <item>
            <title><![CDATA[AWS サーバーレスでブログのコメント API を自作した]]></title>
            <link>https://www.hikari-dev.com/blog/2026/03/21/blog-comment-service</link>
            <guid>https://www.hikari-dev.com/blog/2026/03/21/blog-comment-service</guid>
            <pubDate>Sat, 21 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[このブログにコメント機能を追加したくなり、AWS サーバーレスで API を自作しました。その設計と実装について紹介します。]]></description>
            <content:encoded><![CDATA[<p>このブログにコメント機能を追加したくなり、AWS サーバーレスで API を自作しました。その設計と実装について紹介します。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="構成">構成<a href="https://www.hikari-dev.com/blog/2026/03/21/blog-comment-service#%E6%A7%8B%E6%88%90" class="hash-link" aria-label="構成 への直接リンク" title="構成 への直接リンク" translate="no">​</a></h2>
<p>リクエストは以下の流れで処理されます。</p>
<div class="language-text codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-text codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">ブラウザ (www.hikari-dev.com)</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  ↓ HTTPS</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">API Gateway</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  ├── GET  /comment?postId=...    → コメント取得</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  ├── POST /comment               → コメント投稿</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  └── PATCH /comment/{id}         → 管理（非表示切り替え）</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  ↓</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">Lambda (Node.js 20 / arm64)</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  ↓</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">DynamoDB（コメント保存）</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  + SES v2（管理者へのメール通知）</span></span><br></div></code></pre></div></div>
<p>コードは TypeScript で書き、SAM（Serverless Application Model）で IaC 管理しています。Lambda は arm64（Graviton2）にして少しコストを抑えています。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="dynamodb-のテーブル設計">DynamoDB のテーブル設計<a href="https://www.hikari-dev.com/blog/2026/03/21/blog-comment-service#dynamodb-%E3%81%AE%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E8%A8%AD%E8%A8%88" class="hash-link" aria-label="DynamoDB のテーブル設計 への直接リンク" title="DynamoDB のテーブル設計 への直接リンク" translate="no">​</a></h2>
<p>テーブル名は <code>blog-comments</code>、パーティションキーは <code>postId</code>、ソートキーは <code>commentId</code> です。</p>
<table><thead><tr><th>キー</th><th>型</th><th>説明</th></tr></thead><tbody><tr><td><code>postId</code></td><td>String</td><td>記事の識別子（例: <code>/blog/2026/03/20/hime</code>）</td></tr><tr><td><code>commentId</code></td><td>String</td><td>ULID（時系列ソート可能な ID）</td></tr></tbody></table>
<p>ソートキーに ULID を使っているので、<code>QueryCommand</code> で取得したコメントは投稿順に自動的に並びます。UUID にしなかったのはこの理由です。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="スパムフィルタリング">スパムフィルタリング<a href="https://www.hikari-dev.com/blog/2026/03/21/blog-comment-service#%E3%82%B9%E3%83%91%E3%83%A0%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0" class="hash-link" aria-label="スパムフィルタリング への直接リンク" title="スパムフィルタリング への直接リンク" translate="no">​</a></h2>
<p>コメントを DynamoDB に書き込む前に、<code>keywords.json</code> に定義したキーワードと照合します。</p>
<p>キーワードにヒットした場合は <code>isHidden: true</code> で自動非表示にし、<code>isFlagged: "1"</code> を付与します。ヒットしなければ即時公開です。</p>
<p><code>isFlagged</code> は Sparse GSI のキーとして使っています。ヒットしないコメントにはこの属性を持たせないため、GSI に余計なパーティションが増えず、コストと効率の両面で有利です。DynamoDB Document Client の <code>removeUndefinedValues: true</code> を設定するだけで実現できます。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="管理者へのメール通知">管理者へのメール通知<a href="https://www.hikari-dev.com/blog/2026/03/21/blog-comment-service#%E7%AE%A1%E7%90%86%E8%80%85%E3%81%B8%E3%81%AE%E3%83%A1%E3%83%BC%E3%83%AB%E9%80%9A%E7%9F%A5" class="hash-link" aria-label="管理者へのメール通知 への直接リンク" title="管理者へのメール通知 への直接リンク" translate="no">​</a></h2>
<p>コメントが投稿されるたびに SES v2 で自分宛にメールが届きます。本文には投稿者名、本文、評価、IP アドレス、フラグ状態が含まれます。</p>
<p>メール送信は非同期で行い、失敗しても握りつぶします。コメント投稿のレスポンス速度に影響しないようにするためです。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="プライバシーへの配慮">プライバシーへの配慮<a href="https://www.hikari-dev.com/blog/2026/03/21/blog-comment-service#%E3%83%97%E3%83%A9%E3%82%A4%E3%83%90%E3%82%B7%E3%83%BC%E3%81%B8%E3%81%AE%E9%85%8D%E6%85%AE" class="hash-link" aria-label="プライバシーへの配慮 への直接リンク" title="プライバシーへの配慮 への直接リンク" translate="no">​</a></h2>
<p>DynamoDB には IP アドレスや User-Agent も保存しますが、GET エンドポイントのレスポンスには含めません。型定義レベルで分離しています。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="セキュリティ">セキュリティ<a href="https://www.hikari-dev.com/blog/2026/03/21/blog-comment-service#%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3" class="hash-link" aria-label="セキュリティ への直接リンク" title="セキュリティ への直接リンク" translate="no">​</a></h2>
<table><thead><tr><th>層</th><th>対策</th></tr></thead><tbody><tr><td>ネットワーク</td><td>AWS WAF で 100 req / 5 分 / IP のレート制限</td></tr><tr><td>CORS</td><td><code>https://www.hikari-dev.com</code> のみ許可</td></tr><tr><td>管理 API</td><td>API Gateway の API キー認証（<code>X-Api-Key</code> ヘッダー）</td></tr><tr><td>スパム</td><td>キーワードフィルタで自動非表示</td></tr></tbody></table>
<p>管理エンドポイント（<code>PATCH /comment/{id}</code>）は SAM テンプレートで <code>ApiKeyRequired: true</code> を設定するだけで API キー認証が有効になります。Lambda Authorizer を自前で実装する必要がなく、シンプルです。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="まとめ">まとめ<a href="https://www.hikari-dev.com/blog/2026/03/21/blog-comment-service#%E3%81%BE%E3%81%A8%E3%82%81" class="hash-link" aria-label="まとめ への直接リンク" title="まとめ への直接リンク" translate="no">​</a></h2>
<p>サーバーレス構成なのでサーバー管理も不要で、DynamoDB のオンデマンド課金により低トラフィックな個人ブログでもコストを最小限に抑えられています。</p>
<p>コードは SAM + TypeScript + esbuild でまとめており、<code>sam build &amp;&amp; sam deploy</code> だけでデプロイできます。</p>]]></content:encoded>
            <category>AWS</category>
            <category>Web</category>
        </item>
        <item>
            <title><![CDATA[複数の生成 AI エージェントを利用可能なチャットの VSCode 拡張機能 Hime を作成]]></title>
            <link>https://www.hikari-dev.com/blog/2026/03/20/hime</link>
            <guid>https://www.hikari-dev.com/blog/2026/03/20/hime</guid>
            <pubDate>Fri, 20 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[複数の AI プロバイダーとチャットできる VSCode 拡張機能 Hime (HikariMessage) を作りました。]]></description>
            <content:encoded><![CDATA[<p>複数の AI プロバイダーとチャットできる VSCode 拡張機能 <strong>Hime (HikariMessage)</strong> を作りました。</p>
<p>BYOK であり、各 API プロバイダーの API キーがあれば利用可能です。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="hime-とは">Hime とは<a href="https://www.hikari-dev.com/blog/2026/03/20/hime#hime-%E3%81%A8%E3%81%AF" class="hash-link" aria-label="Hime とは への直接リンク" title="Hime とは への直接リンク" translate="no">​</a></h2>
<p><a href="https://github.com/Himeyama/hime" target="_blank" rel="noopener noreferrer" class="">Hime</a> は、VSCode のサイドバーに組み込む生成 AI チャット拡張機能です。Anthropic、OpenAI、Azure OpenAI、OpenRouter、Ollama に対応しており、ドロップダウンメニューで簡単にプロバイダーを切り替えられます。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="主な機能">主な機能<a href="https://www.hikari-dev.com/blog/2026/03/20/hime#%E4%B8%BB%E3%81%AA%E6%A9%9F%E8%83%BD" class="hash-link" aria-label="主な機能 への直接リンク" title="主な機能 への直接リンク" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="複数の-ai-プロバイダーに対応">複数の AI プロバイダーに対応<a href="https://www.hikari-dev.com/blog/2026/03/20/hime#%E8%A4%87%E6%95%B0%E3%81%AE-ai-%E3%83%97%E3%83%AD%E3%83%90%E3%82%A4%E3%83%80%E3%83%BC%E3%81%AB%E5%AF%BE%E5%BF%9C" class="hash-link" aria-label="複数の AI プロバイダーに対応 への直接リンク" title="複数の AI プロバイダーに対応 への直接リンク" translate="no">​</a></h3>
<p>以下のプロバイダーをサポートしています。</p>
<ul>
<li class="">Anthropic (Claude)</li>
<li class="">OpenAI</li>
<li class="">Azure OpenAI</li>
<li class="">OpenRouter</li>
<li class="">Ollama</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="ストリーミング表示">ストリーミング表示<a href="https://www.hikari-dev.com/blog/2026/03/20/hime#%E3%82%B9%E3%83%88%E3%83%AA%E3%83%BC%E3%83%9F%E3%83%B3%E3%82%B0%E8%A1%A8%E7%A4%BA" class="hash-link" aria-label="ストリーミング表示 への直接リンク" title="ストリーミング表示 への直接リンク" translate="no">​</a></h3>
<p>リアルタイムで応答が表示されるため、長い回答でも待ち時間を感じにくくなっています。</p>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="mcp">MCP<a href="https://www.hikari-dev.com/blog/2026/03/20/hime#mcp" class="hash-link" aria-label="MCP への直接リンク" title="MCP への直接リンク" translate="no">​</a></h3>
<p>設定で以下のように JSON 形式で設定を行うことで MCP が利用可能です。</p>
<blockquote>
<p>例</p>
</blockquote>
<div class="language-json codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-json codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"filesystem"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"command"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"npx"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"args"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"-y"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"@modelcontextprotocol/server-filesystem"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"C:\\Users"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span></span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="リッチな-ui">リッチな UI<a href="https://www.hikari-dev.com/blog/2026/03/20/hime#%E3%83%AA%E3%83%83%E3%83%81%E3%81%AA-ui" class="hash-link" aria-label="リッチな UI への直接リンク" title="リッチな UI への直接リンク" translate="no">​</a></h3>
<ul>
<li class="">Markdown レンダリング</li>
<li class="">コードブロックのシンタックスハイライト</li>
<li class="">コードブロックのコピーボタン</li>
<li class="">MCP の出力結果表示</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="チャット履歴の永続化">チャット履歴の永続化<a href="https://www.hikari-dev.com/blog/2026/03/20/hime#%E3%83%81%E3%83%A3%E3%83%83%E3%83%88%E5%B1%A5%E6%AD%B4%E3%81%AE%E6%B0%B8%E7%B6%9A%E5%8C%96" class="hash-link" aria-label="チャット履歴の永続化 への直接リンク" title="チャット履歴の永続化 への直接リンク" translate="no">​</a></h3>
<p>会話履歴は <code>~/.hime/chats/</code> に JSON 形式で保存されます。VSCode を再起動しても続きから会話できます。</p>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="自動システムプロンプト">自動システムプロンプト<a href="https://www.hikari-dev.com/blog/2026/03/20/hime#%E8%87%AA%E5%8B%95%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88" class="hash-link" aria-label="自動システムプロンプト への直接リンク" title="自動システムプロンプト への直接リンク" translate="no">​</a></h3>
<p>ワークスペースの情報、OS の情報、現在開いているエディタのコンテキストが自動的にシステムプロンプトに含まれます。「このファイルを直して」と言うだけで、どのファイルを見ているかを AI が把握してくれます。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="セットアップ">セットアップ<a href="https://www.hikari-dev.com/blog/2026/03/20/hime#%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97" class="hash-link" aria-label="セットアップ への直接リンク" title="セットアップ への直接リンク" translate="no">​</a></h2>
<p>Node.js 20 以上と VSCode 1.96 以上が必要です。</p>
<div class="language-bash codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-bash codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token function" style="color:#d73a49">git</span><span class="token plain"> clone https://github.com/Himeyama/hime</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token builtin class-name">cd</span><span class="token plain"> hime</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function" style="color:#d73a49">npm</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token function" style="color:#d73a49">npm</span><span class="token plain"> run </span><span class="token function" style="color:#d73a49">watch</span><span class="token plain">   </span><span class="token comment" style="color:#999988;font-style:italic"># 開発時: Extension Host と Webview を同時監視</span></span><br></div></code></pre></div></div>
<p>その後、VSCode で F5 を押すと拡張機能ホストが起動します。API キーはサイドバーの設定パネルから入力でき、VSCode の SecretStorage で暗号化されて保存されます。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="まとめ">まとめ<a href="https://www.hikari-dev.com/blog/2026/03/20/hime#%E3%81%BE%E3%81%A8%E3%82%81" class="hash-link" aria-label="まとめ への直接リンク" title="まとめ への直接リンク" translate="no">​</a></h2>
<p>エディタを離れずに AI と対話でき、しかも MCP でツール実行まで任せられるのが Hime の強みです。ぜひ試してみてください。</p>
<p>リポジトリ: <a href="https://github.com/Himeyama/hime" target="_blank" rel="noopener noreferrer" class="">https://github.com/Himeyama/hime</a></p>]]></content:encoded>
            <category>VoiceVox</category>
        </item>
        <item>
            <title><![CDATA[AWS サーバーレスでクラウドストレージを作った]]></title>
            <link>https://www.hikari-dev.com/blog/2026/03/18/storage</link>
            <guid>https://www.hikari-dev.com/blog/2026/03/18/storage</guid>
            <pubDate>Wed, 18 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[はじめに]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="はじめに">はじめに<a href="https://www.hikari-dev.com/blog/2026/03/18/storage#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB" class="hash-link" aria-label="はじめに への直接リンク" title="はじめに への直接リンク" translate="no">​</a></h2>
<p>自分専用のファイル共有システムが欲しいと思い、AWS のサーバーレスサービスだけでファイルストレージサービスを作りました。</p>
<p>この記事では、設計で意識したポイントと、実際のアーキテクチャを紹介します。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="何を作ったか">何を作ったか<a href="https://www.hikari-dev.com/blog/2026/03/18/storage#%E4%BD%95%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%9F%E3%81%8B" class="hash-link" aria-label="何を作ったか への直接リンク" title="何を作ったか への直接リンク" translate="no">​</a></h2>
<p>制作した Web システムは、Web ブラウザからファイルのアップロード・ダウンロード・フォルダ管理ができるクラウドストレージサービスです。</p>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="主な機能">主な機能<a href="https://www.hikari-dev.com/blog/2026/03/18/storage#%E4%B8%BB%E3%81%AA%E6%A9%9F%E8%83%BD" class="hash-link" aria-label="主な機能 への直接リンク" title="主な機能 への直接リンク" translate="no">​</a></h3>
<ul>
<li class="">ファイルのアップロード / ダウンロード</li>
<li class="">フォルダの作成・階層管理</li>
<li class="">複数ファイル / フォルダの一括 ZIP ダウンロード</li>
<li class="">ユーザー認証（サインアップ・ログイン・パスワードリセット）</li>
<li class="">ユーザープロフィール管理</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="アーキテクチャ">アーキテクチャ<a href="https://www.hikari-dev.com/blog/2026/03/18/storage#%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3" class="hash-link" aria-label="アーキテクチャ への直接リンク" title="アーキテクチャ への直接リンク" translate="no">​</a></h2>
<p>以下、構成図です。</p>
<p><img decoding="async" loading="lazy" src="https://www.hikari-dev.com/assets/images/structure.drawio-ebc5ae4a7d9232039795235391695759.png" width="1204" height="858" class="img_y1Im"></p>
<p>認証の大部分は Cognito で行い、
ファイル転送は S3 の Presigned URL を Lambda で発行してクライアントと S3 が直接やり取りする仕組みです。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="技術スタック">技術スタック<a href="https://www.hikari-dev.com/blog/2026/03/18/storage#%E6%8A%80%E8%A1%93%E3%82%B9%E3%82%BF%E3%83%83%E3%82%AF" class="hash-link" aria-label="技術スタック への直接リンク" title="技術スタック への直接リンク" translate="no">​</a></h2>
<table><thead><tr><th>レイヤー</th><th>技術</th></tr></thead><tbody><tr><td>バックエンド</td><td>C# (.NET 8) / AWS Lambda</td></tr><tr><td>認証</td><td>Amazon Cognito + Managed Login v2</td></tr><tr><td>API</td><td>API Gateway (REST) + Cognito Authorizer</td></tr><tr><td>ストレージ</td><td>Amazon S3</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="設計判断とその理由">設計判断とその理由<a href="https://www.hikari-dev.com/blog/2026/03/18/storage#%E8%A8%AD%E8%A8%88%E5%88%A4%E6%96%AD%E3%81%A8%E3%81%9D%E3%81%AE%E7%90%86%E7%94%B1" class="hash-link" aria-label="設計判断とその理由 への直接リンク" title="設計判断とその理由 への直接リンク" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="認証を-cognito-で行う">認証を Cognito で行う<a href="https://www.hikari-dev.com/blog/2026/03/18/storage#%E8%AA%8D%E8%A8%BC%E3%82%92-cognito-%E3%81%A7%E8%A1%8C%E3%81%86" class="hash-link" aria-label="認証を Cognito で行う への直接リンク" title="認証を Cognito で行う への直接リンク" translate="no">​</a></h3>
<p>Cognito の OAuth 2.0 エンドポイントと Managed Login を活用し、認証機能を実現しました。</p>
<p>最終的に認証系の Lambda は <code>TokenFunction</code> 1 つだけになりました。</p>
<p>機能的にもセキュリティ的にも減らせるコードは減らすのが吉です。</p>
<p>AWS のサービスがやってくれることを自前で書く必要はありません。</p>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="presigned-url-によるファイル転送">Presigned URL によるファイル転送<a href="https://www.hikari-dev.com/blog/2026/03/18/storage#presigned-url-%E3%81%AB%E3%82%88%E3%82%8B%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E8%BB%A2%E9%80%81" class="hash-link" aria-label="Presigned URL によるファイル転送 への直接リンク" title="Presigned URL によるファイル転送 への直接リンク" translate="no">​</a></h3>
<p>ファイルのアップロード・ダウンロードで Lambda を経由すると、いくつかの問題が生じます：</p>
<ul>
<li class="">Lambda のペイロード上限に引っかかる</li>
<li class="">大きなファイルを Lambda のメモリに載せるとコストがかかる</li>
<li class="">転送時間が Lambda の実行時間としてカウントされる</li>
</ul>
<p>Presigned URL なら、Lambda は URL を発行するだけで、実際のファイル転送はブラウザと S3 が直接行います。</p>
<p>Lambda の実行時間は数十ミリ秒で済み、ファイルサイズの制約も S3 の上限までとなります。</p>
<div class="language-text codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-text codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">アップロードの流れ:</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">1. ブラウザ → Lambda: 「file.pdf をアップロードしたい！アップロード先の URL を送れ～」</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">2. Lambda → ブラウザ: 「アップロード先の Presigned URL だよ。ここに PUT してね～」</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">3. ブラウザ → S3: 「S3 に PUT するよ～」</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">4. ブラウザ → Lambda: 「アップロード完了したよ～」</span></span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="4-フォルダの-zip-ダウンロード">4. フォルダの ZIP ダウンロード<a href="https://www.hikari-dev.com/blog/2026/03/18/storage#4-%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%81%AE-zip-%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89" class="hash-link" aria-label="4. フォルダの ZIP ダウンロード への直接リンク" title="4. フォルダの ZIP ダウンロード への直接リンク" translate="no">​</a></h3>
<p>S3 にはフォルダごとダウンロードする機能がありません。</p>
<p>複数ファイルの一括ダウンロードは、Lambda 上で ZIP を生成して一時的に S3 に置き、その Presigned URL を返す方式にしました。</p>
<p>一時 ZIP ファイルは S3 のライフサイクルルールで 1 日後に自動削除されるので、ゴミが溜まることはありません。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="セキュリティ">セキュリティ<a href="https://www.hikari-dev.com/blog/2026/03/18/storage#%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3" class="hash-link" aria-label="セキュリティ への直接リンク" title="セキュリティ への直接リンク" translate="no">​</a></h2>
<table><thead><tr><th>対策</th><th>実装</th></tr></thead><tbody><tr><td>ブルートフォース防止</td><td>Cognito 標準のロック機能 (5 回失敗: 15 分ロック)</td></tr><tr><td>API 保護</td><td>Cognito Authorizer による JWT 検証</td></tr><tr><td>CORS</td><td><code>AllowedOrigin</code> を特定のドメインに限定</td></tr><tr><td>一時ファイル管理</td><td>S3 ライフサイクルで不要なファイルを 1 日で自動削除</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="コスト">コスト<a href="https://www.hikari-dev.com/blog/2026/03/18/storage#%E3%82%B3%E3%82%B9%E3%83%88" class="hash-link" aria-label="コスト への直接リンク" title="コスト への直接リンク" translate="no">​</a></h2>
<p>サーバーレス構成なので、利用がなければコストはほぼゼロです。</p>
<ul>
<li class=""><strong>Cognito</strong>: ESSENTIALS Tier は MAU 10,000 まで無料</li>
<li class=""><strong>Lambda</strong>: 月 100 万リクエストまで無料</li>
<li class=""><strong>S3</strong>: 保存量に応じた従量課金（GB あたり約 $0.025/月）</li>
<li class=""><strong>API Gateway</strong>: 100 万リクエストあたり $3.50</li>
</ul>
<p>個人利用なら月額数十円〜数百円程度に収まります。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="インフラのコード化">インフラのコード化<a href="https://www.hikari-dev.com/blog/2026/03/18/storage#%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E5%8C%96" class="hash-link" aria-label="インフラのコード化 への直接リンク" title="インフラのコード化 への直接リンク" translate="no">​</a></h2>
<p>インフラ全体を 1 つの <code>template.yaml</code> (AWS SAM) で定義しています。</p>
<p>Cognito User Pool、API Gateway、Lambda 3 関数、S3 バケット、CloudWatch アラーム、SNS — すべてのリソースを 600 行程度の YAML で定義しています。</p>]]></content:encoded>
            <category>AWS</category>
            <category>Hardware</category>
        </item>
        <item>
            <title><![CDATA[WSL2 に Rocky Linux 8.10 をインストールする]]></title>
            <link>https://www.hikari-dev.com/blog/2026/02/11/wsl-rocky8</link>
            <guid>https://www.hikari-dev.com/blog/2026/02/11/wsl-rocky8</guid>
            <pubDate>Wed, 11 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[WSL 2 イメージのダウンロード]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="wsl-2-イメージのダウンロード">WSL 2 イメージのダウンロード<a href="https://www.hikari-dev.com/blog/2026/02/11/wsl-rocky8#wsl-2-%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%81%AE%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89" class="hash-link" aria-label="WSL 2 イメージのダウンロード への直接リンク" title="WSL 2 イメージのダウンロード への直接リンク" translate="no">​</a></h2>
<p><a href="https://dl.rockylinux.org/pub/rocky/8/images/x86_64/Rocky-8-Container-Base.latest.x86_64.tar.xz" target="_blank" rel="noopener noreferrer" class="">https://dl.rockylinux.org/pub/rocky/8/images/x86_64/Rocky-8-Container-Base.latest.x86_64.tar.xz</a></p>
<p>ここからダウンロードする。</p>
<p>参考: <a href="https://docs.rockylinux.org/8/guides/interoperability/import_rocky_to_wsl/" target="_blank" rel="noopener noreferrer" class="">https://docs.rockylinux.org/8/guides/interoperability/import_rocky_to_wsl/</a></p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="イメージを展開">イメージを展開<a href="https://www.hikari-dev.com/blog/2026/02/11/wsl-rocky8#%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%82%92%E5%B1%95%E9%96%8B" class="hash-link" aria-label="イメージを展開 への直接リンク" title="イメージを展開 への直接リンク" translate="no">​</a></h2>
<p>tar.xz を展開し、tar 形式にする。
tar にすることで、WSL2 へのインポートが可能となる。</p>
<div class="language-ps1 codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-ps1 codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">cd ~/Downloads</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">xz -d Rocky-8-Container-Base.latest.x86_64.tar.xz</span></span><br></div></code></pre></div></div>
<p>※Windows にインストール済みの bsdtar では展開不可。
※xz コマンドがない場合は、cygwin64 でインストールするか、別の WSL ディストリビューションを用いて展開する。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="イメージのインポート">イメージのインポート<a href="https://www.hikari-dev.com/blog/2026/02/11/wsl-rocky8#%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%81%AE%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88" class="hash-link" aria-label="イメージのインポート への直接リンク" title="イメージのインポート への直接リンク" translate="no">​</a></h2>
<p>WSL2 にイメージをインポートする。</p>
<div class="language-ps1 codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-ps1 codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">wsl --import RockyLinux-8.10 $HOME .\Rocky-8-Container-Base.latest.x86_64.tar --version 2</span></span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="イメージの確認">イメージの確認<a href="https://www.hikari-dev.com/blog/2026/02/11/wsl-rocky8#%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%81%AE%E7%A2%BA%E8%AA%8D" class="hash-link" aria-label="イメージの確認 への直接リンク" title="イメージの確認 への直接リンク" translate="no">​</a></h2>
<div class="language-ps1 codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-ps1 codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">wsl -l -v</span></span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="ユーザーの追加とデフォルトユーザーの設定">ユーザーの追加とデフォルトユーザーの設定<a href="https://www.hikari-dev.com/blog/2026/02/11/wsl-rocky8#%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%AE%E8%BF%BD%E5%8A%A0%E3%81%A8%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%AE%E8%A8%AD%E5%AE%9A" class="hash-link" aria-label="ユーザーの追加とデフォルトユーザーの設定 への直接リンク" title="ユーザーの追加とデフォルトユーザーの設定 への直接リンク" translate="no">​</a></h2>
<blockquote>
<p>ユーザー名: hikari の場合</p>
<div class="language-ps1 codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-ps1 codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">wsl -d RockyLinux-8.10 -u root -- dnf install sudo passwd -y</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">wsl -d RockyLinux-8.10 -u root -- adduser hikari</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">wsl -d RockyLinux-8.10 -u root -- passwd -d hikari</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">wsl -d RockyLinux-8.10 -u root -- usermod -aG wheel hikari</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">wsl -d RockyLinux-8.10 -u root -- sed -i 's/^# %wheel/%wheel/' /etc/sudoers</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">wsl -d RockyLinux-8.10 -u root -- echo -e "[user]\\ndefault=hikari" `| tee -a /etc/wsl.conf</span></span><br></div></code></pre></div></div>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="イメージの起動">イメージの起動<a href="https://www.hikari-dev.com/blog/2026/02/11/wsl-rocky8#%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%81%AE%E8%B5%B7%E5%8B%95" class="hash-link" aria-label="イメージの起動 への直接リンク" title="イメージの起動 への直接リンク" translate="no">​</a></h2>
<div class="language-ps1 codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-ps1 codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">wsl -d RockyLinux-8.10</span></span><br></div></code></pre></div></div>]]></content:encoded>
            <category>Linux</category>
            <category>WSL</category>
        </item>
        <item>
            <title><![CDATA[最強の圧縮方式について調査]]></title>
            <link>https://www.hikari-dev.com/blog/2026/01/17/x</link>
            <guid>https://www.hikari-dev.com/blog/2026/01/17/x</guid>
            <pubDate>Sat, 17 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[結論]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="結論">結論<a href="https://www.hikari-dev.com/blog/2026/01/17/x#%E7%B5%90%E8%AB%96" class="hash-link" aria-label="結論 への直接リンク" title="結論 への直接リンク" translate="no">​</a></h2>
<p>結論から。</p>
<p>合計 34 GiB の大量のファイルを圧縮・展開したときの時間とサイズを調べた。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="圧縮アーカイブ作成">圧縮・アーカイブ作成<a href="https://www.hikari-dev.com/blog/2026/01/17/x#%E5%9C%A7%E7%B8%AE%E3%82%A2%E3%83%BC%E3%82%AB%E3%82%A4%E3%83%96%E4%BD%9C%E6%88%90" class="hash-link" aria-label="圧縮・アーカイブ作成 への直接リンク" title="圧縮・アーカイブ作成 への直接リンク" translate="no">​</a></h2>
<table><thead><tr><th>方式</th><th>コマンド</th><th>real</th><th>user</th><th>sys</th><th>圧縮後のサイズ</th></tr></thead><tbody><tr><td><strong>tar</strong></td><td><code>tar cf large-pkg.tar large-pkg</code></td><td>1m19.449s</td><td>0m6.702s</td><td>0m48.121s</td><td>26 GiB</td></tr><tr><td><strong>tar.gz</strong></td><td><code>tar czf large-pkg.tar.gz large-pkg</code></td><td>11m33.942s</td><td>11m18.811s</td><td>0m55.573s</td><td>5.5 GiB</td></tr><tr><td><strong>LZ4</strong></td><td><code>tar cf - large-pkg | lz4 &gt; large-pkg.tar.lz4</code></td><td>3m33.187s</td><td>0m53.958s</td><td>2m57.122s</td><td>8.6 GiB</td></tr><tr><td><strong>zstd</strong></td><td><code>tar cf - large-pkg | zstd -T0 -o large-pkg.tar.zst</code></td><td>9m13.819s</td><td>1m45.049s</td><td>2m43.609s</td><td>4.8 GiB</td></tr><tr><td><strong>bzip2</strong></td><td><code>tar cf - large-pkg.1 | bzip2 &gt; large-pkg.tar.bz2</code></td><td>37m22.743s</td><td>28m40.329s</td><td>3m31.000s</td><td>4.3 GiB</td></tr><tr><td><strong>xz</strong></td><td><code>tar cf - large-pkg | xz &gt; large-pkg.tar.xz</code></td><td>125m31.447s</td><td>124m10.523s</td><td>5m18.330s</td><td>3.3 GiB</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="展開-解凍">展開 (解凍)<a href="https://www.hikari-dev.com/blog/2026/01/17/x#%E5%B1%95%E9%96%8B-%E8%A7%A3%E5%87%8D" class="hash-link" aria-label="展開 (解凍) への直接リンク" title="展開 (解凍) への直接リンク" translate="no">​</a></h2>
<table><thead><tr><th>方式</th><th>コマンド</th><th>real</th><th>user</th><th>sys</th></tr></thead><tbody><tr><td><strong>tar</strong></td><td><code>tar xf large-pkg.tar</code></td><td>2m11.793s</td><td>0m6.906s</td><td>2m4.183s</td></tr><tr><td><strong>tar.gz</strong></td><td><code>tar xf large-pkg.tar.gz</code></td><td>3m39.544s</td><td>2m1.189s</td><td>2m58.317s</td></tr><tr><td><strong>tar.gz（gzip）</strong></td><td><code>gzip -dc large-pkg.tar.gz | tar xf -</code></td><td>3m40.416s</td><td>2m0.272s</td><td>3m0.043s</td></tr><tr><td><strong>tar.gz（pigz）</strong></td><td><code>pigz -dc large-pkg.tar.gz | tar xf -</code></td><td>3m53.711s</td><td>1m38.147s</td><td>4m42.893s</td></tr><tr><td><strong>LZ4</strong></td><td><code>lz4 -dc large-pkg.tar.lz4 | tar xf -</code></td><td>4m46.576s</td><td>0m32.174s</td><td>4m36.055s</td></tr><tr><td><strong>zstd</strong></td><td><code>zstd -dc large-pkg.tar.zst | tar xf -</code></td><td>3m46.419s</td><td>0m46.533s</td><td>3m34.668s</td></tr><tr><td><strong>bzip2</strong></td><td><code>bzip2 -dc large-pkg.tar.bz2 | tar xf -</code></td><td>11m31.287s</td><td>9m52.644s</td><td>4m17.974s</td></tr><tr><td><strong>xz</strong></td><td><code>xz -dc large-pkg.tar.xz | tar xf -</code></td><td>8m11.527s</td><td>3m45.562s</td><td>7m15.109s</td></tr></tbody></table>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="小さく大量のファイルを用意">小さく大量のファイルを用意<a href="https://www.hikari-dev.com/blog/2026/01/17/x#%E5%B0%8F%E3%81%95%E3%81%8F%E5%A4%A7%E9%87%8F%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E7%94%A8%E6%84%8F" class="hash-link" aria-label="小さく大量のファイルを用意 への直接リンク" title="小さく大量のファイルを用意 への直接リンク" translate="no">​</a></h2>
<p>まず、小さく大量のファイルとして、node_modules を用いることとした。</p>
<p><code>package.json</code> を以下のようにした。パッケージは適当なもの。</p>
<details class="details_rvcR alert alert--info details_Kt6x" data-collapsed="true"><summary>package.json</summary><div><div class="collapsibleContent_IDV4"><div class="language-js codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-js codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token string-property property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"large-pkg"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token string-property property" style="color:#36acaa">"version"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"1.0.0"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token string-property property" style="color:#36acaa">"description"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token string-property property" style="color:#36acaa">"author"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token string-property property" style="color:#36acaa">"type"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"commonjs"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token string-property property" style="color:#36acaa">"main"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"index.js"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token string-property property" style="color:#36acaa">"scripts"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"test"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"echo \"Error: no test specified\" &amp;&amp; exit 1"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token string-property property" style="color:#36acaa">"dependencies"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"async"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^3.2.6"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"axios"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^1.13.2"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"bcryptjs"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^3.0.3"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"bluebird"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^3.7.2"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"body-parser"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^2.2.2"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"chalk"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^5.6.2"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"chalk-template"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^1.1.2"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"cheerio"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^1.1.2"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"chokidar"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^5.0.0"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"commander"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^14.0.2"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"cookie"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^1.1.1"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"core-js"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^3.47.0"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"cors"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^2.8.5"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"debug"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^4.4.3"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"dotenv"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^17.2.3"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"express"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^5.2.1"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"fast-glob"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^3.3.3"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"form-data"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^4.0.5"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"glob"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^13.0.0"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"got"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^14.6.6"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"inquirer"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^13.2.0"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"jsonwebtoken"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^9.0.3"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"lodash"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^4.17.21"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"mime"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^4.1.0"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"minimist"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^1.2.8"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"mkdirp"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^3.0.1"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"mkdirp-classic"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^0.5.3"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"mongoose"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^9.1.4"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"ms"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^2.1.3"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"node-fetch"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^3.3.2"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"ora"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^9.0.0"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"passport"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^0.7.0"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"prop-types"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^15.8.1"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"qs"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^6.14.1"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"react"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^19.2.3"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"react-dom"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^19.2.3"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"request"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^2.88.2"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"rimraf"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^6.1.2"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"semver"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^7.7.3"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"sharp"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^0.34.5"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"socket.io"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^4.8.3"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"supports-color"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^10.2.2"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"tslib"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^2.8.1"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"uuid"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^13.0.0"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"ws"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^8.19.0"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"xml2js"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^0.6.2"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"yargs"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^18.0.0"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token string-property property" style="color:#36acaa">"devDependencies"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"@babel/cli"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^7.28.6"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"@babel/plugin-transform-runtime"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^7.28.5"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"@babel/preset-env"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^7.28.6"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"@babel/runtime"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^7.28.6"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"autoprefixer"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^10.4.23"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"ava"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^6.4.1"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"babel-core"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^6.26.3"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"babel-loader"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^10.0.0"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"chai"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^6.2.2"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"commitlint"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^20.3.1"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"concurrently"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^9.2.1"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"conventional-changelog"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^7.1.1"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"cross-env"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^10.1.0"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"css-loader"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^7.1.2"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"dotenv-expand"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^12.0.3"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"eslint"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^8.57.1"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"eslint-config-prettier"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^10.1.8"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"eslint-config-standard"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^17.1.0"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"eslint-plugin-import"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^2.32.0"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"eslint-plugin-jsx-a11y"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^6.10.2"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"eslint-plugin-node"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^11.1.0"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"eslint-plugin-prettier"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^5.5.5"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"eslint-plugin-react"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^7.37.5"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"husky"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^9.1.7"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"jest"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^30.2.0"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"less"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^4.5.1"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"lint-staged"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^16.2.7"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"mocha"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^11.7.5"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"nodemon"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^3.1.11"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"playwright"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^1.57.0"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"pm2"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^6.0.14"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"postcss"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^8.5.6"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"prettier"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^3.8.0"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"puppeteer"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^24.35.0"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"rollup"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^4.55.1"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"rxjs"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^7.8.2"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"sass"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^1.97.2"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"semantic-release"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^25.0.2"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"sinon"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^21.0.1"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"style-loader"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^4.0.0"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"stylus"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^0.64.0"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"supertest"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^7.2.2"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"tailwindcss"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^4.1.18"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"ts-loader"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^9.5.4"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"ts-node"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^10.9.2"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"typescript"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^5.9.3"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"vite"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^7.3.1"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"vitest"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^4.0.17"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"webpack"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^5.104.1"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"webpack-cli"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^6.0.1"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"webpack-dev-server"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^5.2.3"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"zx"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^8.8.5"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span></span><br></div></code></pre></div></div></div></div></details>
<p>ここから、以下のコマンドで node_modules を作成する。</p>
<div class="language-sh codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-sh codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token function" style="color:#d73a49">npm</span><span class="token plain"> i</span></span><br></div></code></pre></div></div>
<p>容量を見てみよう。</p>
<div class="language-sh codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-sh codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">$ </span><span class="token function" style="color:#d73a49">du</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-h</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-d1</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">566M    ./node_modules</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">567M    </span><span class="token builtin class-name">.</span></span><br></div></code></pre></div></div>
<p>これで、小さく大量のファイルが作成されたことがわかる。</p>
<p>node_modules をコピーしてさらに多くのファイルを作成する。</p>
<div class="language-sh codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-sh codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> </span><span class="token for-or-select variable" style="color:#36acaa">i</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">..</span><span class="token number" style="color:#36acaa">59</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">do</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token builtin class-name">echo</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"node_modules.</span><span class="token string variable" style="color:#36acaa">${i}</span><span class="token string" style="color:#e3116c"> をコピー中..."</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">    </span><span class="token function" style="color:#d73a49">cp</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-r</span><span class="token plain"> node_modules </span><span class="token string" style="color:#e3116c">"node_modules.</span><span class="token string variable" style="color:#36acaa">${i}</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token keyword" style="color:#00009f">done</span></span><br></div></code></pre></div></div>
<p>容量を見てみよう。</p>
<div class="language-sh codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-sh codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">$ </span><span class="token function" style="color:#d73a49">du</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-h</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-d1</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">..</span><span class="token plain">.</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">34G     </span><span class="token builtin class-name">.</span></span><br></div></code></pre></div></div>
<p>そこそこ大きい容量となった。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="tarball">tarball<a href="https://www.hikari-dev.com/blog/2026/01/17/x#tarball" class="hash-link" aria-label="tarball への直接リンク" title="tarball への直接リンク" translate="no">​</a></h2>
<p>tarball にする速度を見てみる。</p>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="アーカイブ">アーカイブ<a href="https://www.hikari-dev.com/blog/2026/01/17/x#%E3%82%A2%E3%83%BC%E3%82%AB%E3%82%A4%E3%83%96" class="hash-link" aria-label="アーカイブ への直接リンク" title="アーカイブ への直接リンク" translate="no">​</a></h3>
<div class="language-sh codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-sh codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">$ </span><span class="token function" style="color:#d73a49">time</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">tar</span><span class="token plain"> cf large-pkg.tar large-pkg</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">real    1m19.449s</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">user    0m6.702s</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">sys     0m48.121s</span></span><br></div></code></pre></div></div>
<p>アーカイブ後、26 GiB</p>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="展開">展開<a href="https://www.hikari-dev.com/blog/2026/01/17/x#%E5%B1%95%E9%96%8B" class="hash-link" aria-label="展開 への直接リンク" title="展開 への直接リンク" translate="no">​</a></h3>
<div class="language-sh codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-sh codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">$ </span><span class="token function" style="color:#d73a49">time</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">tar</span><span class="token plain"> xf large-pkg.tar</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">real    2m11.793s</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">user    0m6.906s</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">sys     2m4.183s</span></span><br></div></code></pre></div></div>
<p>アーカイブと展開はそこそこ速い。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="targz">tar.gz<a href="https://www.hikari-dev.com/blog/2026/01/17/x#targz" class="hash-link" aria-label="tar.gz への直接リンク" title="tar.gz への直接リンク" translate="no">​</a></h2>
<p>次に、tar.gz で試す。</p>
<p>tar コマンドはアーカイブするコマンドで、gzip は単一のファイルを圧縮するコマンドだ。これを組み合わせて作成されたのが tar.gz ファイルである。
現在では tar コマンドのみで tar.gz ファイルの圧縮と展開が可能だ。(ほかの圧縮形式も同様)</p>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="圧縮">圧縮<a href="https://www.hikari-dev.com/blog/2026/01/17/x#%E5%9C%A7%E7%B8%AE" class="hash-link" aria-label="圧縮 への直接リンク" title="圧縮 への直接リンク" translate="no">​</a></h3>
<div class="language-sh codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-sh codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">$ </span><span class="token function" style="color:#d73a49">time</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">tar</span><span class="token plain"> czf large-pkg.tar.gz large-pkg</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">real    11m33.942s</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">user    11m18.811s</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">sys     0m55.573s</span></span><br></div></code></pre></div></div>
<p>圧縮後: 5.5 GiB</p>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="展開-1">展開<a href="https://www.hikari-dev.com/blog/2026/01/17/x#%E5%B1%95%E9%96%8B-1" class="hash-link" aria-label="展開 への直接リンク" title="展開 への直接リンク" translate="no">​</a></h3>
<div class="language-sh codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-sh codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">$ </span><span class="token function" style="color:#d73a49">time</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">tar</span><span class="token plain"> xf large-pkg.tar.gz</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">real    3m39.544s</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">user    2m1.189s</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">sys     2m58.317s</span></span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="tar-と-gzip-で展開">tar と gzip で展開<a href="https://www.hikari-dev.com/blog/2026/01/17/x#tar-%E3%81%A8-gzip-%E3%81%A7%E5%B1%95%E9%96%8B" class="hash-link" aria-label="tar と gzip で展開 への直接リンク" title="tar と gzip で展開 への直接リンク" translate="no">​</a></h3>
<div class="language-sh codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-sh codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">$ </span><span class="token function" style="color:#d73a49">time</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">sh</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-c</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'gzip -dc large-pkg.tar.gz | tar xf -'</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">real    3m40.416s</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">user    2m0.272s</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">sys     3m0.043s</span></span><br></div></code></pre></div></div>
<p>速度はほぼ同じ。</p>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="並列で展開-pigz">並列で展開 (pigz)<a href="https://www.hikari-dev.com/blog/2026/01/17/x#%E4%B8%A6%E5%88%97%E3%81%A7%E5%B1%95%E9%96%8B-pigz" class="hash-link" aria-label="並列で展開 (pigz) への直接リンク" title="並列で展開 (pigz) への直接リンク" translate="no">​</a></h3>
<div class="language-sh codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-sh codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">$ </span><span class="token function" style="color:#d73a49">time</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">sh</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-c</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'pigz -dc large-pkg.tar.gz | tar xf -'</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">real    3m53.711s</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">user    1m38.147s</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">sys     4m42.893s</span></span><br></div></code></pre></div></div>
<p>あまり速度は変わんない。ファイルの読み書き速度がボトルネックとなっているようだ。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="bzip2">bzip2<a href="https://www.hikari-dev.com/blog/2026/01/17/x#bzip2" class="hash-link" aria-label="bzip2 への直接リンク" title="bzip2 への直接リンク" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="圧縮-1">圧縮<a href="https://www.hikari-dev.com/blog/2026/01/17/x#%E5%9C%A7%E7%B8%AE-1" class="hash-link" aria-label="圧縮 への直接リンク" title="圧縮 への直接リンク" translate="no">​</a></h3>
<div class="language-sh codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-sh codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">$ </span><span class="token function" style="color:#d73a49">time</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">sh</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-c</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'tar cf - large-pkg.1 | bzip2 &gt; large-pkg.tar.bz2'</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">real    37m22.743s</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">user    28m40.329s</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">sys     3m31.000s</span></span><br></div></code></pre></div></div>
<p>圧縮後: 4.3 GiB</p>
<p>圧縮に時間がかかっているが、圧縮率はそこそこ良い。</p>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="展開-2">展開<a href="https://www.hikari-dev.com/blog/2026/01/17/x#%E5%B1%95%E9%96%8B-2" class="hash-link" aria-label="展開 への直接リンク" title="展開 への直接リンク" translate="no">​</a></h3>
<div class="language-sh codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-sh codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">$ </span><span class="token function" style="color:#d73a49">time</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">sh</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-c</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'bzip2 -dc large-pkg.tar.bz2 | tar xf -'</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">real    11m31.287s</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">user    9m52.644s</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">sys     4m17.974s</span></span><br></div></code></pre></div></div>
<p>展開も時間はかかるが、展開率はそこそこ良い。</p>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="xz">xz<a href="https://www.hikari-dev.com/blog/2026/01/17/x#xz" class="hash-link" aria-label="xz への直接リンク" title="xz への直接リンク" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="圧縮-2">圧縮<a href="https://www.hikari-dev.com/blog/2026/01/17/x#%E5%9C%A7%E7%B8%AE-2" class="hash-link" aria-label="圧縮 への直接リンク" title="圧縮 への直接リンク" translate="no">​</a></h3>
<div class="language-sh codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-sh codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">$ </span><span class="token function" style="color:#d73a49">time</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">sh</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-c</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'tar cf - large-pkg | xz &gt; large-pkg.tar.xz'</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">real    125m31.447s</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">user    124m10.523s</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">sys     5m18.330s</span></span><br></div></code></pre></div></div>
<p>圧縮後: 3.3 GiB</p>
<p>圧縮率は極めて優秀だが、時間がかかりすぎる。</p>
<p>ネット回線が非常に遅く、ストレージ料金が高く、数年に1度使うようなレアケースではいいかも。</p>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="展開-3">展開<a href="https://www.hikari-dev.com/blog/2026/01/17/x#%E5%B1%95%E9%96%8B-3" class="hash-link" aria-label="展開 への直接リンク" title="展開 への直接リンク" translate="no">​</a></h3>
<div class="language-sh codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-sh codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">$ </span><span class="token function" style="color:#d73a49">time</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">sh</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-c</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'xz -dc large-pkg.tar.xz | tar xf -'</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">real    8m11.527s</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">user    3m45.562s</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">sys     7m15.109s</span></span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="lz4">LZ4<a href="https://www.hikari-dev.com/blog/2026/01/17/x#lz4" class="hash-link" aria-label="LZ4 への直接リンク" title="LZ4 への直接リンク" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="圧縮-3">圧縮<a href="https://www.hikari-dev.com/blog/2026/01/17/x#%E5%9C%A7%E7%B8%AE-3" class="hash-link" aria-label="圧縮 への直接リンク" title="圧縮 への直接リンク" translate="no">​</a></h3>
<div class="language-sh codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-sh codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">$ </span><span class="token function" style="color:#d73a49">time</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">sh</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-c</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'tar cf - large-pkg | lz4 &gt; large-pkg.tar.lz4'</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">real    3m33.187s</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">user    0m53.958s</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">sys     2m57.122s</span></span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="展開-4">展開<a href="https://www.hikari-dev.com/blog/2026/01/17/x#%E5%B1%95%E9%96%8B-4" class="hash-link" aria-label="展開 への直接リンク" title="展開 への直接リンク" translate="no">​</a></h3>
<div class="language-sh codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-sh codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">$ </span><span class="token function" style="color:#d73a49">time</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">sh</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-c</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'lz4 -dc large-pkg.tar.lz4 | tar xf -'</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">real    4m46.576s</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">user    0m32.174s</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">sys     4m36.055s</span></span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_DVDF" id="zstd">zstd<a href="https://www.hikari-dev.com/blog/2026/01/17/x#zstd" class="hash-link" aria-label="zstd への直接リンク" title="zstd への直接リンク" translate="no">​</a></h2>
<p>Meta (旧 Facebook) が開発した高速の圧縮方式。</p>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="圧縮-4">圧縮<a href="https://www.hikari-dev.com/blog/2026/01/17/x#%E5%9C%A7%E7%B8%AE-4" class="hash-link" aria-label="圧縮 への直接リンク" title="圧縮 への直接リンク" translate="no">​</a></h3>
<div class="language-sh codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-sh codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">$ </span><span class="token function" style="color:#d73a49">time</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">sh</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-c</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'tar cf - large-pkg | zstd -T0 -o large-pkg.tar.zst'</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">/*stdin*</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">            </span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">18.57</span><span class="token plain">%   </span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">27492075520</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5106239218</span><span class="token plain"> bytes, large-pkg.tar.zst</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">real    9m13.819s</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">user    1m45.049s</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">sys     2m43.609s</span></span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_DVDF" id="展開-5">展開<a href="https://www.hikari-dev.com/blog/2026/01/17/x#%E5%B1%95%E9%96%8B-5" class="hash-link" aria-label="展開 への直接リンク" title="展開 への直接リンク" translate="no">​</a></h3>
<div class="language-sh codeBlockContainer_LUYH theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_XysQ"><pre tabindex="0" class="prism-code language-sh codeBlock_HQpb thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_Xxbg codeBlockLinesWithNumbering_ryYP" style="counter-reset:line-count 0"><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">$ </span><span class="token function" style="color:#d73a49">time</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">sh</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-c</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'zstd -dc large-pkg.tar.zst | tar xf -'</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">large-pkg.tar.zst   </span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">27492075520</span><span class="token plain"> bytes</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">real    3m46.419s</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">user    0m46.533s</span></span><br></div><div class="token-line codeLine_nxDQ" style="color:#393A34"><span class="codeLineNumber_Q10f"></span><span class="codeLineContent_I2vs"><span class="token plain">sys     3m34.668s</span></span><br></div></code></pre></div></div>]]></content:encoded>
        </item>
    </channel>
</rss>